Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
12f0706
Initialized Rails app
kguadron May 14, 2019
e66835f
set up model and seed data
ChubbyCub May 14, 2019
b52effb
added column for movies checked out count
ChubbyCub May 14, 2019
dff8a39
added route for listing all customers
ChubbyCub May 14, 2019
181520e
Wrote index customer controller action and tests
kguadron May 14, 2019
cabeafb
Merge pull request #1 from kguadron/kg/customer
ChubbyCub May 14, 2019
ac0ccb0
added zomg route and message
ChubbyCub May 14, 2019
8f400b2
added a route for list all movies
ChubbyCub May 14, 2019
e6ff924
added index action and tests for movies controller
ChubbyCub May 14, 2019
f0e14f9
Merge pull request #2 from kguadron/elise-list-all-movies
ChubbyCub May 14, 2019
f2effd3
Wrote show action and tests for movies controller
kguadron May 14, 2019
cedb07c
Passing movie controller tests
kguadron May 14, 2019
718ea26
Merge pull request #3 from kguadron/kg/show_movie
ChubbyCub May 14, 2019
e9c334d
working on movie create action and tests
ChubbyCub May 14, 2019
185e001
adding validations for customer and movie
ChubbyCub May 14, 2019
3e48543
Merge pull request #4 from kguadron/elise-validating-date-format
kguadron May 14, 2019
7d9ca40
passed tests for create movie action
ChubbyCub May 14, 2019
475ff48
customer model validation tests
kguadron May 14, 2019
7d67bd8
Wrote movie model validation tests
kguadron May 14, 2019
641d9fb
added column available_inventory to movie controller
ChubbyCub May 14, 2019
94f88ab
Merge branch 'master' into kg-movie-validation-tests
kguadron May 14, 2019
12b4a59
Merge branch 'master' into elise-creating-new-movie
ChubbyCub May 14, 2019
a424a5a
Merge pull request #6 from kguadron/elise-creating-new-movie
ChubbyCub May 14, 2019
23ebf22
Merge pull request #7 from kguadron/kg-movie-validation-tests
ChubbyCub May 14, 2019
020c7d7
fixed permit
ChubbyCub May 14, 2019
1c4fb42
Edited movie controller and tests to pass smoke tests
kguadron May 14, 2019
b3a3cf4
added rental table and its relationship
ChubbyCub May 14, 2019
d5b301b
Added more movie controllers tests
kguadron May 15, 2019
557fc1d
added checkin and checkout columns
ChubbyCub May 15, 2019
f1a556c
added new column due date to rental
ChubbyCub May 15, 2019
46c86ae
working on tests for rental checkout action
ChubbyCub May 15, 2019
668aacf
successfully added default value to checkedout counts
ChubbyCub May 15, 2019
29b442d
Merge branch 'master' into rental-checkout
ChubbyCub May 15, 2019
c519957
passed checkout test still missing available inventory update
ChubbyCub May 15, 2019
2eee505
passed tests for checkout
ChubbyCub May 15, 2019
2bb26bf
Merge pull request #8 from kguadron/rental-checkout
kguadron May 15, 2019
06e9ce6
Passed postman smoke tests
kguadron May 15, 2019
437597c
Passed all rental tests and smoke tests
kguadron May 15, 2019
3868b4f
Added validation tests for rental model
kguadron May 15, 2019
a8c904b
Merge pull request #9 from kguadron/rental-checkin
ChubbyCub May 15, 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
2.0.1
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.
12 changes: 12 additions & 0 deletions app/controllers/customers_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
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

private

def customer_params
params.require(:customer).permit(:name, :registered_at, :address, :city, :state, :postal_code, :phone, :movies_checked_out_count, rental_ids: [])
end
end
33 changes: 33 additions & 0 deletions app/controllers/movies_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
class MoviesController < ApplicationController
def show
movie = Movie.find_by(id: params[:id])
if movie
render json: movie.as_json(only: [:id, :title, :release_date, :overview, :available_inventory, :inventory]), status: :ok

Choose a reason for hiding this comment

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

Small style note: not all text editors wrap lines for you. This line is so long that on GitHub I have to scroll horizontally to see all the pieces. You can make this easier to read by putting a newline after any given comma in a statement.

else
render status: :error, json: { errors: { id: "Movie does not exist" } }
end
end

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

def create
movie = Movie.new(movie_params)

if movie.save
current_inventory = movie.inventory
movie.update_attributes(available_inventory: current_inventory)
render status: :ok, json: movie.as_json(only: [:id, :title, :release_date])
else
render status: :bad_request, json: { "errors": movie.errors.messages }
end
end

private

def movie_params
return params.permit(:title, :overview, :release_date, :inventory, rental_ids: [])
end
end
52 changes: 52 additions & 0 deletions app/controllers/rentals_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
class RentalsController < ApplicationController
def check_out
rental = Rental.new(rental_params)
rental.check_out = Date.today
rental.due_date = Date.today + 7.days

if rental.save
customer = Customer.find_by(id: rental.customer_id)
customer.rental_ids << rental.id
checkouts = customer.movies_checked_out_count
checkouts += 1

Choose a reason for hiding this comment

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

You have a bunch of business logic here! Would it be possible to encapsulate this in a model method? Something like

rental.check_out(customer_id, movie_id)

might be a good interface. That would make this logic easier to test as well.

customer.update_attributes(movies_checked_out_count: checkouts)

movie = Movie.find_by(id: rental.movie_id)
movie.rental_ids << rental.id
inventory = movie.available_inventory
inventory -= 1
movie.update_attributes(available_inventory: inventory)

render status: :ok, json: rental.as_json(only: [:id, :check_out, :due_date])
else
render status: :bad_request, json: { "errors": rental.errors.messages }
end
end

def check_in
rental = Rental.find_by(customer_id: rental_params[:customer_id], movie_id: rental_params[:movie_id])

is_successful = rental.update_attributes(check_in: Date.today)
if is_successful
customer = Customer.find_by(id: rental.customer_id)
checkouts = customer.movies_checked_out_count
checkouts -= 1
customer.update_attributes(movies_checked_out_count: checkouts)

movie = Movie.find_by(id: rental.movie_id)
inventory = movie.available_inventory
inventory += 1
movie.update_attributes(available_inventory: inventory)

render status: :ok, json: rental.as_json(only: [:id, :check_out, :check_in, :due_date])
else
render status: :bad_request, json: { "errors": rental.errors.messages }
end
end

private

def rental_params
params.permit(:customer_id, :movie_id)
end
end
5 changes: 5 additions & 0 deletions app/controllers/zomg_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class ZomgController < ApplicationController
def index
render status: :ok, json: { message: "it works!" }
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