Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Phoebe & Jackie - Ampers #12

Open
wants to merge 62 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
6c7f76c
new rails api project
pmanni02 May 7, 2018
f8b5cce
Created model and controller customer
Jackiesan May 7, 2018
80d5ea8
create movies model and controller
pmanni02 May 7, 2018
2ea77d4
merged routes
pmanni02 May 7, 2018
7928265
basic validation tests for movie model
pmanni02 May 7, 2018
1f890f3
Added model tests for customer, added customers to yaml file
Jackiesan May 7, 2018
9c5cf54
Merge branch 'master' of https://github.com/Jackiesan/VideoStoreAPI
Jackiesan May 7, 2018
95fcee9
added routes
pmanni02 May 7, 2018
664c67e
Merge branch 'master' of https://github.com/Jackiesan/VideoStoreAPI
pmanni02 May 7, 2018
730ce45
adds /zomg test, index method for movies, and related tests
pmanni02 May 7, 2018
e8af202
api request for one movie and related tests
pmanni02 May 7, 2018
bfa9fbc
Added tests for customers controller
Jackiesan May 7, 2018
262ff85
controller tests for create
pmanni02 May 7, 2018
256d81d
Merge branch 'master' of https://github.com/Jackiesan/VideoStoreAPI
pmanni02 May 7, 2018
706d25f
Added test for customer controller to return empty array if no customers
Jackiesan May 7, 2018
aa271c7
removed require(movie) from strong params and updated movie controlle…
pmanni02 May 7, 2018
5695be3
Created rental model and added relations to models
Jackiesan May 7, 2018
01940ff
rental yml file
pmanni02 May 8, 2018
e4d23f1
Added relational testing to customer model
Jackiesan May 8, 2018
e1215dc
movie model relation tests
pmanni02 May 8, 2018
19d7392
Merge branch 'master' of https://github.com/Jackiesan/VideoStoreAPI
pmanni02 May 8, 2018
3bbb61b
Added validations to rental model
Jackiesan May 8, 2018
d18bb11
rental relation tests
pmanni02 May 8, 2018
9f6470a
Merge branch 'master' of https://github.com/Jackiesan/VideoStoreAPI
pmanni02 May 8, 2018
5434e29
Added validation testing for rental model
Jackiesan May 8, 2018
7d371f4
resolved conflict in rental test
Jackiesan May 8, 2018
fba7c12
Completed initialization and relation testing for rental model
Jackiesan May 8, 2018
93b5750
checkout and checkin routes
pmanni02 May 8, 2018
ecb4578
rental controller
pmanni02 May 8, 2018
1e864d7
Added column to rental schema, updated yamls for rental
Jackiesan May 8, 2018
740b9db
migrations for movie_checkout_count and available_inventory
pmanni02 May 8, 2018
59b92c7
schema merge conflict
pmanni02 May 8, 2018
f48762e
Removed columns movies checked out count and available inventory
Jackiesan May 8, 2018
adf1ed3
Updated model customer and movie to destroy rentals if customer is de…
Jackiesan May 8, 2018
783ac88
Created basic checkout controller method, added get due date method t…
Jackiesan May 8, 2018
085e62a
check in method logic
pmanni02 May 8, 2018
30727d3
rental.rb merge
pmanni02 May 8, 2018
1b08e6c
Revised check out method to validate movies inventory
Jackiesan May 8, 2018
4de7a44
fixed merge conflict with rental model
Jackiesan May 8, 2018
08cd870
removes duplicate code
pmanni02 May 8, 2018
442741f
merge conflict
pmanni02 May 8, 2018
df48149
checkin controller tests
pmanni02 May 8, 2018
802b284
Added few assertions to rentals controller
Jackiesan May 8, 2018
3da6dae
fixed conflicts in rentals controller test
Jackiesan May 8, 2018
d9a0921
added few more assertions to rentals checkout test
Jackiesan May 9, 2018
13bbae3
updated rental available method to return if movie is nil
Jackiesan May 9, 2018
ecb6841
rental controller checkin method tests
pmanni02 May 9, 2018
78f341b
Merge branch 'master' of https://github.com/Jackiesan/VideoStoreAPI
pmanni02 May 9, 2018
8831a98
available inventory custom method
pmanni02 May 9, 2018
0fc3545
Created custom method to return number of movies checked out for cust…
Jackiesan May 9, 2018
71c3e84
Merge branch 'master' of https://github.com/Jackiesan/VideoStoreAPI
Jackiesan May 9, 2018
dfe3877
Revised get count customer method to consider empty array
Jackiesan May 9, 2018
bfdbf3a
added test for custom method get count method
Jackiesan May 9, 2018
9e63bc7
updates testing for checkin and checkout based on new custom method a…
pmanni02 May 9, 2018
1457c4d
Merge branch 'master' of https://github.com/Jackiesan/VideoStoreAPI
pmanni02 May 9, 2018
5bba1dd
added assertion to get count method to return 0 if no movies are chec…
Jackiesan May 9, 2018
2884119
updates model test for custom method available inventory
pmanni02 May 9, 2018
6b7241f
Fixed merge conflict in yaml
Jackiesan May 9, 2018
077f100
Merge branch 'master' of https://github.com/Jackiesan/VideoStoreAPI
Jackiesan May 9, 2018
748fdf5
comments out last test
pmanni02 May 9, 2018
397a941
Merge branch 'master' of https://github.com/Jackiesan/VideoStoreAPI
pmanni02 May 9, 2018
42832c7
refactored routes
pmanni02 May 9, 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.
14 changes: 14 additions & 0 deletions app/controllers/customers_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
class CustomersController < ApplicationController
def index
@customers = Customer.all
@customers_data = []
@customers.each do |customer|
movies_checked_out_count = {"movies_checked_out_count" => customer.get_count }
customer = JSON::parse(customer.to_json(only: [:id, :name, :registered_at, :postal_code, :phone])).merge(movies_checked_out_count)
@customers_data << customer
end

