Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
cfbd01a
new project
Jcornick21 May 7, 2018
24161f5
Schema etc
MississippiBrenn May 7, 2018
b15fc44
Remove the suspicious schema file
Jcornick21 May 7, 2018
45aca21
initial models, testing, controllers
MississippiBrenn May 7, 2018
0dbf050
Customer tests passing
brandyaustinseattle May 7, 2018
d008053
basic tests passing for movie model
Jcornick21 May 7, 2018
295af64
Merge branch 'master' of https://github.com/Jcornick21/VideoStoreAPI
Jcornick21 May 7, 2018
5e3415d
initial controller methods
MississippiBrenn May 7, 2018
c273efe
Added create method to movies_controller.rb
MississippiBrenn May 7, 2018
8a42a8d
Controller tests
brandyaustinseattle May 7, 2018
fef80bb
Merge branch 'master' of https://github.com/Jcornick21/VideoStoreAPI
brandyaustinseattle May 7, 2018
d29874a
Added ids and fixed movie controller methods to show requested stuff
brandyaustinseattle May 8, 2018
f74a907
added available_inventory
MississippiBrenn May 8, 2018
b8f512d
Added id
brandyaustinseattle May 8, 2018
d138614
made available inventory show
Jcornick21 May 8, 2018
d6d8efb
added column for checked out movies to customers and modified controller
Jcornick21 May 8, 2018
7c7b54d
fix for rentals ghost model
Jcornick21 May 8, 2018
e3c63a7
Fixed params
brandyaustinseattle May 8, 2018
2c54d52
Adding changes
MississippiBrenn May 8, 2018
e28edc8
merging
MississippiBrenn May 8, 2018
0d5d9a7
Tests for customers index function
brandyaustinseattle May 8, 2018
a48f2a7
Show Tests
MississippiBrenn May 8, 2018
984e21d
Merge
MississippiBrenn May 8, 2018
bc8b387
movies controller tests passing
Jcornick21 May 8, 2018
5fb3cfc
resolving merge conflict
Jcornick21 May 8, 2018
0c0ef7f
resolving merge conflict
Jcornick21 May 8, 2018
006c635
Rabl
MississippiBrenn May 8, 2018
cc3cdb2
Rabl working and all test passing
brandyaustinseattle May 8, 2018
2098fe5
stuff
Jcornick21 May 8, 2018
57f0f6c
Merge branch 'master' of https://github.com/Jcornick21/VideoStoreAPI
Jcornick21 May 8, 2018
d835256
Added rentals table and relationships
brandyaustinseattle May 8, 2018
a73a2d6
Merge branch 'master' of https://github.com/Jcornick21/VideoStoreAPI
Jcornick21 May 8, 2018
0b9ea38
routes? rental controller
Jcornick21 May 8, 2018
7cf9f9b
Routes
brandyaustinseattle May 8, 2018
1e4eb65
rentals routes modified rental controller
Jcornick21 May 8, 2018
8a08d6b
Routes
brandyaustinseattle May 8, 2018
4dbfa70
Checkout in progress, params existing
brandyaustinseattle May 8, 2018
a4d43e9
check_params added
brandyaustinseattle May 8, 2018
f2b70e5
Added checkout method
brandyaustinseattle May 9, 2018
9f08263
Controller for Checkin
MississippiBrenn May 9, 2018
d9a48dd
rental model possible validation and tests
Jcornick21 May 9, 2018
7320155
Merge branch 'master' of https://github.com/Jcornick21/VideoStoreAPI
Jcornick21 May 9, 2018
d4047fd
tried writing rentals model validation some tests for that and logic …
Jcornick21 May 9, 2018
cc84c68
Merge branch 'master' of github.com:Jcornick21/VideoStoreAPI
MississippiBrenn May 9, 2018
0d4a369
Merge branch 'master' of github.com:Jcornick21/VideoStoreAPI
MississippiBrenn May 9, 2018
5f411dc
fix checkout method
brandyaustinseattle May 9, 2018
9b21c8c
reviewing movie model methods
brandyaustinseattle May 9, 2018
ce2d4f3
Checkout method
MississippiBrenn May 9, 2018
9bf00b7
Checkout
MississippiBrenn May 9, 2018
fac7dd0
adding again
MississippiBrenn May 9, 2018
24c40ff
stuff
brandyaustinseattle May 9, 2018
ece389e
pushing to change drivers
MississippiBrenn May 9, 2018
d1debf0
stuff
brandyaustinseattle May 9, 2018
af20364
trying to pull
Jcornick21 May 9, 2018
29773cb
stuff stuff
brandyaustinseattle May 9, 2018
6b62423
resolving merge conflict
Jcornick21 May 9, 2018
89b8d40
checkin working
brandyaustinseattle May 9, 2018
20a098b
consolidated check view
brandyaustinseattle May 9, 2018
881a983
resolve conflict
brandyaustinseattle May 9, 2018
b481f07
minor edits to checkin/checkout
brandyaustinseattle May 9, 2018
f0c5087
Tests passing
brandyaustinseattle May 9, 2018
a7b4b03
working on rental controller tests for check_in method
Jcornick21 May 10, 2018
395231b
resolving merge conflict
Jcornick21 May 10, 2018
5a386a4
added tests to rental_test.rb
brandyaustinseattle May 10, 2018
3c84c70
Added tests to rentals_controller
brandyaustinseattle May 10, 2018
76da64d
Rentals controller tests
brandyaustinseattle May 10, 2018
05d9411
rental controller checkin method tests
Jcornick21 May 11, 2018
b426f7d
still trying to get tests to pass
Jcornick21 May 11, 2018
72f43ee
Checkout tests passing
brandyaustinseattle May 11, 2018
488c438
Add rental.nil? to checkin method
brandyaustinseattle May 11, 2018
00e24ac
Fixed missing @
brandyaustinseattle May 11, 2018
0bb1595
fixing tests
Jcornick21 May 11, 2018
1905f82
Merge branch 'master' of https://github.com/Jcornick21/VideoStoreAPI
Jcornick21 May 11, 2018
f102b2c
Added can't checkout when no available copies
brandyaustinseattle May 11, 2018
d6ad444
rental controller tests passing
Jcornick21 May 11, 2018
c0468e9
resolving merge conflicts
Jcornick21 May 11, 2018
5d84f98
Moved some logic to the controller
brandyaustinseattle May 11, 2018
719a12d
Moved logic to controller
brandyaustinseattle May 11, 2018
a93e03e
Put process_checkin in rental model
brandyaustinseattle May 11, 2018
fae40f7
added test for movie model
Jcornick21 May 11, 2018
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
Binary file added .DS_Store
Binary file not shown.
16 changes: 16 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# 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

