Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
807da34
initial rails setup
sjscotton May 14, 2019
4595fdf
created models
sjscotton May 14, 2019
8720ea7
added controllers
sjscotton May 14, 2019
7ba227e
added routes
sjscotton May 14, 2019
f80525e
fixed test helper file bug, added movie#show and nominal test case
sjscotton May 14, 2019
1adbeff
added edge case test for movies#show
sjscotton May 14, 2019
c86bf8b
added index methods for movies controller and customers controller, a…
lebaongoc May 14, 2019
8ec064b
added movies#create with tests
sjscotton May 14, 2019
221d3c5
added test for customers controller - index method
lebaongoc May 14, 2019
f3d5a10
added validations to movie
sjscotton May 14, 2019
c86e49a
merge conflicts
sjscotton May 14, 2019
ac6aebd
Merge branch 'master' of https://github.com/lebaongoc/VideoStoreAPI
lebaongoc May 14, 2019
8fb0a2e
passed all smoke tests for create, removes movie form strong params, …
sjscotton May 14, 2019
30ce906
added model rental
sjscotton May 14, 2019
2567e52
added checked out count column to customers model, modified the assoc…
lebaongoc May 14, 2019
2be0cb2
resolved merge conflict
lebaongoc May 14, 2019
42a3dca
added relationships and foreign key references to rental
sjscotton May 14, 2019
2c0f472
merge conflicts
sjscotton May 14, 2019
10e1549
added available inventory column to movies model, updated movies_cont…
lebaongoc May 14, 2019
967ffe7
resolved merge conflict
lebaongoc May 14, 2019
46fb6ed
added rental controller
sjscotton May 14, 2019
8438434
added checkout date and due date to rentals
sjscotton May 14, 2019
1bd1de1
added checkout_inventory custom method in the customer model
lebaongoc May 14, 2019
fc36512
added checkout method
sjscotton May 15, 2019
82684e4
added private method checkin
lebaongoc May 15, 2019
7421026
Merge branch 'master' of https://github.com/lebaongoc/VideoStoreAPI
lebaongoc May 15, 2019
56ed75e
added checkin method for rentals controller
lebaongoc May 15, 2019
574e5ea
fixed checkout inventory bug
sjscotton May 15, 2019
25c69bb
moved customer checkout method from movie model to customer model
lebaongoc May 15, 2019
abb071e
resovled merge conflict
lebaongoc May 15, 2019
c063cf2
debugged checkout and checkin methods in rentals controller
lebaongoc May 15, 2019
5f13cbb
tests for checkout done
sjscotton May 15, 2019
2b029b5
merge conflict
sjscotton May 15, 2019
f8a0665
added tests for customer model methods
sjscotton May 15, 2019
3b3c2ba
added testing to movie models
lebaongoc May 15, 2019
268939b
Merge branch 'master' of https://github.com/lebaongoc/VideoStoreAPI
lebaongoc May 15, 2019
9fa3e1d
added tests for rental validations
sjscotton May 15, 2019
0d2b805
added relationship testing for rentals
sjscotton May 15, 2019
bf44b68
added relationship and validation testing for customers
sjscotton May 15, 2019
89d2730
added test for checkin method to rentals controller test
lebaongoc May 15, 2019
284a5e9
Merge branch 'master' of https://github.com/lebaongoc/VideoStoreAPI
lebaongoc May 15, 2019
b59d35c
added axtra test for rental
sjscotton May 17, 2019
13a12ec
Merge branch 'master' of https://github.com/lebaongoc/VideoStoreAPI
sjscotton May 17, 2019
01c0d5d
fixed typo in rentals controller
lebaongoc May 17, 2019
3ebb286
Merge branch 'master' of https://github.com/lebaongoc/VideoStoreAPI
lebaongoc May 17, 2019
1e23564
added tests to the custom method in movie model
lebaongoc May 17, 2019
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
24 changes: 24 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# 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 uploaded files in development
/storage/*
!/storage/.keep

.byebug_history

# Ignore master key for decrypting credentials and more.
/config/master.key
.DS_Store
1 change: 1 addition & 0 deletions .ruby-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ruby-2.5.1
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) { |repo| "https://github.com/#{repo}.git" }

ruby '2.5.1'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.2.3'
# Use postgresql as the database for Active Record
gem 'pg', '>= 0.18', '< 2.0'
# Use Puma as the app server
gem 'puma', '~> 3.11'
# 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 ActiveStorage variant
# gem 'mini_magick', '~> 4.8'

# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development

# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '>= 1.1.0', require: false

# 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
169 changes: 169 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
GEM
remote: https://rubygems.org/
specs:
actioncable (5.2.3)
actionpack (= 5.2.3)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
actionmailer (5.2.3)
actionpack (= 5.2.3)
actionview (= 5.2.3)
activejob (= 5.2.3)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
actionpack (5.2.3)
actionview (= 5.2.3)
activesupport (= 5.2.3)
rack (~> 2.0)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (5.2.3)
activesupport (= 5.2.3)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.3)
activejob (5.2.3)
activesupport (= 5.2.3)
globalid (>= 0.3.6)
activemodel (5.2.3)
activesupport (= 5.2.3)
activerecord (5.2.3)
activemodel (= 5.2.3)
activesupport (= 5.2.3)
arel (>= 9.0)
activestorage (5.2.3)
actionpack (= 5.2.3)
activerecord (= 5.2.3)
marcel (~> 0.3.1)
activesupport (5.2.3)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
ansi (1.5.0)
arel (9.0.0)
bootsnap (1.4.4)
msgpack (~> 1.0)
builder (3.2.3)
byebug (11.0.1)
coderay (1.1.2)
concurrent-ruby (1.1.5)
crass (1.0.4)
erubi (1.8.0)
ffi (1.10.0)
globalid (0.4.2)
activesupport (>= 4.2.0)
i18n (1.6.0)
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.3)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
mail (2.7.1)
mini_mime (>= 0.1.1)
marcel (0.3.3)
mimemagic (~> 0.3.2)
method_source (0.9.2)
mimemagic (0.3.3)
mini_mime (1.0.1)
mini_portile2 (2.4.0)
minitest (5.11.3)
minitest-rails (3.0.0)
minitest (~> 5.8)
railties (~> 5.0)
minitest-reporters (1.3.6)
ansi
builder
minitest (>= 5.0)
ruby-progressbar
msgpack (1.2.10)
nio4r (2.3.1)
nokogiri (1.10.3)
mini_portile2 (~> 2.4.0)
pg (1.1.4)
pry (0.12.2)
coderay (~> 1.1.0)
method_source (~> 0.9.0)
pry-rails (0.3.9)
pry (>= 0.10.4)
puma (3.12.1)
rack (2.0.7)
rack-test (1.1.0)
rack (>= 1.0, < 3)
rails (5.2.3)
actioncable (= 5.2.3)
actionmailer (= 5.2.3)
actionpack (= 5.2.3)
actionview (= 5.2.3)
activejob (= 5.2.3)
activemodel (= 5.2.3)
activerecord (= 5.2.3)
activestorage (= 5.2.3)
activesupport (= 5.2.3)
bundler (>= 1.3.0)
railties (= 5.2.3)
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.2.3)
actionpack (= 5.2.3)
activesupport (= 5.2.3)
method_source
rake (>= 0.8.7)
thor (>= 0.19.0, < 2.0)
rake (12.3.2)
rb-fsevent (0.10.3)
rb-inotify (0.10.0)
ffi (~> 1.0)
ruby-progressbar (1.10.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.2)
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.3)
thread_safe (0.3.6)
tzinfo (1.2.5)
thread_safe (~> 0.1)
websocket-driver (0.7.0)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.3)

PLATFORMS
ruby

DEPENDENCIES
bootsnap (>= 1.1.0)
byebug
listen (>= 3.0.5, < 3.2)
minitest-rails
minitest-reporters
pg (>= 0.18, < 2.0)
pry-rails
puma (~> 3.11)
rails (~> 5.2.3)
spring
spring-watcher-listen (~> 2.0.0)
tzinfo-data

RUBY VERSION
ruby 2.5.1p57

BUNDLED WITH
1.17.3
9 changes: 9 additions & 0 deletions Guardfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
guard :minitest, autorun: false, spring: true do
watch(%r{^app/(.+).rb$}) { |m| "test/#{m[1]}_test.rb" }
watch(%r{^app/controllers/application_controller.rb$}) { 'test/controllers' }
watch(%r{^app/controllers/(.+)_controller.rb$}) { |m| "test/integration/#{m[1]}_test.rb" }
watch(%r{^app/views/(.+)_mailer/.+}) { |m| "test/mailers/#{m[1]}_mailer_test.rb" }
watch(%r{^lib/(.+).rb$}) { |m| "test/lib/#{m[1]}_test.rb" }
watch(%r{^test/.+_test.rb$})
watch(%r{^test/test_helper.rb$}) { 'test' }
end
Binary file added IMG_4582.HEIC
Binary file not shown.
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 status: :ok, json: customers.as_json(only: [:id, :name, :registered_at, :postal_code, :phone, :movies_checked_out_count])
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 @@
require "pry"
Copy link

Choose a reason for hiding this comment

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

Don't forget to get rid of this before submission! If anything, you likely wouldn't need to have this line, since pry is an included gem in the Gemfile


class MoviesController < ApplicationController
def index
movies = Movie.all
render status: :ok, json: movies.as_json(only: [:id, :title, :release_date])
end

def show
id = params[:id]
movie = Movie.find_by(id: id)
if movie
render json: movie.as_json(only: [:id, :title, :overview, :release_date, :inventory, :available_inventory]), status: :ok
else
render json: {errors: ["The movie with id #{id} was not found"]}, status: :not_found
end
end

def create
movie = Movie.new(movie_params)

movie.release_date = Date.parse(params[:release_date])

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
params.permit(:title, :overview, :release_date, :inventory)
end
end
56 changes: 56 additions & 0 deletions app/controllers/rentals_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@

class RentalsController < ApplicationController
before_action :find_customer, only: [:checkout, :checkin]
before_action :find_movie, only: [:checkout, :checkin]

def checkout
unless Movie.checkout_inventory(@movie)
render json: {errors: ["There are no copies of movie #{@movie.id} available"]}, status: :bad_request
return
end

rental = Rental.new(movie_id: @movie.id, customer_id: @customer.id)
cur_date = Date.today
rental.checkout_date = cur_date
rental.due_date = cur_date + 7
Copy link

Choose a reason for hiding this comment

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

Maybe this above work (setting rental's checkout_date and due_date) can also be pulled into an instance method on Rental


if rental.save
@customer.checkout_movies_count
render json: {id: rental.id}, status: :ok
else
render json: {errors: rental.errors.messages},
status: :bad_request
end
end

def checkin
successful = Movie.checkin_inventory(@movie, @customer)

if successful
render json: {ok: "Successfully checked in movie"}
else
render json: {errors: "This movie has not been checked out"}, status: :bad_request
end
end

private

def find_movie
movie_id = params[:movie_id]
@movie = Movie.find_by(id: movie_id)
unless @movie
render json: {errors: ["The movie with id #{movie_id} was not found"]}, status: :not_found
return
end
end

def find_customer
customer_id = params[:customer_id]
@customer = Customer.find_by(id: customer_id)

unless @customer
render json: {errors: ["The customer with id #{customer_id} was not found"]}, status: :not_found
return
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.
Loading