Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
f22f4d2
rails app created, zomg route initiated but no action taken yet
shirley1chu May 14, 2019
b2e58e5
model and controllers created for movie and customer, routes updated
jillirami May 14, 2019
1a0a233
validations ammended
jillirami May 14, 2019
2cc94db
customer model validation tests written and passed
shirley1chu May 14, 2019
98ba325
movie model testing
jillirami May 14, 2019
635d700
Merge pull request #1 from jillirami/jrmoviemodeltests
jillirami May 14, 2019
971bf23
zomg works! also added customer controller tests
shirley1chu May 14, 2019
3dc1b03
customer index controller tests passed
shirley1chu May 14, 2019
2ab3df4
edge case tested
shirley1chu May 14, 2019
d5dcc5c
Merge branch 'master' of https://github.com/jillirami/VideoStoreAPI
shirley1chu May 14, 2019
221337a
movie controller and controller tests added
jillirami May 14, 2019
1c60093
date parsed from string input, movie controller
jillirami May 14, 2019
a8c83bc
updated for available inventory requirement
jillirami May 14, 2019
2748c19
removed required param from movie controller
jillirami May 14, 2019
69a1d9d
got rid of require in customer controller
shirley1chu May 14, 2019
8dae7b5
Merge branch 'master' of https://github.com/jillirami/VideoStoreAPI
shirley1chu May 14, 2019
2c8613a
rental model and controller created, foreign keys added to schema
jillirami May 14, 2019
d313caf
movie model and controller tests refactored for validation flexibility
shirley1chu May 15, 2019
581df1a
customer model and controller tests refactored
shirley1chu May 15, 2019
297083e
rental schema updated, and controller actions created
jillirami May 15, 2019
90ebc49
corrected checkin action
jillirami May 15, 2019
aa3321d
checkout tests initiated, invalid rental data test has errors
shirley1chu May 15, 2019
4e98c48
refactor of movie checkout method in customer model
jillirami May 16, 2019
bf8c422
removed commented out code in customer controller test
jillirami May 16, 2019
b19cc42
Merge pull request #2 from jillirami/jrcheckintestingcontinued
jillirami May 16, 2019
c89b5cd
added rental availiability custom validation, checkout tests passed
shirley1chu May 16, 2019
31ed619
all rental model validation tests written and passed
shirley1chu May 16, 2019
6660c87
Merge branch 'master' of https://github.com/jillirami/VideoStoreAPI
shirley1chu May 16, 2019
45f2545
rental model tests merged in, all tests passing
shirley1chu May 16, 2019
c8367c7
testing for checkin function complete
jillirami 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
23 changes: 23 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# 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
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.16.6
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
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.
11 changes: 11 additions & 0 deletions app/controllers/customers_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
class CustomersController < ApplicationController
def index
customers = Customer.all
render status: :ok, json: customers.as_json(only: [:name, :phone, :postal_code, :registered_at, :id], methods: [:movies_checked_out_count])
end

Choose a reason for hiding this comment

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

I would probably split line 4 across multiple lines.


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

def create
movie = Movie.new(movie_params)

if params[:release_date]
movie.release_date = Date.parse(params[:release_date]).strftime('%Y-%m-%d')
end

Choose a reason for hiding this comment

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

Since release_date is a column of type date, postgres should handle this parsing automatically.


if movie.save
render json: { id: movie.id }, status: :ok
else
render json: { ok: false, errors: movie.errors.messages },
status: :bad_request
end
end

private

def movie_params
params.permit(:title, :overview, :release_date, :inventory)
end
end
49 changes: 49 additions & 0 deletions app/controllers/rentals_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
require "date"

class RentalsController < ApplicationController
def checkout
rental = Rental.new(rental_params)
rental.checkout_date = Date.today
rental.due_date = Date.today + 1.week

Choose a reason for hiding this comment

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

This controller action is doing a ton of work! Would it be possible to extract this to a model method, maybe something like Rental.check_out(customer_id, movie_id)? This would make testing easier too.


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

unless movie
render json: { ok: false, errors: rental.errors.messages },

Choose a reason for hiding this comment

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

Since Rental has a belongs_to relationship with Movie, this check should be made automatically.

Also, on line 12 you haven't called rental.save or rental.valid? yet, so rental.errors will be empty.

status: :bad_request
return
end

if rental.save
movie.reduce_inventory
render json: rental.as_json(only: [:customer_id, :movie_id]), status: :ok
else
render json: { ok: false, errors: rental.errors.messages },
status: :bad_request
end
end

def checkin
rental = Rental.find_by(customer_id: params[:customer_id], movie_id: params[:movie_id])

if rental
if rental.update(checkin_date: Date.today)
movie = Movie.find(rental.movie_id)
movie.increase_inventory

Choose a reason for hiding this comment

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

Again, it would probably make sense to move this into a model method.

render json: rental.as_json(only: [:customer_id, :movie_id]), status: :ok
else
render json: { ok: false, errors: rental.errors.messages },
status: :bad_request
end
else
render json: { ok: false, errors: { rental: ["Rental not found"] } },
status: :not_found
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: '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