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

Tor & Wenjie - VideoStore - Octos #6

Open
wants to merge 25 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
9e98095
ran rails new
torshimizu May 7, 2018
eeaef79
created models customer, movie, rental
torshimizu May 7, 2018
decf6bf
fixed table columns and ran db:seed
torshimizu May 7, 2018
64eaa54
wrote movie model validations
torshimizu May 7, 2018
58e6130
Added model validations
wf1101 May 7, 2018
a5e5d0d
Merge branch 'master' of https://github.com/torshimizu/VideoStoreAPI
torshimizu May 7, 2018
1c94d5e
created tests and controller for customers
torshimizu May 7, 2018
c5c92d8
Created yml for customers and movies
wf1101 May 7, 2018
1e48b75
Added movies controller actions
wf1101 May 7, 2018
48c4e6e
added a positive case for movie model
torshimizu May 7, 2018
16673a1
Added relations to models
wf1101 May 7, 2018
859da32
Implemented tests for model relations
wf1101 May 7, 2018
5e90218
Added yml for rentals
wf1101 May 7, 2018
1c0519d
wrote tests for rentals_controller, added conditional validations for…
torshimizu May 7, 2018
340a3a0
Added a checkout action in rental controller
wf1101 May 8, 2018
6df4de1
Added available inventory column to movies and movies checkout count …
wf1101 May 8, 2018
08f4df0
updated inventory to available inventory. removed required :movie fro…
torshimizu May 8, 2018
d8c34f9
Added business logic to rental model
wf1101 May 8, 2018
2c228ea
Added check out action for rentals controller
wf1101 May 8, 2018
2f1a355
Implemented tests for rentals check in
wf1101 May 8, 2018
562ef6a
Fixed validation bug and made all tests passed
torshimizu May 8, 2018
5cc36de
Added ERD for this project
wf1101 May 8, 2018
658a45e
moving updating rental movie and customer inventory to rental model
torshimizu May 9, 2018
d09a9ad
moved updating customer movies_checked_in_count and movie available i…
torshimizu May 9, 2018
08ecc76
Merge branch 'master' of https://github.com/torshimizu/VideoStoreAPI
torshimizu 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
Binary file added VideoStoreAPI.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
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(except: [:created_at, :updated_at], status: :ok)
end
end
38 changes: 38 additions & 0 deletions app/controllers/movies_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
class MoviesController < ApplicationController
def index
movies = Movie.all
render json: movies.as_json(except: [:created_at, :updated_at], status: :ok)
end

def show
movie = Movie.find_by(id: params[:id])
if movie
render json: movie.as_json(except: [:created_at, :updated_at], status: :ok)
else
render json: {
errors: {
id: ["No movie with ID #{params[:id]}"]
}
}, status: :not_found
end
end

def create
movie = Movie.new(movie_params)
movie.available_inventory = movie.inventory
if movie.save
render json: movie.as_json(except: [:created_at, :updated_at], status: :ok)
else
render json: {
errors: movie.errors.messages
}, status: :bad_request
end
end


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

end
37 changes: 37 additions & 0 deletions app/controllers/rentals_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
class RentalsController < ApplicationController
def check_out
rental = Rental.new(rental_params)
rental.due_date = Date.today + 7

if rental.save
rental = Rental.update_movie_and_customer(rental)
render json: rental.as_json(except: [:updated_at], status: :ok)
else
render json: { errors: rental.errors.messages}, status: :bad_request
end
end

def check_in
rental = Rental.find_checked_out_movie(params[:movie_id], params[:customer_id])
if rental
rental.update(check_in_date: Date.today)
rental = Rental.update_movie_and_customer(rental)
render json: rental.as_json(except: [:updated_at], status: :ok)
else
render json: {
errors: {
rental: ["No rental found"]
}
}, status: :not_found
end

end



private

def rental_params
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.
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
validates :name, presence: true
validates :phone, presence: true
validate :same_name_and_same_phone, on: :create

has_many :rentals

def same_name_and_same_phone
customers = Customer.where(name: name)

if customers.any? {|customer| customer.phone == phone}

Choose a reason for hiding this comment

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

Rails supports this natively:

validates :phone, uniqueness: { scope: :name }

errors[:phone] << "Can not have the same name and same phone number"
end
end
end
16 changes: 16 additions & 0 deletions app/models/movie.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
class Movie < ApplicationRecord
validates :title, presence: true
validates :inventory, presence: true, numericality: { only_integer: true, greater_than_or_equal_to: 0 }, on: :create

validate :uniq_title_release_date_combo, on: :create

has_many :rentals

def uniq_title_release_date_combo
movies = Movie.where(title: title)

if movies.any?{ |movie| movie.release_date == release_date }
errors[:release_date] << 'Cannot have a movie with the same title and release date'
end
end
end
Loading