Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
0cf7170
rails setup
MiraMarshall May 14, 2019
f638c22
added it works
MariaWissler May 14, 2019
930d788
added model validations
MariaWissler May 14, 2019
1d66f70
added controllers params
MariaWissler May 14, 2019
343bfd9
Passing movie model validation tests.
MiraMarshall May 15, 2019
49a5460
initiated test
MariaWissler May 15, 2019
d3c3cf6
updated branch removed typo
MiraMarshall May 15, 2019
b04a886
Merge pull request #1 from MiraMarshall/sm_movie_model_validations
MariaWissler May 15, 2019
2500df4
Merge branch 'master' into customer-model_test
MiraMarshall May 15, 2019
2495d9b
Merge pull request #2 from MiraMarshall/customer-model_test
MiraMarshall May 15, 2019
0be9948
Movie controller methods and tests.
MiraMarshall May 15, 2019
9398ef5
Merge pull request #3 from MiraMarshall/sm_movie_controller
MiraMarshall May 15, 2019
4b4291b
generated migration for checkout, duedate and available for rentals
MariaWissler May 15, 2019
25e4326
updates-testing
MariaWissler May 16, 2019
954c0d4
updates-testing
MariaWissler May 16, 2019
3ee08df
test for postman
MariaWissler May 17, 2019
5036899
movies and rentals controllers
MariaWissler May 17, 2019
5461cf1
corrected render json
MariaWissler May 17, 2019
4076896
updated model relationship
MariaWissler May 17, 2019
a3f9a16
Added migration available_inventory to movies
MiraMarshall May 17, 2019
fedf02f
check_out test passing
MariaWissler May 17, 2019
a896322
passing customer controller tests
MiraMarshall May 17, 2019
7e0e75b
added test for missing date for checkout
MariaWissler May 17, 2019
04ccc50
Merge pull request #4 from MiraMarshall/controller_tests_and_inventory
MariaWissler May 17, 2019
2f4a042
updates on rental controller test
MariaWissler May 17, 2019
eedb681
Merge pull request #5 from MiraMarshall/redo_rental_test
MiraMarshall May 17, 2019
1516a8b
Fixed checkout rental controller and inventory count
MariaWissler May 17, 2019
b9344c8
updates to test and rental controllers
MariaWissler May 17, 2019
2d0a617
checkout count working
MariaWissler May 19, 2019
73840d9
passing all smoke test, yay
MariaWissler May 19, 2019
093779c
update after running test again
MariaWissler May 19, 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.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
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.
21 changes: 21 additions & 0 deletions app/controllers/customers_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
class CustomersController < ApplicationController
def index
customers = Customer.all
render json: customers.as_json(only: [:id, :name, :registered_at, :postal_code, :phone, :movies_checked_out_count]), status: :ok
end

def show
customer = Customer.find_by(id: params[:id])
if customer
render status: :ok, json: customer.as_json(only: [:id, :name, :registered_at, :adress, :city, :state, :postal_code, :phone, :movies_checked_out_count]), 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: :not_found, json: { ok: false, messages: "Movie was not found!" }

Choose a reason for hiding this comment

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

This is a customer... Copy pasta is dangerous!

end
end

private

def customer_params
params.require(:customer).permit(:name, :registered_at, :postal_code, :phone, :movies_checked_out_count)
end
end
36 changes: 36 additions & 0 deletions app/controllers/movies_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
class MoviesController < ApplicationController
def index
movies = Movie.all
render json: movies.as_json(only: [:id, :available_inventory, :inventory, :overview, :release_date, :title]), 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, :available_inventory]),
status: :ok
else
render json: {ok: false, errors: ["Movie not found"]},
status: :not_found
end
end

def create
movie = Movie.new(movie_params)

if movie.save
render json: movie.as_json(only: [:id, :title, :overview, :release_date, :inventory, :available_inventory]),
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, :available_inventory)
end
end
51 changes: 51 additions & 0 deletions app/controllers/rentals_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
require "date"

class RentalsController < ApplicationController
def check_out
rental = Rental.new(rental_params)
customer = Customer.find_by(id: rental.customer_id)
movie = Movie.find_by(id: rental.movie_id)

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.


if movie.available_inventory == 0
render status: :not_found, json: { ok: false, mesages: "Movie not found" }
end

rental.check_out = Date.today
rental.due_date = rental.check_out + 7

if rental.save
render status: :ok, json: { id: rental.id }
customer_movie_count = customer.movies_checked_out_count
customer.update(movies_checked_out_count: customer_movie_count + 1)

movie_inventory = movie.available_inventory
movie.update(available_inventory: movie_inventory - 1)
else
render status: :bad_request, json: { ok: false, errors: rental.errors }
end
end

def check_in
rental = Rental.where(["movie_id = ? and customer_id = ?", params[:rental][:movie_id], params[:rental][:customer_id]]).first
rental.check_in = Date.today
customer = Customer.find_by(id: rental.customer_id)
movie = Movie.find_by(id: rental.movie_id)

if rental.save
render json: { id: rental.id }, status: :ok
customer_movie_count = customer.movies_checked_out_count
customer.update(movies_checked_out_count: customer_movie_count - 1)

movie_inventory = movie.available_inventory
movie.update(available_inventory: movie_inventory + 1)
else
render status: :not_found, json: { ok: false, mesages: "Movie 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
Loading