Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
786aa86
create new rails api app
samanthaberk May 7, 2018
f3beb43
create customers controller
samanthaberk May 7, 2018
1886154
Create customer model
samanthaberk May 7, 2018
2e52676
Add relations to customer class
samanthaberk May 7, 2018
3421d2d
added in movies controller and model
hannahlcameron May 7, 2018
d659e74
resolved merge cnflict in schema
hannahlcameron May 7, 2018
d9e2415
added rental model and foreign key relations
hannahlcameron May 7, 2018
625a9a5
added rentals controller, added relations to rentals
hannahlcameron May 7, 2018
45fcc91
Add /zomg route and confirm it works
samanthaberk May 7, 2018
cbc6002
added model validations to customer and movie
hannahlcameron May 7, 2018
41168b6
added and passing customer validation tests
hannahlcameron May 7, 2018
77e01eb
Build tests for validations on movie model
samanthaberk May 7, 2018
f0987f0
write some tests
samanthaberk May 8, 2018
22c1bf7
wrote relations tests
hannahlcameron May 8, 2018
9f94646
resolved merge conflict in yml files
hannahlcameron May 8, 2018
0f98b40
revised relations tests, passing
hannahlcameron May 8, 2018
aed9342
added in negative test cases for relations
hannahlcameron May 8, 2018
0862448
add test for if the movie has not been renter
samanthaberk May 8, 2018
b5e7826
Merge branch 'movies-tests'
samanthaberk May 8, 2018
eac8b4b
wrote relations tests for rentals model
hannahlcameron May 8, 2018
4470c5e
wrote customer#index controller tests - added in route and filled in …
hannahlcameron May 8, 2018
6f69770
added in test for if no customers
hannahlcameron May 8, 2018
56339d6
Merge branch 'get_customers'
hannahlcameron May 8, 2018
bd9dc0a
Add controller tests to movies#index
samanthaberk May 8, 2018
826af96
Add before block so not repeating code
samanthaberk May 8, 2018
7dabaeb
added migrations/updated movie.rb to account for setting avialable in…
hannahlcameron May 8, 2018
eeefb89
added in negative test cases for rental.rb
hannahlcameron May 8, 2018
b5ca545
change order for sort on movies controller test
samanthaberk May 8, 2018
53b18ab
revised what customers#index removes
hannahlcameron May 8, 2018
4b66bbe
All tests passing
samanthaberk May 8, 2018
63cc4c3
Remove Zomg and condense routes
samanthaberk May 8, 2018
0b66246
Merge branch 'master' of https://github.com/samanthaberk/VideoStoreAPI
hannahlcameron May 8, 2018
8eebda3
Write initial tests for movie#show
samanthaberk May 8, 2018
5ae0389
movies#show working with passing tests
samanthaberk May 8, 2018
a30a031
Merge branch 'master' of https://github.com/samanthaberk/VideoStoreAPI
hannahlcameron May 8, 2018
ff12a1b
added in movies#create tests
hannahlcameron May 8, 2018
019c22b
added route and method for movies#create - passing all controller tests
hannahlcameron May 8, 2018
63d446f
change status for successful movies post from :created to :success to…
hannahlcameron May 8, 2018
8098059
Add checkout date and due date with default values to Rentals table
samanthaberk May 8, 2018
0af344a
Merge branch 'master' of https://github.com/samanthaberk/VideoStoreAPI
samanthaberk May 8, 2018
5148b7f
Write initial controller tests for rentals#checkout
samanthaberk May 8, 2018
6f78be5
Write routes for checkout and checkin and code for checkout that pass…
samanthaberk May 9, 2018
244e3ca
Change checkout and checkin routes to match smoke test requirements
samanthaberk May 9, 2018
1c6de97
added in decrement_available_inventory tests; modified the before val…
hannahlcameron May 9, 2018
494b63c
wrote decrement_avail_inv, passing all tests
hannahlcameron May 9, 2018
15408d2
revised rental#create to accomodate for avail_inv; wrote find_rental_…
hannahlcameron May 9, 2018
25264f8
revised rental#create, passing all controller tests; moved helper met…
hannahlcameron May 9, 2018
19dfd05
Write tests for increment_available_inventory on Movie class and code…
samanthaberk May 9, 2018
bd13df2
Write intital controller tests for checkin
samanthaberk May 9, 2018
d6ba637
write rentals#create tests and code that passes those tests
samanthaberk May 11, 2018
d2a3620
added customer model increment and decrement movies checked out count…
hannahlcameron May 11, 2018
bbfec9f
fixed failing tests
hannahlcameron May 11, 2018
8670626
removed 2x private methods for finding movie and customer
hannahlcameron May 11, 2018
06c4359
passing all smoke tests - added in customer.save and movie.save
hannahlcameron 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
50 changes: 50 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
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'
# 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
154 changes: 154 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
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)
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

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.
8 changes: 8 additions & 0 deletions app/controllers/customers_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
class CustomersController < ApplicationController

