Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
d1cd55d
Rails initial setup
paulentine May 14, 2019
41542d0
added routes psueodo draft
qqdipps May 14, 2019
10b457a
Generate customers controller
paulentine May 14, 2019
afc48c2
Test custom route /zomg
paulentine May 14, 2019
e73abe4
model for moview
qqdipps May 14, 2019
b3a0be8
added BASIC validations MIN req
qqdipps May 14, 2019
0b66e82
Generate Customer model & add validations
paulentine May 14, 2019
e059b6c
added migration to schema
qqdipps May 14, 2019
d298736
Merge branch 'master' of https://github.com/paulentine/VideoStoreAPI
paulentine May 14, 2019
d2493f3
Merged schema
paulentine May 14, 2019
4202704
added rental model with foriegn keys
qqdipps May 14, 2019
dab50eb
Fix test_helper
paulentine May 14, 2019
6b38d0a
Add relationships
paulentine May 14, 2019
8acb063
added relationships for movie
qqdipps May 14, 2019
97f7432
Merge branch 'master' of https://github.com/paulentine/VideoStoreAPI
qqdipps May 14, 2019
8bf88c3
set up ymls for rentals and movies
qqdipps May 14, 2019
9ba89e4
Add customers YML
paulentine May 14, 2019
c9265da
Merge branch 'master' of https://github.com/paulentine/VideoStoreAPI
paulentine May 14, 2019
b5e776d
yml testing
qqdipps May 14, 2019
3b2a5a6
finished validations for movie, set up test scaoffold for relationshi…
qqdipps May 14, 2019
20e5bd9
Merge branch 'master' of https://github.com/paulentine/VideoStoreAPI
paulentine May 14, 2019
37caf53
Test Customer validations & relations
paulentine May 14, 2019
f73a4f5
More through relationships test
paulentine May 14, 2019
4ce3d98
Update YML
paulentine May 14, 2019
b8154d6
testing complete for movie model
qqdipps May 14, 2019
07e2216
Merge branch 'master' of https://github.com/paulentine/VideoStoreAPI
qqdipps May 14, 2019
acb93cf
added extra test to movie model, setup test scaffolding to rental mod…
qqdipps May 14, 2019
dc1f872
added relationships tests for rentals
qqdipps May 14, 2019
4c4bdec
More thorough testing
paulentine May 14, 2019
07666f8
Merge branch 'customer'
paulentine May 14, 2019
534462a
added routes
qqdipps May 14, 2019
b3249f3
Add route for Customers Index
paulentine May 14, 2019
48a6d6f
merge conflict resolved
qqdipps May 14, 2019
023993e
Add movies_checked_out_count column to Customers
paulentine May 14, 2019
863f766
added migration to include available_inventory on movies, updated see…
qqdipps May 14, 2019
8ec9ef3
updated movies inventory
qqdipps May 14, 2019
6c955b2
Merge schema changes
paulentine May 14, 2019
80d2e00
Merge branch 'master' of https://github.com/paulentine/VideoStoreAPI
qqdipps May 14, 2019
7ad416e
Update Customers YML to reflect new column
paulentine May 14, 2019
aa82de8
updated movie model and tests, and movie yml
qqdipps May 14, 2019
1cb1272
Merge branch 'master' of https://github.com/paulentine/VideoStoreAPI
qqdipps May 14, 2019
0ace69e
Update validation & model validation test
paulentine May 14, 2019
4f7db6c
added tests for controller movie index action
qqdipps May 14, 2019
0999c6e
Test Customers Controller Index
paulentine May 14, 2019
5fb5454
Merge branch 'master' of https://github.com/paulentine/VideoStoreAPI
paulentine May 14, 2019
534667a
added routes for next stuffs
qqdipps May 14, 2019
ca02b88
Add movie create action & strong params
paulentine May 14, 2019
7fb28e6
Update strong params
paulentine May 14, 2019
ee4e8da
Set available_inventory
paulentine May 14, 2019
a23d09a
added show fiq out error
qqdipps May 14, 2019
9f6881b
Merge branch 'show_b'
qqdipps May 14, 2019
bbfe469
Remove require(:movie) from strong params
paulentine May 14, 2019
54813b1
Test movie #create success & failure
paulentine May 14, 2019
630a211
More throrough movies #create tests
paulentine May 15, 2019
3a173cd
Generate Rentals Controller
paulentine May 15, 2019
49b1861
Add check-out & check-in routes
paulentine May 15, 2019
b30f1a2
Renamed methods (without dash)
paulentine May 15, 2019
17cb4b9
setup error message
qqdipps May 15, 2019
07f8d58
Merge branch 'master' of https://github.com/paulentine/VideoStoreAPI
qqdipps May 15, 2019
4a7713e
strong params for rentals
qqdipps May 15, 2019
f3438a9
Migration: Add due_date column to Rentals
paulentine May 15, 2019
e8c69ad
Add Rentals checkout action
paulentine May 15, 2019
ab68f98
workingon checkin controller
qqdipps May 15, 2019
3228b36
resolved merge conflict
qqdipps May 15, 2019
128bc17
Add path helpers for checkin & checkout
paulentine May 15, 2019
50e4661
Add colons
paulentine May 15, 2019
ad45eba
Handles cases if movie / customer is nil
paulentine May 15, 2019
a8fb87d
Test Rentals checkout action
paulentine May 15, 2019
fe31803
added tests for controller action rentals#checkin
qqdipps May 15, 2019
6fb19d6
merge conflict
qqdipps May 15, 2019
dbedf4d
merge conflict
qqdipps May 15, 2019
db17eff
added tests for show
qqdipps May 15, 2019
84d77f3
formatting update
qqdipps May 15, 2019
7681979
added negative test case for 0 movies on index
qqdipps May 15, 2019
f400575
added movies controller neg test for index
qqdipps May 15, 2019
de8e10c
Add negative test case for Customer #index
paulentine May 15, 2019
bcf361c
Merge branch 'master' of https://github.com/paulentine/VideoStoreAPI
paulentine May 15, 2019
a168ede
finished adding neg test for movies
qqdipps May 15, 2019
093a05d
Merge branch 'master' of https://github.com/paulentine/VideoStoreAPI
qqdipps May 15, 2019
a34e474
Test updated attributes for checkout action
paulentine May 15, 2019
83b5240
Merge branch 'master' of https://github.com/paulentine/VideoStoreAPI
paulentine May 15, 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
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
1.16.6
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.
6 changes: 6 additions & 0 deletions app/controllers/customers_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
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
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: [:id, :title, :release_date, :available_inventory, :inventory, :overview]), status: :ok
else
render json: { errors: { movie: ["No movie by this id 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.permit(:title, :overview, :release_date, :inventory)
end
end
44 changes: 44 additions & 0 deletions app/controllers/rentals_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# frozen_string_literal: true

class RentalsController < ApplicationController
def checkout
rental = Rental.new(rental_params)
rental.save

if rental.movie && rental.customer
Copy link

Choose a reason for hiding this comment

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

Nice conditional check!

rental.movie.available_inventory -= 1
rental.movie.save
rental.customer.movies_checked_out_count += 1
rental.customer.save
rental.due_date = rental.created_at + 7
Copy link

Choose a reason for hiding this comment

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

I think it would be really interesting to move most of this logic into an instance method in Rental. Imagine rental having a method named checkout:

def checkout
  self.movie.available_inventory -= 1
  self.customer.movies_checked_out_count += 1
  self.due_date = self.created_at + 7
end

and then the lines about rental.movie.save etc stayed in here. I feel that it's a lot cleaner!

end

if rental.save
render json: rental.as_json(only: %i[customer_id movie_id]), status: :ok
else
render json: { errors: rental.errors.messages },
status: :bad_request
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 customer && movie && rental
Copy link

Choose a reason for hiding this comment

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

Nice!

rental.destroy
movie.update(available_inventory: movie.available_inventory + 1)
customer.update(movies_checked_out_count: customer.movies_checked_out_count - 1)
Copy link

Choose a reason for hiding this comment

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

Even if they are slim methods, it might be cool to have a small method in movie that named update_inventory that held the logic about incrementing its inventory. Same for customer

render json: { status: :ok }
else
render json: { errors: { rental: ["Rental not found for customer ID #{rental_params[:customer_id]}, and movie ID #{rental_params[:movie_id]}"] } },
status: :not_found
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.
10 changes: 10 additions & 0 deletions app/models/customer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class Customer < ApplicationRecord
has_many :rentals
has_many :movies, through: :rentals

validates :name, presence: true
validates :registered_at, presence: true
validates :postal_code, presence: true
validates :phone, presence: true
validates :movies_checked_out_count, presence: true
end
Loading