Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
8c0bf61
created movie, customer and rental databases
Allison-Northrop May 9, 2017
c3647c9
added relationships in models
Allison-Northrop May 9, 2017
0198dfd
modified rental tes
Allison-Northrop May 9, 2017
c6f5145
Write validations for movie model
cecomfort May 9, 2017
ddf7dbf
Write validations for movie model
cecomfort May 9, 2017
4dc6ef6
Fix merge conflict
cecomfort May 9, 2017
283e5e6
added validation for customer model
Allison-Northrop May 9, 2017
7759891
added rental validations
Allison-Northrop May 9, 2017
dd0af83
Add fixtures for movie and customer
cecomfort May 9, 2017
8a5c0a3
added rental yml files
Allison-Northrop May 9, 2017
7b7675c
fixed merge conflict
Allison-Northrop May 9, 2017
20ec181
phone and number validations for customer passing
Allison-Northrop May 9, 2017
f47852f
Write test for movie relations
cecomfort May 9, 2017
22c53d1
Write test for customer relations
cecomfort May 9, 2017
95b64f1
all customer validation tests passing
Allison-Northrop May 9, 2017
b20b5c9
Write tests for movie validations
cecomfort May 9, 2017
b726aba
added rental tests
Allison-Northrop May 9, 2017
ea62546
fixed merge conflict
Allison-Northrop May 10, 2017
ac3b20f
Fix test errors
cecomfort May 10, 2017
886477f
added rental test belongs to movie
Allison-Northrop May 10, 2017
e08c772
Define routes for movies index, customers index, and movies show
cecomfort May 10, 2017
eee9fbf
Generate controllers for movies and customers
cecomfort May 10, 2017
51f8231
Write index method for movies controller, add movie serializer
cecomfort May 10, 2017
0780cb5
Add show method for movies controller and implement movie serializer …
cecomfort May 10, 2017
0418a8f
created serializer for customer
Allison-Northrop May 10, 2017
8dac9c0
added method in customer model for movie count
Allison-Northrop May 10, 2017
db42bd4
Modify movie show method so based on movie title not id
cecomfort May 10, 2017
3885255
Add statuses and error messages for movie controller methods
cecomfort May 10, 2017
60d2666
added status ok for customer index
Allison-Northrop May 10, 2017
43b9b95
wrote an customer index test that passes
Allison-Northrop May 10, 2017
940d623
all customer controller tests passing
Allison-Northrop May 10, 2017
244bdab
Write movie controller tests
cecomfort May 10, 2017
a34d8e1
Merge branch 'master' of https://github.com/Allison-Northrop/VideoSto…
cecomfort May 10, 2017
f42d71e
Add returned boolean to rental model and set it to false by default
cecomfort May 12, 2017
4d29d66
Write checkout method to add functionality to checkout a movie
cecomfort May 12, 2017
5d20e33
added reduce_inventory method in movie model and added rental control…
Allison-Northrop May 12, 2017
4e8cf07
Implemented changing available inventory instead of inventory when ch…
cecomfort May 12, 2017
3ce9998
refactored checkin so that a person can check out and check in the sa…
Allison-Northrop May 12, 2017
a75477c
Work on tests for rentals controller checkin method
cecomfort May 12, 2017
a89db44
wrote some tests for rentals controller
Allison-Northrop May 12, 2017
6fad66e
fixed merge conflict
Allison-Northrop May 12, 2017
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
17 changes: 17 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# 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 Byebug command history file.
.byebug_history
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.0.2'
# Use postgresql as the database for Active Record
gem 'pg', '~> 0.18'
# Use Puma as the app server
gem 'puma', '~> 3.0'
gem 'active_model_serializers'
# 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', '~> 3.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', platform: :mri
end

group :development do
gem 'listen', '~> 3.0.5'
# 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 do
gem 'better_errors'
gem 'pry-rails'
end