render json: @customers_data.as_json
end

end
31 changes: 31 additions & 0 deletions app/controllers/movies_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
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: movie.as_json( only: [:title, :overview, :release_date, :inventory]).merge(available_inventory: movie.available_inventory), status: :ok
else
render json: { errors: { title: ["Movie not found"] } }, status: :bad_request
end
end

def create
movie = Movie.create(movies_params)
if movie.valid?
render json: { id: movie.id }, status: :ok
else
render json: { errors: movie.errors }, status: :bad_request
end
end

private
def movies_params
return params.permit(:title, :overview, :release_date, :inventory)
end

end
34 changes: 34 additions & 0 deletions app/controllers/rentals_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
require 'date'

class RentalsController < ApplicationController

def check_in
rental = Rental.find_by(customer_id: rental_params[:customer_id], movie_id: rental_params[:movie_id], check_in_status: false)
if rental
rental.update(check_in_status: true)
render json: { status: 'Success', rental: rental }, status: :ok
else
render json: { errors: 'Rental does not exist' }, status: :bad_request
end
end

def check_out
rental = Rental.new(rental_params)
rental.checked_out = DateTime.now.to_date
rental.due_date = rental.checked_out + 7
rental.check_in_status = false

if rental.save
render json: { id: rental.id, movie_id: rental.movie.id, customer_id: rental.customer.id, checked_out_date: rental.checked_out, due_date: rental.due_date }, status: :ok
else
render json: { errors: rental.errors }, 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: '[email protected]'
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.
20 changes: 20 additions & 0 deletions app/models/customer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
class Customer < ApplicationRecord
has_many :rentals, dependent: :destroy
validates :name, presence: true
validates :registered_at, presence: true
validates :address, presence: true
validates :city, presence: true
validates :state, presence: true
validates :postal_code, presence: true
validates :phone, presence: true

def get_count
items_checked_out = self.rentals.select { |rental| rental.check_in_status == false }

if !items_checked_out.empty?

Choose a reason for hiding this comment

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

Why not just return items_checked_out.length or .count why have the if statement?

return items_checked_out.count
else
return 0
end
end
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, dependent: :destroy
validates :title, presence: true
validates :overview, presence: true
validates :release_date, presence: true
validates :inventory, presence: true

def available_inventory
return self.inventory - self.rentals.where(check_in_status: false).count
end
end
20 changes: 20 additions & 0 deletions app/models/rental.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
class Rental < ApplicationRecord
belongs_to :movie
belongs_to :customer
validates :checked_out, presence: true
validates :due_date, presence: true
validates :check_in_status, inclusion: { in: [ true, false ] }
validate :rental_available


def rental_available
return unless errors.blank?

units_checked_out = movie.rentals.select { |rental| rental.check_in_status == false }
units_available = movie.inventory - units_checked_out.count
if units_available == 0
errors.add(:movie, "This movie is not available")
end
end

end
Loading