Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
67389f7
created new rails api
nidhiparixitpatel May 14, 2019
397dc42
added customer and movie model
nidhiparixitpatel May 14, 2019
8841352
rails setup
Kimberly-Fasbender May 14, 2019
e984eb2
merge conflict - ruby version
Kimberly-Fasbender May 14, 2019
9d677dc
gemfile update ruby version
Kimberly-Fasbender May 14, 2019
d54c71d
gemfile.lock ruby version merge conflict
Kimberly-Fasbender May 14, 2019
68f4f65
added rental model
Kimberly-Fasbender May 14, 2019
80d8533
added foreign keys to rental model
Kimberly-Fasbender May 14, 2019
01b7dd0
ruby version taken out
nidhiparixitpatel May 14, 2019
3e913a8
created movies rentals and customers controllers and cleaned up routes
Kimberly-Fasbender May 14, 2019
c70b708
merge conflict - test helper
Kimberly-Fasbender May 14, 2019
94fa52d
fixed ruby version
nidhiparixitpatel May 14, 2019
974cb2f
Merge branch 'master' of https://github.com/Kimberly-Fasbender/VideoS…
nidhiparixitpatel May 14, 2019
1ac6c97
added has many belongs to models
nidhiparixitpatel May 14, 2019
96453aa
added get customers
nidhiparixitpatel May 14, 2019
938465c
created index action and tests for movies controller
Kimberly-Fasbender May 14, 2019
a53152d
Merge branch 'master' of https://github.com/Kimberly-Fasbender/VideoS…
Kimberly-Fasbender May 14, 2019
0b06d15
updated fixutres for movies customers and rentals and updated movie r…
Kimberly-Fasbender May 14, 2019
217cede
testing for customer and rental models relationships
Kimberly-Fasbender May 14, 2019
05fe843
Merge pull request #1 from Kimberly-Fasbender/kf/model_relations_tests
Kimberly-Fasbender May 14, 2019
0864e23
added movies checked out
nidhiparixitpatel May 14, 2019
3578a14
working on customer relation
nidhiparixitpatel May 14, 2019
4f54423
Merge branch 'master' into np/customer
nidhiparixitpatel May 14, 2019
c5f723c
added create action to movies controller
Kimberly-Fasbender May 14, 2019
3f69f9b
added testing for create action in movies controller
Kimberly-Fasbender May 14, 2019
32ab7d5
add tests for get movies path
nidhiparixitpatel May 14, 2019
8800caa
merge conflicts in movie controller and testing
Kimberly-Fasbender May 14, 2019
45b7009
fixed count
nidhiparixitpatel May 14, 2019
1535df7
fixed count in test
nidhiparixitpatel May 14, 2019
2550c17
fixed movie params - weren't matching postman template
Kimberly-Fasbender May 15, 2019
bca9075
Merge branch 'master' of https://github.com/Kimberly-Fasbender/VideoS…
Kimberly-Fasbender May 15, 2019
8a6e299
added checkout to rental
nidhiparixitpatel May 15, 2019
3296671
added check_in action to rental controller
Kimberly-Fasbender May 15, 2019
3d66436
change inventory
nidhiparixitpatel May 15, 2019
f78e1f7
added no available copies for checkout
nidhiparixitpatel May 15, 2019
95b428a
migration to add check_in_date column to rental model
Kimberly-Fasbender May 15, 2019
62ecbb2
added some logic for inventory count which will need to be pulled out…
Kimberly-Fasbender May 15, 2019
e459fc0
moved logic out of rental controller and into model custom methods - …
Kimberly-Fasbender May 15, 2019
40c3fd9
added testing for rentals controller check_in action
Kimberly-Fasbender May 15, 2019
f512e8c
added tests for checkout method in rental controller
nidhiparixitpatel May 15, 2019
826897e
updated custome methods set_check_in and increase_inventory and creat…
Kimberly-Fasbender May 15, 2019
a58fafa
add decrease inventory method in movie model
nidhiparixitpatel May 15, 2019
e9a9f33
deleted unneccessary line from check_in action
Kimberly-Fasbender May 15, 2019
fbeb6ca
merge conflict resolution
Kimberly-Fasbender May 15, 2019
3eb6a6c
Merge pull request #2 from Kimberly-Fasbender/kf/check-in
Kimberly-Fasbender May 15, 2019
f14ed60
merge conflict in routes
Kimberly-Fasbender May 15, 2019
07a051d
removing inventory adjustments from check-in action
Kimberly-Fasbender May 15, 2019
93bbc56
Merge pull request #3 from Kimberly-Fasbender/kf/postman_tests
Kimberly-Fasbender May 15, 2019
05868ff
changed available inventory
nidhiparixitpatel May 15, 2019
c7e7f3c
Merge branch 'master' of https://github.com/Kimberly-Fasbender/VideoS…
nidhiparixitpatel May 15, 2019
ec246d4
fix movies checked out count
nidhiparixitpatel May 15, 2019
ea7acb2
deleted tests that were expecting inventory count to change
Kimberly-Fasbender May 15, 2019
975cb99
added simplecov to gemfile and coverage folder to gitignore
Kimberly-Fasbender May 15, 2019
bf60753
added validation to customer
nidhiparixitpatel May 15, 2019
17a299c
updated testhelper to ignore certain files for simplecov
Kimberly-Fasbender May 15, 2019
c0974f7
Merge pull request #4 from Kimberly-Fasbender/kf/simplecov
Kimberly-Fasbender May 15, 2019
023c52b
added validation test for customer
nidhiparixitpatel May 15, 2019
8249030
validation tests for movie model
Kimberly-Fasbender May 15, 2019
0bc2c5f
Merge branch 'master' into kf/movie_validation_tests
Kimberly-Fasbender May 15, 2019
a8a4274
added test to rental controllers
nidhiparixitpatel May 15, 2019
1f53e9f
Merge branch 'master' of https://github.com/Kimberly-Fasbender/VideoS…
Kimberly-Fasbender May 16, 2019
ba5621c
cleaned up rental controller test
nidhiparixitpatel May 16, 2019
82c2cd8
testing for custom method in movie model
Kimberly-Fasbender May 16, 2019
588e3a7
Merge pull request #5 from Kimberly-Fasbender/kf/movie_validation_tests
Kimberly-Fasbender May 16, 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
27 changes: 27 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# 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

