Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
9df6e9a
Generate rails app
kdow May 14, 2019
0098722
Zomg controller set
goblineer May 14, 2019
e26a4ab
Add zomg route
kdow May 14, 2019
b09eeff
Sets up model migrations
goblineer May 14, 2019
a2dcb23
Adds validations and relationships
goblineer May 14, 2019
4504875
Corrects data type in movie model
goblineer May 14, 2019
ab242ed
Add movie model relation and validation tests
kdow May 14, 2019
68ce01d
Tests for customer model
goblineer May 14, 2019
8083537
Merge branch 'master' of https://github.com/kdow/VideoStoreAPI
goblineer May 14, 2019
1522609
Tests for rental model
goblineer May 14, 2019
1adc8fb
Tests for rental model
goblineer May 14, 2019
04f3c10
Merge pull request #1 from kdow/kes/rental_tests
goblineer May 14, 2019
0fbef4c
Controller for customers
goblineer May 14, 2019
3dc832e
Add movies routes, index & show actions and tests
kdow May 14, 2019
7918c10
Merge pull request #2 from kdow/movies_api
kdow May 14, 2019
2bdb43f
Merge pull request #3 from kdow/kes/rental_tests
goblineer May 14, 2019
2538612
Adds customer controller and routes for index
goblineer May 14, 2019
dbff9be
Adds create to movies
goblineer May 14, 2019
1a1ab37
Fixes mistyping in create
goblineer May 14, 2019
abcf5a2
Another minute fixy fix
goblineer May 14, 2019
2c27a6b
Creates rental controller
goblineer May 14, 2019
36517d7
Merge pull request #4 from kdow/checkout
goblineer May 14, 2019
4b55883
Adds checkout custom method
goblineer May 14, 2019
e2b7ab7
Add checkin route
kdow May 15, 2019
c2f17cb
Add avail_inv to movies
kdow May 15, 2019
7917b8e
Merge pull request #5 from kdow/migrations
kdow May 15, 2019
0ecf409
Movies Checked Out added to customers
goblineer May 15, 2019
1a237d0
Checkout method added
goblineer May 15, 2019
ea26112
Merge branch 'master' into checkout
goblineer May 15, 2019
7b3f2ba
Merge pull request #6 from kdow/checkout
goblineer May 15, 2019
332ebd5
No idea.
goblineer May 15, 2019
8d5f41f
Unclear.
goblineer May 15, 2019
56f4bb4
Fix migration for customers
goblineer May 15, 2019
c4fe0b0
Add movie and cutomer ids to rental
kdow May 15, 2019
24a5103
Merge pull request #7 from kdow/migrations
kdow May 15, 2019
12b07a0
Fixtures for tests
goblineer May 15, 2019
50a36c9
Merge branch 'master' of https://github.com/kdow/VideoStoreAPI
goblineer May 15, 2019
b1d9c05
Yaml adjustment
goblineer May 15, 2019
f07592b
Revise customer test
kdow May 15, 2019
c0e0818
Fixed a test
goblineer May 15, 2019
cf545ec
Merge branch 'master' of https://github.com/kdow/VideoStoreAPI
goblineer May 15, 2019
301afab
Update finding customer and movie
kdow May 16, 2019
a365fae
Merge pull request #8 from kdow/check-in
kdow May 16, 2019
6ef6d90
Revise checkin action and add tests
kdow May 17, 2019
24ec84b
Merge pull request #9 from kdow/check-in
kdow May 17, 2019
11d4659
Add movie controller tests
kdow May 17, 2019
058d121
Merge pull request #10 from kdow/movies_api
kdow May 17, 2019
d203e60
Not entirely sure.
goblineer May 17, 2019
7665139
Merge
goblineer May 17, 2019
e0f7f02
Clean up merge
kdow May 17, 2019
e765e17
Merge pull request #11 from kdow/check-in
kdow May 17, 2019
47131ec
Checkout method tests
goblineer May 17, 2019
591bc56
Merrrrrge
goblineer May 17, 2019
fdff489
Fix rental checkout done
goblineer May 17, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# See https://help.github.com/articles/ignoring-files for more about ignoring files.
#
# If you find yourself ignoring temporary files generated by your text editor
# or operating system, you probably want to add a global ignore instead:
# git config --global core.excludesfile '~/.gitignore_global'

# Ignore bundler config.
/.bundle