.byebug_history
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) do |repo_name|
repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
"https://github.com/#{repo_name}.git"
end


# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.1.6'
# Use postgresql as the database for Active Record
gem 'pg', '>= 0.18', '< 2.0'
# Use Puma as the app server
gem 'puma', '~> 3.7'
# 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 Capistrano for deployment
# gem 'capistrano-rails', group: :development

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

gem 'rabl'
gem 'oj'
gem 'jbuilder', '~> 2.5'

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
164 changes: 164 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
GEM
remote: https://rubygems.org/
specs:
actioncable (5.1.6)
actionpack (= 5.1.6)
nio4r (~> 2.0)
websocket-driver (~> 0.6.1)
actionmailer (5.1.6)
actionpack (= 5.1.6)
actionview (= 5.1.6)
activejob (= 5.1.6)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
actionpack (5.1.6)
actionview (= 5.1.6)
activesupport (= 5.1.6)
rack (~> 2.0)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (5.1.6)
activesupport (= 5.1.6)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.3)
activejob (5.1.6)
activesupport (= 5.1.6)
globalid (>= 0.3.6)
activemodel (5.1.6)
activesupport (= 5.1.6)
activerecord (5.1.6)
activemodel (= 5.1.6)
activesupport (= 5.1.6)
arel (~> 8.0)
activesupport (5.1.6)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
ansi (1.5.0)
arel (8.0.0)
builder (3.2.3)
byebug (10.0.2)
coderay (1.1.2)
concurrent-ruby (1.0.5)
crass (1.0.4)
erubi (1.7.1)
ffi (1.9.23)
globalid (0.4.1)
activesupport (>= 4.2.0)
i18n (1.0.1)
concurrent-ruby (~> 1.0)
jbuilder (2.7.0)
activesupport (>= 4.2.0)
multi_json (>= 1.2)
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.2)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
mail (2.7.0)
mini_mime (>= 0.1.1)
method_source (0.9.0)
mini_mime (1.0.0)
mini_portile2 (2.3.0)
minitest (5.11.3)
minitest-rails (3.0.0)
minitest (~> 5.8)
railties (~> 5.0)
minitest-reporters (1.2.0)
ansi
builder
minitest (>= 5.0)
ruby-progressbar
multi_json (1.13.1)
nio4r (2.3.1)
nokogiri (1.8.2)
mini_portile2 (~> 2.3.0)
oj (3.6.0)
pg (1.0.0)
pry (0.11.3)
coderay (~> 1.1.0)
method_source (~> 0.9.0)
pry-rails (0.3.6)
pry (>= 0.10.4)
puma (3.11.4)
rabl (0.13.1)
activesupport (>= 2.3.14)
rack (2.0.5)
rack-test (1.0.0)
rack (>= 1.0, < 3)
rails (5.1.6)
actioncable (= 5.1.6)
actionmailer (= 5.1.6)
actionpack (= 5.1.6)
actionview (= 5.1.6)
activejob (= 5.1.6)
activemodel (= 5.1.6)
activerecord (= 5.1.6)
activesupport (= 5.1.6)
bundler (>= 1.3.0)
railties (= 5.1.6)
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.1.6)
actionpack (= 5.1.6)
activesupport (= 5.1.6)
method_source
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rake (12.3.1)
rb-fsevent (0.10.3)
rb-inotify (0.9.10)
ffi (>= 0.5.0, < 2)
ruby-progressbar (1.9.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.1)
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.0)
thread_safe (0.3.6)
tzinfo (1.2.5)
thread_safe (~> 0.1)
websocket-driver (0.6.5)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.3)