gem 'awesome_print'
gem 'foundation-rails'
group :test do
gem 'minitest-rails'
gem 'minitest-reporters'
end
184 changes: 184 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
GEM
remote: https://rubygems.org/
specs:
actioncable (5.0.2)
actionpack (= 5.0.2)
nio4r (>= 1.2, < 3.0)
websocket-driver (~> 0.6.1)
actionmailer (5.0.2)
actionpack (= 5.0.2)
actionview (= 5.0.2)
activejob (= 5.0.2)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
actionpack (5.0.2)
actionview (= 5.0.2)
activesupport (= 5.0.2)
rack (~> 2.0)
rack-test (~> 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (5.0.2)
activesupport (= 5.0.2)
builder (~> 3.1)
erubis (~> 2.7.0)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.3)
active_model_serializers (0.10.6)
actionpack (>= 4.1, < 6)
activemodel (>= 4.1, < 6)
case_transform (>= 0.2)
jsonapi-renderer (>= 0.1.1.beta1, < 0.2)
activejob (5.0.2)
activesupport (= 5.0.2)
globalid (>= 0.3.6)
activemodel (5.0.2)
activesupport (= 5.0.2)
activerecord (5.0.2)
activemodel (= 5.0.2)
activesupport (= 5.0.2)
arel (~> 7.0)
activesupport (5.0.2)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (~> 0.7)
minitest (~> 5.1)
tzinfo (~> 1.1)
ansi (1.5.0)
arel (7.1.4)
awesome_print (1.7.0)
babel-source (5.8.35)
babel-transpiler (0.7.0)
babel-source (>= 4.0, < 6)
execjs (~> 2.0)
better_errors (2.1.1)
coderay (>= 1.0.0)
erubis (>= 2.6.6)
rack (>= 0.9.0)
builder (3.2.3)
byebug (9.0.6)
case_transform (0.2)
activesupport
coderay (1.1.1)
concurrent-ruby (1.0.5)
erubis (2.7.0)
execjs (2.7.0)
ffi (1.9.18)
foundation-rails (6.3.1.0)
railties (>= 3.1.0)
sass (>= 3.3.0, < 3.5)
sprockets-es6 (>= 0.9.0)
globalid (0.4.0)
activesupport (>= 4.2.0)
i18n (0.8.1)
jsonapi-renderer (0.1.2)
listen (3.0.8)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
loofah (2.0.3)
nokogiri (>= 1.5.9)
mail (2.6.5)
mime-types (>= 1.16, < 4)
method_source (0.8.2)
mime-types (3.1)
mime-types-data (~> 3.2015)
mime-types-data (3.2016.0521)
mini_portile2 (2.1.0)
minitest (5.10.1)
minitest-rails (3.0.0)
minitest (~> 5.8)
railties (~> 5.0)
minitest-reporters (1.1.14)
ansi
builder
minitest (>= 5.0)
ruby-progressbar
nio4r (2.0.0)
nokogiri (1.7.1)
mini_portile2 (~> 2.1.0)
pg (0.20.0)
pry (0.10.4)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
pry-rails (0.3.6)
pry (>= 0.10.4)
puma (3.8.2)
rack (2.0.2)
rack-test (0.6.3)
rack (>= 1.0)
rails (5.0.2)
actioncable (= 5.0.2)
actionmailer (= 5.0.2)
actionpack (= 5.0.2)
actionview (= 5.0.2)
activejob (= 5.0.2)
activemodel (= 5.0.2)
activerecord (= 5.0.2)
activesupport (= 5.0.2)
bundler (>= 1.3.0, < 2.0)
railties (= 5.0.2)
sprockets-rails (>= 2.0.0)
rails-dom-testing (2.0.2)
activesupport (>= 4.2.0, < 6.0)
nokogiri (~> 1.6)
rails-html-sanitizer (1.0.3)
loofah (~> 2.0)
railties (5.0.2)
actionpack (= 5.0.2)
activesupport (= 5.0.2)
method_source
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rake (12.0.0)
rb-fsevent (0.9.8)
rb-inotify (0.9.8)
ffi (>= 0.5.0)
ruby-progressbar (1.8.1)
sass (3.4.23)
slop (3.6.0)
spring (2.0.1)
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-es6 (0.9.2)
babel-source (>= 5.8.11)
babel-transpiler
sprockets (>= 3.0.0)
sprockets-rails (3.2.0)
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
thor (0.19.4)
thread_safe (0.3.6)
tzinfo (1.2.3)
thread_safe (~> 0.1)
websocket-driver (0.6.5)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.2)