# Ignore all logfiles and tempfiles.
/log/*
/tmp/*
!/log/.keep
!/tmp/.keep

# Ignore uploaded files in development
/storage/*
!/storage/.keep

.byebug_history

# Ignore master key for decrypting credentials and more.
/config/master.key
1 change: 1 addition & 0 deletions .ruby-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ruby-2.5.1
5 changes: 5 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"workbench.colorCustomizations": {
"tab.unfocusedActiveBorder": "#fff0"
}
}
54 changes: 54 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.5.1'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.2.3'
# Use postgresql as the database for Active Record
gem 'pg', '>= 0.18', '< 2.0'
# Use Puma as the app server
gem 'puma', '~> 3.11'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
# gem 'jbuilder', '~> 2.5'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use ActiveStorage variant
# gem 'mini_magick', '~> 4.8'

# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development

# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '>= 1.1.0', require: false

# Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible
# gem 'rack-cors'

group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end

group :development do
gem 'listen', '>= 3.0.5', '< 3.2'
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
end


# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

group :development, :test do
gem 'pry-rails'
end

group :test do
gem 'minitest-rails'
gem 'minitest-reporters'
end
169 changes: 169 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
GEM
remote: https://rubygems.org/
specs:
actioncable (5.2.3)
actionpack (= 5.2.3)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
actionmailer (5.2.3)
actionpack (= 5.2.3)
actionview (= 5.2.3)
activejob (= 5.2.3)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
actionpack (5.2.3)
actionview (= 5.2.3)
activesupport (= 5.2.3)
rack (~> 2.0)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (5.2.3)
activesupport (= 5.2.3)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.3)
activejob (5.2.3)
activesupport (= 5.2.3)
globalid (>= 0.3.6)
activemodel (5.2.3)
activesupport (= 5.2.3)
activerecord (5.2.3)
activemodel (= 5.2.3)
activesupport (= 5.2.3)
arel (>= 9.0)
activestorage (5.2.3)
actionpack (= 5.2.3)
activerecord (= 5.2.3)
marcel (~> 0.3.1)
activesupport (5.2.3)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
ansi (1.5.0)
arel (9.0.0)
bootsnap (1.4.4)
msgpack (~> 1.0)
builder (3.2.3)
byebug (11.0.1)
coderay (1.1.2)
concurrent-ruby (1.1.5)
crass (1.0.4)
erubi (1.8.0)
ffi (1.10.0)
globalid (0.4.2)
activesupport (>= 4.2.0)
i18n (1.6.0)
concurrent-ruby (~> 1.0)
listen (3.1.5)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
ruby_dep (~> 1.2)
loofah (2.2.3)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
mail (2.7.1)
mini_mime (>= 0.1.1)
marcel (0.3.3)
mimemagic (~> 0.3.2)
method_source (0.9.2)
mimemagic (0.3.3)
mini_mime (1.0.1)
mini_portile2 (2.4.0)
minitest (5.11.3)
minitest-rails (3.0.0)
minitest (~> 5.8)
railties (~> 5.0)
minitest-reporters (1.3.6)
ansi
builder
minitest (>= 5.0)
ruby-progressbar
msgpack (1.2.10)
nio4r (2.3.1)
nokogiri (1.10.3)
mini_portile2 (~> 2.4.0)
pg (1.1.4)
pry (0.12.2)
coderay (~> 1.1.0)
method_source (~> 0.9.0)
pry-rails (0.3.9)
pry (>= 0.10.4)
puma (3.12.1)
rack (2.0.7)
rack-test (1.1.0)
rack (>= 1.0, < 3)
rails (5.2.3)
actioncable (= 5.2.3)
actionmailer (= 5.2.3)
actionpack (= 5.2.3)
actionview (= 5.2.3)
activejob (= 5.2.3)
activemodel (= 5.2.3)
activerecord (= 5.2.3)
activestorage (= 5.2.3)
activesupport (= 5.2.3)
bundler (>= 1.3.0)
railties (= 5.2.3)
sprockets-rails (>= 2.0.0)
rails-dom-testing (2.0.3)
activesupport (>= 4.2.0)
nokogiri (>= 1.6)
rails-html-sanitizer (1.0.4)
loofah (~> 2.2, >= 2.2.2)
railties (5.2.3)
actionpack (= 5.2.3)
activesupport (= 5.2.3)
method_source
rake (>= 0.8.7)
thor (>= 0.19.0, < 2.0)
rake (12.3.2)
rb-fsevent (0.10.3)
rb-inotify (0.10.0)
ffi (~> 1.0)
ruby-progressbar (1.10.0)
ruby_dep (1.5.0)
spring (2.0.2)
activesupport (>= 4.2)
spring-watcher-listen (2.0.1)
listen (>= 2.7, < 4.0)
spring (>= 1.2, < 3.0)
sprockets (3.7.2)
concurrent-ruby (~> 1.0)
rack (> 1, < 3)
sprockets-rails (3.2.1)
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
thor (0.20.3)
thread_safe (0.3.6)
tzinfo (1.2.5)
thread_safe (~> 0.1)
websocket-driver (0.7.0)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.3)

PLATFORMS
ruby

DEPENDENCIES
bootsnap (>= 1.1.0)
byebug
listen (>= 3.0.5, < 3.2)
minitest-rails
minitest-reporters
pg (>= 0.18, < 2.0)
pry-rails
puma (~> 3.11)
rails (~> 5.2.3)
spring
spring-watcher-listen (~> 2.0.0)
tzinfo-data

RUBY VERSION
ruby 2.5.1p57

BUNDLED WITH
2.0.1
9 changes: 9 additions & 0 deletions Guardfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
guard :minitest, autorun: false, spring: true do
watch(%r{^app/(.+).rb$}) { |m| "test/#{m[1]}_test.rb" }
watch(%r{^app/controllers/application_controller.rb$}) { 'test/controllers' }
watch(%r{^app/controllers/(.+)_controller.rb$}) { |m| "test/integration/#{m[1]}_test.rb" }
watch(%r{^app/views/(.+)_mailer/.+}) { |m| "test/mailers/#{m[1]}_mailer_test.rb" }
watch(%r{^lib/(.+).rb$}) { |m| "test/lib/#{m[1]}_test.rb" }
watch(%r{^test/.+_test.rb$})
watch(%r{^test/test_helper.rb$}) { 'test' }
end
6 changes: 6 additions & 0 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.

require_relative 'config/application'

Rails.application.load_tasks
4 changes: 4 additions & 0 deletions app/channels/application_cable/channel.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module ApplicationCable
class Channel < ActionCable::Channel::Base
end
end
4 changes: 4 additions & 0 deletions app/channels/application_cable/connection.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module ApplicationCable
class Connection < ActionCable::Connection::Base
end
end
2 changes: 2 additions & 0 deletions app/controllers/application_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class ApplicationController < ActionController::API
end
Empty file added app/controllers/concerns/.keep
Empty file.
13 changes: 13 additions & 0 deletions app/controllers/customers_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
class CustomersController < ApplicationController
def index
list = Customer.all

render json: format_json(list), status: :ok
end

private

def format_json(customer_data)
return customer_data.as_json(only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone, :movies_checked_out_count])
end
end
32 changes: 32 additions & 0 deletions app/controllers/movies_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
class MoviesController < ApplicationController
def index
movies = Movie.all
render json: movies.as_json(only: [:id, :title, :release_date]), status: :ok
end

def show
movie = Movie.find_by(id: params[:id])
if movie
render json: movie.as_json(only: [:title, :overview, :release_date, :inventory, :available_inventory]), status: :ok
else
render json: {errors: ["Movie with id: #{params[:id]} was not found"]}, status: :not_found
end
end

def create
movie = Movie.new(movie_params)
movie.available_inventory = movie.inventory
if movie.save
render json: {id: movie.id}, status: :ok
else
render json: {errors: movie.errors.messages},
status: :bad_request
end
end

private

def movie_params
params.require(:movie).permit(:title, :overview, :release_date, :inventory)
end
end
59 changes: 59 additions & 0 deletions app/controllers/rentals_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
require "pry"

class RentalsController < ApplicationController
def checkout
movie = Movie.find_by(id: rental_params[:movie_id])

if !movie
render json: { "errors": { "movie": ["Movie not found"] } }, status: :bad_request
else
customer = Customer.find_by(id: rental_params[:customer_id])
if !customer
render json: { "errors": { "customer": ["Customer not found"] } }, status: :bad_request
else
checkout_date = Date.today

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Look at how much code is here... This would indicate a good case for a model method.

due_date = checkout_date + 7
rental = Rental.new(customer: customer, checkout_date: checkout_date, due_date: due_date, movie: movie)

if rental.movie.available_inventory > 0
if rental.save
rental.movie.available_inventory -= 1
customer.movies_checked_out_count += 1
customer.save
if !rental.movie.save
render json: { "errors": { "movie": rental.movie.errors.messages } }, status: :bad_request
else
render json: rental.as_json(only: [:id]), status: :ok
end
else
render json: { "errors": { "movie": rental.errors.messages } }, status: :bad_request
end
else
render json: { "errors": { "movie": ["#{movie.title} is out of stock"] } }, status: :bad_request
end
end
end
end

def checkin
customer = Customer.find_by(id: rental_params[:customer_id])
movie = Movie.find_by(id: rental_params[:movie_id])
rental = Rental.find_by(customer_id: rental_params[:customer_id], movie_id: rental_params[:movie_id])

if rental
rental.movie.available_inventory += 1

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This business logic would look lovely in a model.

rental.movie.save
rental.customer.movies_checked_out_count -= 1
rental.customer.save
render json: { id: rental.id }, status: :ok
else
render json: { errors: ["Rental could not be located"] }, status: :not_found
end
end

private

def rental_params
params.permit(:customer_id, :movie_id)
end
end
Loading