Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
b0681d0
Cloned repo and created rails new.
Lindseyls May 7, 2018
71285ec
Created customer, movie and rental models
cmn53 May 7, 2018
1621cf2
Added relations between movies, customers, and models
cmn53 May 7, 2018
08edfcc
Updated the movies_controller.rb, created the movies fixture file, an…
Lindseyls May 7, 2018
0b1e939
Updated customer controller#index, created customer fixtures, and upd…
cmn53 May 7, 2018
9d38d52
Added validations to movie.rb model and wrote validation and relation…
cmn53 May 7, 2018
6bd3b8b
Updated the models for customer and completed the testing
Lindseyls May 7, 2018
932d887
Updated the rentals controller and testing for the new controller#che…
Lindseyls May 7, 2018
3de9c7f
Started validations for rental model and added validated timeliness g…
cmn53 May 7, 2018
80ceded
Implemented validations on rental model using the timeliness gem. Wro…
cmn53 May 8, 2018
aedc7f2
Updated the relationship testing for rentals
Lindseyls May 8, 2018
c1e61d7
Generated migrations to add inventory and checkout values to customer…
Lindseyls May 8, 2018
889a236
Updated the movie model with custom business logic to calculate the i…
Lindseyls May 8, 2018
cf598bf
Added custom business logic to customer.rb and wrote tests for update…
cmn53 May 8, 2018
21c2b4c
Updated rental#check_out controller method to use new movie and custo…
cmn53 May 8, 2018
8834009
Created custom method in rental to find the rental with customer and …
Lindseyls May 8, 2018
e6504b1
Working on tests for the customer business logic
Lindseyls May 8, 2018
3003d94
Still working on testing for methods
Lindseyls May 8, 2018
01ea9cf
Added available inventory method to movie.rb and modified movie contr…
cmn53 May 8, 2018
647ef13
Resolved merge conflicts in movie.rb
cmn53 May 8, 2018
622d254
Removed the methods and testing that we had earlier for the columns t…
Lindseyls May 8, 2018
c1de1e1
Modified rental controller and tests
cmn53 May 8, 2018
4bb5330
Updated the rental#check_in method and rental#find_rental method. Upd…
Lindseyls May 8, 2018
2ce25b7
Updated check in controller and tests
cmn53 May 8, 2018
221c5a2
Resolved smoke test issue with movie controller#movie params
Lindseyls May 9, 2018
db98497
Resolved wave 3 smoke tests by changing strong params requirements in…
cmn53 May 9, 2018
2e73569
Modified lots of tests because of changes to strong params in multipl…
cmn53 May 9, 2018
c9ceff2
Went through all files to refactor code
Lindseyls May 9, 2018
d9312b0
Ran rails db:rollback to remove the columns we created for customer a…
Lindseyls May 9, 2018
fdde0ea
Modified tests to account for changes to customer and movie DB
cmn53 May 9, 2018
fb72f63
Tried to validate the movies that a customer can check out
Lindseyls May 9, 2018
17a8312
Modified movies and customers controllers to show results of method c…
cmn53 May 9, 2018
f1e6d49
Minor refactoring and moved logic regarding duplicate rentals to the …
cmn53 May 11, 2018
d81e303
Added simplecov to look at test coverage
cmn53 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.
18 changes: 18 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# 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

coverage/*
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'

gem 'validates_timeliness', '~> 4.0'
# 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'

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', '5.10.1'
gem 'minitest-rails'
gem 'minitest-reporters'
gem 'simplecov', require: false
end
167 changes: 167 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
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)
docile (1.3.0)
erubi (1.7.1)
ffi (1.9.23)
globalid (0.4.1)
activesupport (>= 4.2.0)
i18n (1.0.1)
concurrent-ruby (~> 1.0)
json (2.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.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.10.1)
minitest-rails (3.0.0)
minitest (~> 5.8)
railties (~> 5.0)
minitest-reporters (1.2.0)
ansi
builder
minitest (>= 5.0)
ruby-progressbar
nio4r (2.3.1)
nokogiri (1.8.2)
mini_portile2 (~> 2.3.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)
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)
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.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)
timeliness (0.3.8)
tzinfo (1.2.5)
thread_safe (~> 0.1)
validates_timeliness (4.0.2)
timeliness (~> 0.3.7)
websocket-driver (0.6.5)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.3)

PLATFORMS
ruby

DEPENDENCIES
byebug
listen (>= 3.0.5, < 3.2)
minitest (= 5.10.1)
minitest-rails
minitest-reporters
pg (>= 0.18, < 2.0)
pry-rails
puma (~> 3.7)
rails (~> 5.1.6)
simplecov
spring
spring-watcher-listen (~> 2.0.0)
tzinfo-data
validates_timeliness (~> 4.0)

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.
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(methods: :movies_checked_out_count, only: [:id, :name, :registered_at, :postal_code, :phone]), status: :ok
end
end
37 changes: 37 additions & 0 deletions app/controllers/movies_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
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.nil?
render json: {
errors: {
id: ["No movie with ID #{params[:id]}"]
}
}, status: :not_found
else
render json: movie.as_json(methods: :available_inventory, only: [:id, :title, :overview, :release_date, :inventory]), status: :ok
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
end
end

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

RENTAL_LIMIT = 7 #days

Choose a reason for hiding this comment

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

This should really be a part of the model, not the controller.


def check_out
rental = Rental.new(rental_params)
rental.check_out = DateTime.now
rental.due_date = rental.check_out + RENTAL_LIMIT

Choose a reason for hiding this comment

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

Moving the rental constant would probably also lead to moving this logic in the model as well


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

unless movie
render json: {
errors: {
movie_id: ["No movie with ID #{params[:movie_id]}"]
}
}, status: :not_found
return
end

if movie.available_inventory < 1
render json: {
errors: {
available_inventory: ["#{movie.title} is not currently available."]
}
}, status: :not_found
return
end

duplicate_rental = Rental.find_rental(params[:movie_id], params[:customer_id])
if duplicate_rental
render json: {
errors: {
movie_id: ["#{movie.title} is currently checked out by that customer. A customer may not check out more than one copy of a movie at a time."]
}
}, status: :bad_request
return
end

if rental.save
render json: rental.as_json(only: [:movie_id, :customer_id]), status: :ok
else
render json: { errors: rental.errors.messages }, status: :bad_request
end
end

def check_in
rental = Rental.find_rental(params[:movie_id], params[:customer_id])

unless rental
render json: {
errors: {
rental: ["There is no outstanding rental with that criteria."]
}
}, status: :not_found
return
end

rental.update_attributes(check_in: DateTime.now)

if rental.save
render json: rental.as_json(only: [:movie_id, :customer_id]), status: :ok
else
render json: { errors: rental.errors.messages }, status: :bad_request
end
end

private
def rental_params
return params.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.
Loading