PLATFORMS
ruby

DEPENDENCIES
byebug
jbuilder (~> 2.5)
listen (>= 3.0.5, < 3.2)
minitest-rails
minitest-reporters
oj
pg (>= 0.18, < 2.0)
pry-rails
puma (~> 3.7)
rabl
rails (~> 5.1.6)
spring
spring-watcher-listen (~> 2.0.0)
tzinfo-data

BUNDLED WITH
1.16.1
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.
26 changes: 26 additions & 0 deletions app/controllers/customers_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
class CustomersController < ApplicationController

def index
@customers = Customer.all
render :index, status: :ok
end

def show
@customer = Customer.find_by(id: cust_params[:id])
if @customer.nil?
render json: {

Choose a reason for hiding this comment

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

While this works, you don't typically use strong params for URL parameters.

errors: {
id: ["No customer with ID #{cust_params[:id]}"]
}
}, status: :not_found
else
render :show, status: :ok
end
end

private
def cust_params
params.permit(:id)
end

end
31 changes: 31 additions & 0 deletions app/controllers/movies_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
class MoviesController < ApplicationController

def index
@movies = Movie.all
render :index, status: :ok
end

def show
@movie = Movie.find_by(id: movie_params[:id])
if @movie.nil?
render json: {
errors: {
id: ["No movie with ID #{movie_params[:id]}"]

Choose a reason for hiding this comment

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

This is a good example of well-done error handling.

}
}, status: :not_found
else
render :show, status: :ok
end
end

def create
@movie = Movie.new(movie_params)
@movie.save!
render :create, status: :ok

Choose a reason for hiding this comment

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

Using bang (!) methods works great for the console or scripts like the seed file, but in your actual controller actions you should be calling the non-bang version and checking the result. As-is, this will produce an exception rather than a helpful error message, which is not a good user experience.

Something like this would be more appropriate:

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

end

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

class RentalsController < ApplicationController
def checkout
customer_id = check_params[:customer_id]
movie_id = check_params[:movie_id]

find_customer_and_movie(customer_id, movie_id)

Choose a reason for hiding this comment

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

I like the idea of moving the shared logic to find the customer and the movie into a helper method. Why not take it a step further and make it a controller filter?


errors = Rental.check_dependencies(@customer, @movie)

if errors
render json: {errors: errors}, status: :not_found
else

@rental = Rental.create_checkout(@customer, @movie)

if @rental.save

Rental.process_checkout(@customer, @movie)

Choose a reason for hiding this comment

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

This dance of checking the dependencies, creating the rentals, and then updating the dependent models is pretty complicated - it might make sense to encapsulate the whole thing in a model method. One thing that might help is using a transaction - go look this up!


render :check, status: :ok

else
render json: {errors: { unknown: ["Something went wrong"]}}, status: :bad_request
end
end

end

def checkin

customer_id = check_params[:customer_id]
movie_id = check_params[:movie_id]

find_customer_and_movie(customer_id, movie_id)

@rental = find_rental(customer_id, movie_id)


if @rental.nil?

render json: {errors: {id: ["No such rental with customer ID #{check_params[:customer_id]} and movie ID #{check_params[:movie_id]}"]}}, status: :not_found
return
end

@rental.checkin_date = Date.today
@rental.save

customer = Customer.find_by(id: @rental.customer_id)
movie = Movie.find_by(id: @rental.movie_id)

if @rental.save

Rental.process_checkin(customer, movie)

render :check, status: :ok
else
render json: { errors: @rental.errors.messages }, status: :bad_request
end

end

private
def check_params
params.permit(:customer_id, :movie_id)
end

def find_customer_and_movie(customer_id, movie_id)
@customer = Customer.find_by(id: customer_id)
@movie = Movie.find_by(id: movie_id)
end

def find_rental(customer_id, movie_id)
@rental = Rental.find_by(customer_id: customer_id, movie_id: movie_id)
end
end
2 changes: 2 additions & 0 deletions app/jobs/application_job.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class ApplicationJob < ActiveJob::Base
end
Loading