PLATFORMS
ruby

DEPENDENCIES
active_model_serializers
awesome_print
better_errors
byebug
foundation-rails
listen (~> 3.0.5)
minitest-rails
minitest-reporters
pg (~> 0.18)
pry-rails
puma (~> 3.0)
rails (~> 5.0.2)
spring
spring-watcher-listen (~> 2.0.0)
tzinfo-data

BUNDLED WITH
1.14.6
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, status: :ok
end
end
15 changes: 15 additions & 0 deletions app/controllers/movies_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
class MoviesController < ApplicationController
def index
movies = Movie.all
render json: movies, each_serializer: MoviePreviewSerializer, status: :ok
end

def show
movie = Movie.find_by(title: params[:title].capitalize)
if movie
render json: movie, status: :ok
else
render status: :not_found, json: { errors: { title: ["Movie '#{params[:title]}' not found"] } }
end
end
end
27 changes: 27 additions & 0 deletions app/controllers/rentals_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
class RentalsController < ApplicationController
def checkout
movie = Movie.find_by(title: params[:title].capitalize)

if movie && movie.available_inventory <= 0
render status: :bad_request, json: { errors: { inventory: ["#{movie.title} is not in stock"] } }
else
rental = Rental.new(customer_id: params["customer_id"], movie: movie, due_date: params["due_date"])
if rental.save
render json: { id: rental.id }, status: :ok
else
render status: :bad_request, json: { errors: rental.errors.messages }
end
end
end

def checkin
movie = Movie.find_by(title: params[:title].capitalize)
rental = Rental.find_by(returned: false, movie: movie, customer_id: params["customer_id"])
if movie && rental
rental.update_attributes(returned: true)
render json: { id: rental.id, returned: rental.returned }, status: :ok
else
render status: :bad_request, json: { errors: { rental: ["There is no current rental of '#{params[:title]}'"] } }
end
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.
15 changes: 15 additions & 0 deletions app/models/customer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
class Customer < ApplicationRecord
has_many :rentals
has_many :movies, through: :rentals

validates :name, presence: true
validates :phone, presence: true
validates :postal_code, length: { is: 5 }

# scope :movies_checked_out_count, -> { movies.count }

def movies_checked_out_count
movies.count
end

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

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

def available_inventory
rentals = Rental.where(returned: false, movie_id: id)
return inventory - rentals.count
end

end
14 changes: 14 additions & 0 deletions app/models/rental.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
class Rental < ApplicationRecord
belongs_to :customer
belongs_to :movie
#potentially need to comment the below out for a while...
# due date has to be after today
validates :due_date, presence: true

after_initialize :set_defaults, unless: :persisted?

private
def set_defaults
self.returned = false if self.returned.nil?
end
end
3 changes: 3 additions & 0 deletions app/serializers/customer_serializer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class CustomerSerializer < ActiveModel::Serializer
attributes :id, :name, :registered_at, :postal_code, :phone, :movies_checked_out_count
end
3 changes: 3 additions & 0 deletions app/serializers/movie_preview_serializer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class MoviePreviewSerializer < ActiveModel::Serializer
attributes :title, :release_date
end
3 changes: 3 additions & 0 deletions app/serializers/movie_serializer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class MovieSerializer < ActiveModel::Serializer
attributes :title, :release_date, :overview, :inventory, :available_inventory
end
Loading