.ruby-version

coverage/*
1 change: 1 addition & 0 deletions .ruby-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ruby-2.5.3
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" }


# 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'
gem 'simplecov'
end
174 changes: 174 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
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)
docile (1.3.1)
erubi (1.8.0)
ffi (1.10.0)
globalid (0.4.2)
activesupport (>= 4.2.0)
i18n (1.6.0)
concurrent-ruby (~> 1.0)
json (2.2.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)
simplecov (0.16.1)
docile (~> 1.1)
json (>= 1.8, < 3)
simplecov-html (~> 0.10.0)
simplecov-html (0.10.2)
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)
simplecov
spring
spring-watcher-listen (~> 2.0.0)
tzinfo-data

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

def index
customers = Customer.all
render json: customers.as_json(only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone], methods: :movies_checked_out_count), status: :ok
end

Choose a reason for hiding this comment

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

I would probably break like 5 across multiple lines for readability.




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 json: movies.as_json(only: [:id, :title, :release_date])
end

def show
movie = Movie.find_by(id: params[:id])
if movie
render json: movie.as_json(only: [:title, :overview, :release_date, :inventory], methods: :available_inventory)
else
render json: { ok: "false", messages: { movie: ["Movie not found"] } }, status: :bad_request
end
end

def create
movie = Movie.new(movie_params)

if movie.save
render json: { id: movie.id }, status: :ok
else
render json: { errors: movie.errors.messages }, status: :bad_request

Choose a reason for hiding this comment

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

The error response on line 22 doesn't match the one in show above (line 12). That one has ok and messages as the keys, but this one sends errors. Best practice is to pick one error reporting format and stick with it.

end
end

private

def movie_params
params.permit(:title, :overview, :release_date, :inventory)
end
end
45 changes: 45 additions & 0 deletions app/controllers/rentals_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
class RentalsController < ApplicationController
def check_in
rental = Rental.find_by(customer_id: params[:customer_id], movie_id: params[:movie_id], check_in_date: nil)

if rental
rental.set_check_in

# include what to do if set_check_in fails?
render json: rental.as_json(only: [:id, :check_in_date]), status: :ok
else
render json: { errors: ["Rental not found"] }, status: :bad_request
end
end

def check_out
error = "No errors found"

customer = Customer.find_by(id: params[:customer_id])
error = "Customer not found" if customer == nil

movie = Movie.find_by(id: params[:movie_id])

Choose a reason for hiding this comment

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

You have a bunch of business logic here! Would it be possible to encapsulate this in a model method? Something like

Rental.check_out(customer_id, movie_id)

might be a good interface. That would make this logic easier to test as well.

error = "Movie not found" if movie == nil
error = "No available copies for checkout" if movie && movie.inventory < 1

if movie && movie.inventory > 0 && customer
rental = Rental.new(check_out_date: Date.today,
due_date: Date.today + 7.days,
movie_id: movie.id,
customer_id: customer.id)
if rental.save
render json: { id: rental.id, inventory: movie.inventory }, status: :ok
else
error = rental.errors.messages
end
else
render json: { errors: error }, status: :bad_request
end
end

private

def rental_params
params.permit(:customer_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
4 changes: 4 additions & 0 deletions app/mailers/application_mailer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
class ApplicationMailer < ActionMailer::Base
default from: 'from@example.com'
layout 'mailer'
end
3 changes: 3 additions & 0 deletions app/models/application_record.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
end
Empty file added app/models/concerns/.keep
Empty file.
8 changes: 8 additions & 0 deletions app/models/customer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
class Customer < ApplicationRecord
has_many :rentals
validates :name, presence: true

def movies_checked_out_count
return Rental.where(check_in_date: nil).count
end

Choose a reason for hiding this comment

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

I love that you made Customer#movies_checked_out_count and Movie#available_inventory methods instead of storing them in the database. That way there's no way to forget to update these values.

end
Loading