Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
7f2c133
rails initial setup.
Krashaune May 7, 2018
11e364d
created customer model
Krashaune May 7, 2018
2e46775
Added in Movies model, created local database
The-Beez-Kneez May 7, 2018
801ab5f
generated a movies controller, added validations to the movies model,…
Krashaune May 7, 2018
acafe5f
Model validation testing for Movie
The-Beez-Kneez May 7, 2018
083bcee
Added for model validation tests
The-Beez-Kneez May 8, 2018
0b8a183
created tests for customer model validations. Tests are passing.
Krashaune May 8, 2018
4db1e2b
Added index method to controller, created test to evaluate functional…
Krashaune May 8, 2018
80d7336
Movies Controller action Show with associated tests
The-Beez-Kneez May 8, 2018
5d3ff7a
completed movie show controller method and tests are passing.
Krashaune May 8, 2018
5d3fb01
Added in Customer routes, Customer Controller actions, Customer Contr…
The-Beez-Kneez May 8, 2018
5c8ffd3
Fixed minor seed database issues
The-Beez-Kneez May 8, 2018
c9e071d
updated create movie method and movie_params method removed :movie.
Krashaune May 8, 2018
1bda46d
create rental model. add movie and customer foreign keys.
Krashaune May 8, 2018
c2c8955
Fixed Movie Create test and action
The-Beez-Kneez May 8, 2018
9a5a63f
Added Model Validations Tests for Rental Model
The-Beez-Kneez May 8, 2018
32cd0ff
Added relationships to models.
Krashaune May 8, 2018
6499f5a
All validations are passing.
Krashaune May 9, 2018
bbb8791
completed rental relationship tests.
Krashaune May 9, 2018
2b0db94
completed the model relations tests for movie, customer, and rental.
Krashaune May 9, 2018
3c0a3d2
Added skeleton framework for checkin and checkout controller action t…
The-Beez-Kneez May 9, 2018
6e37985
Implemented first test in Checkout action for Rentals Controller
The-Beez-Kneez May 9, 2018
c391644
Updated Checkout to include inventory alterations
The-Beez-Kneez May 9, 2018
900eeb5
Checkout action in Rentals Controller complete. Tests complete too.
The-Beez-Kneez May 9, 2018
efefc9e
Currently only two tests not passing, working on those tests now
The-Beez-Kneez May 11, 2018
930bc59
no changes
Krashaune May 11, 2018
d768dc9
Now checkin test is passing, passing in customer_id and movie_id
The-Beez-Kneez May 11, 2018
fdcca7f
forced random merge
Krashaune May 11, 2018
d77fdf4
random merge number 2
Krashaune May 11, 2018
1fbc05c
another merge
Krashaune May 11, 2018
1f11a7d
completed final testing
Krashaune 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
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
52 changes: 52 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
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_date_time'
# 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-rails'
gem 'minitest-reporters'
end
156 changes: 156 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
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)
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
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)
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)
validates_date_time (1.0.0)
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-rails
minitest-reporters
pg (>= 0.18, < 2.0)
pry-rails
puma (~> 3.7)
rails (~> 5.1.6)
spring
spring-watcher-listen (~> 2.0.0)
tzinfo-data
validates_date_time

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(only: [:id, :address, :city, :name, :phone, :postal_code, :registered_at])
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, :overview, :inventory, :available_inventory, :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(only: [:id, :title, :overview, :inventory, :available_inventory, :release_date], status: :ok)
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
return params.permit(:title, :overview, :inventory, :release_date)
end
end
71 changes: 71 additions & 0 deletions app/controllers/rentals_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
require 'pry'
class RentalsController < ApplicationController

def checkout
movie_id = params[:movie_id]
customer_id = params[:customer_id]

date = Date.today
rental_params = {
checkout: nil,
due_date: nil,
customer_id: customer_id,
movie_id: movie_id
}

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

if movie[:available_inventory] == 0
render json: {
errors: {
available_inventory: ["Movie is currently all checked out. Sorry."]
}
} , status: :bad_request
return
end

new_rental = Rental.new(rental_params)
new_rental[:checkout] = date
new_rental[:due_date] = date + 7

Choose a reason for hiding this comment

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

You should take all of the logic in this controller action and encapsulate it in a model method. Perhaps something like Movie#checkout(customer_id). You could have it raise an exception if there's not enough inventory available, or implement a custom validation on the rental.

movie[:available_inventory] -= 1
if new_rental.save
movie.save
render json: { id: new_rental.id}, status: :ok
else
render json: { errors: new_rental.errors.messages }, status: :bad_request
end
end

def checkin
rental = Rental.find_by(customer_id: params[:customer_id], movie_id: params[:movie_id])
puts "DPR: found rental #{rental}"


if rental.checked_in
render json: {
errors: {
checked_in: ["Movie has not been checked out."]

Choose a reason for hiding this comment

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

I like that you're checking for this

}
}, status: :bad_request
return
end

# TODO: error handling
rental.update!(checked_in: true)


rental.movie.available_inventory += 1
if rental.movie.save
render json: { id: rental.movie.id }, status: :ok
else

render json: { errors: rental.movie.errors.messages }, status: :bad_request
end
end

private
def rental_params
return params.permit(:checkout, :due_date, :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
has_many :movies, through: :rentals

validates :name, presence: true
validates :phone, presence: true
validates :phone, length: { is: 14 }

Choose a reason for hiding this comment

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

You might be over-validating here. Your app probably won't break if the customer's phone number isn't right, so validating it (and testing the validation, and making your tests provide the phone number in the right format) is more trouble than it's worth.

Choose a reason for hiding this comment

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

Same thing goes for many of your model validations.

end
11 changes: 11 additions & 0 deletions app/models/movie.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
class Movie < ApplicationRecord
has_many :rentals
has_many :customers, through: :rentals

validates :title, presence: true
validates :inventory, numericality: true
validates :inventory, numericality: {greater_than_or_equal_to: 0}
validates :available_inventory, numericality: true
validates :available_inventory, numericality: {greater_than_or_equal_to: 0}

end
Loading