Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
4e6c4e9
initial commit
aphunk May 14, 2019
1cbf971
generate customers, movies, rentals model
aphunk May 14, 2019
a369822
seed db
aphunk May 14, 2019
72b4a0d
added controllers and validations
amyesh May 14, 2019
da5ac64
added validation tests for all models
amyesh May 14, 2019
0e7087f
added foreign keys to rental
amyesh May 14, 2019
6327dcd
added foreign keys again
amyesh May 14, 2019
9f3d9bb
fix relationship tests
aphunk May 14, 2019
8d697ba
finish wave 1
aphunk May 14, 2019
0855cfb
add movies and customer routes
aphunk May 14, 2019
7ddf95d
Merge pull request #1 from aphunk/ap/movies_CRUD_actions
aphunk May 14, 2019
3e3aab0
movies CRUD tests
aphunk May 15, 2019
80a8be0
complete Movies controller tests
aphunk May 15, 2019
b308f67
add a lil' more to Movies index test
aphunk May 15, 2019
f558664
add whitespace
aphunk May 15, 2019
be716b9
update movie index return fields to match project requirements
aphunk May 15, 2019
66fad3e
update test to reflect returned fields requirement
aphunk May 15, 2019
a776f56
renders Movie ID when a new movie is created
aphunk May 15, 2019
19608e6
finished tests and methods to customer controller
amyesh May 15, 2019
8bf2d98
test that a BAD REQUEST is still returned as JSON
aphunk May 15, 2019
208d9b1
putzin' around in show tests
aphunk May 15, 2019
744d482
Merge pull request #3 from aphunk/am_customercrud
aphunk May 15, 2019
a910a60
removed show and create methods from customers controller
amyesh May 15, 2019
8bc48b8
Merge pull request #2 from aphunk/ap/movies_CRUD_actions
amyesh May 15, 2019
4f9d657
Merge pull request #4 from aphunk/am_customercrud
amyesh May 15, 2019
9a6992b
add rental relationship test
aphunk May 15, 2019
502da99
added custom method and controller method and tests to set available …
amyesh May 15, 2019
7c454ea
added tests to set available inventory
amyesh May 15, 2019
5ea2873
Merge pull request #5 from aphunk/setting_avail_inventory
aphunk May 15, 2019
efcea08
added tests for rental checkin
amyesh May 15, 2019
eb5a538
add rentals controller tests
aphunk May 15, 2019
f413c21
complete checkout tests
aphunk May 16, 2019
f890283
Due date test in rental model
aphunk May 16, 2019
80fea82
Merge branch 'master' into ap/rentals_model_and_tests
aphunk May 16, 2019
7d88f98
wrote rental checkin method
amyesh May 16, 2019
c5026d3
Merge pull request #6 from aphunk/ap/rentals_model_and_tests
amyesh May 16, 2019
c10be16
Merge branch 'master' into checkin
aphunk May 16, 2019
093812b
Merge pull request #7 from aphunk/checkin
aphunk May 16, 2019
2b7a69f
added end
amyesh May 16, 2019
1a98370
remove due date validation on rental model
aphunk May 16, 2019
f3ee8e3
Merge pull request #8 from aphunk/ap/rentals_model_and_tests
aphunk May 16, 2019
9b01231
mollified postMAN
aphunk May 16, 2019
c3bf32d
refactor set_due_date method to pass smoke tests
aphunk May 16, 2019
ce78c25
fix due date model test
aphunk 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
Binary file added .DS_Store
Binary file not shown.
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.3.7
1 change: 1 addition & 0 deletions .rvmc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
rvm_silence_path_mismatch_check_flag=1
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
166 changes: 166 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
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

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.
7 changes: 7 additions & 0 deletions app/controllers/customers_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
class CustomersController < ApplicationController
def index
customers = Customer.all
render json: customers.as_json(only: [:id, :name, :registered_at, :postal_code, :phone, :movies_checked_out_count]),
status: :ok
end
end
35 changes: 35 additions & 0 deletions app/controllers/movies_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
class MoviesController < ApplicationController
def index
movies = Movie.all
render status: :ok, json: movies.as_json(only: [:id, :title, :release_date])
end

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

if movie
render status: :ok, json: movie.as_json(only: [ :title, :overview, :release_date, :inventory, :available_inventory ])
else
render status: :bad_request, json: [{ error: "Unable to find movie" }]
end
end

def create
movie = Movie.new(movie_params)
if movie.available_inventory.nil?
movie.set_available_inventory
end
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.permit(:title, :overview, :release_date, :inventory, :available_inventory)
end
end
30 changes: 30 additions & 0 deletions app/controllers/rentals_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
class RentalsController < ApplicationController

def checkin
rental = Rental.find_by(customer_id: rental_params[:customer_id], movie_id: rental_params[:movie_id])

Choose a reason for hiding this comment

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

How is this changing the Rental status? There's no way to tell in the DB if the rental was checked in!

if rental
render json: {id: rental.id, movie_id: rental.movie.id, customer_id: rental.customer.id}, status: :ok
else
render json: [{errors: {rental: ["Rental not found for customer #{rental_params[:customer_id]}, and movie #{rental_params[:movie_id]}"]}}],

Choose a reason for hiding this comment

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

This line is a bit long, feel free to put in line breaks to make this more readable.

status: :not_found
end
end

def checkout
rental = Rental.new(rental_params)

if rental.save
rental.set_due_date
render json: [{ id: rental.id, movie_id: rental.movie.id, customer_id: rental.customer.id, due_date: rental.due_date }], status: :ok

Choose a reason for hiding this comment

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

This line is also long. You also need to have some impact on the available inventories.

else
render json: [{ errors: rental.errors.messages }],
status: :bad_request
end
end


private
def rental_params
params.require(:rental).permit(:movie_id, :customer_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.
7 changes: 7 additions & 0 deletions app/models/customer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
class Customer < ApplicationRecord
has_many :rentals

Choose a reason for hiding this comment

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

So no method to tell how many movies they have checked out.

validates :name, presence: true
validates :registered_at, presence: true
validates :phone, presence: true
end
12 changes: 12 additions & 0 deletions app/models/movie.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
class Movie < ApplicationRecord
has_many :rentals

validates :title, presence: true
validates :inventory, numericality: true
validates :overview, presence: true
validates :release_date, presence: true

def set_available_inventory

Choose a reason for hiding this comment

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

There are ways in Rails to invoke this method when a Movie is created, saved or updated.

self.available_inventory = self.inventory
end
end
Loading