def index
customers = Customer.all
render json: customers.as_json(only: [:id, :movies_checked_out_count, :name, :phone, :postal_code, :registered_at]), status: :ok
end

end
34 changes: 34 additions & 0 deletions app/controllers/movies_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
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: "Movie with id #{params[:id]}does not exist" }, status: :not_found
else
render json: movie.as_json(only: [:title, :overview, :release_date, :inventory, :available_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.require(:movie).permit(:title, :overview, :release_date, :inventory)
end

end
62 changes: 62 additions & 0 deletions app/controllers/rentals_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
class RentalsController < ApplicationController

def create
rental = Rental.new(rental_params)

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

if movie.nil?

Choose a reason for hiding this comment

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

What if the customer doesn't exist?

render json: {errors: "Movie with id #{rental_params[:movie_id]} doesn't exist"}, status: :bad_request
return
end

if movie.available_inventory == 0
render json: { errors: "No available inventory for #{movie.title}." }, status: :bad_request
return
end

if rental.save
movie.decrement_available_inventory

Choose a reason for hiding this comment

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

It might be logical to move all of this updating logic into a rental model method. One thing to keep in mind in the future is that when an action requires many model updates, you may want to combine these into a transaction. If the rental save succeeds, then you also want to ensure that the movie and customer object updates work, otherwise you could end up in an odd state where the movie inventory is updated, but the customer's isn't.

movie.save
customer.increment_movies_checked_out_count
customer.save
render json: { id: rental.id, due_date: rental.due_date }, status: :ok
else
render json: { errors: rental.errors.messages }, status: :bad_request
end

end

def update
rental = Rental.find_by(rental_params)
if rental.nil?
render json: { errors: "This rental does not exist." }, status: :bad_request
return
end

movie = rental.movie
customer = rental.customer

if rental.updated_at != rental.created_at
render json: { errors: "#{movie.title} is already checked-in." }, status: :bad_request
else
if rental.save
movie.increment_available_inventory
movie.save
customer.decrement_movies_checked_out_count
customer.save
render json: { id: rental.id, "check-in date": rental.updated_at }, status: :ok
else
render json: { errors: rental.errors.messages }, status: :bad_request
end
end

end

private
def rental_params
return 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.
18 changes: 18 additions & 0 deletions app/models/customer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
class Customer < ApplicationRecord
has_many :rentals
has_many :movies, through: :rentals

validates :name, presence: true
validates :movies_checked_out_count, presence: true, numericality: { only_integer: true }

def decrement_movies_checked_out_count

Choose a reason for hiding this comment

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

Is it known that this will do nothing if there aren't any checked out?

if self.movies_checked_out_count > 0
self.movies_checked_out_count -= 1
end
end

def increment_movies_checked_out_count
self.movies_checked_out_count += 1
end

end
Loading