Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
89bd6c4
added rails app
alexandria7 May 14, 2019
3989bc5
added movies controller and movie model
alexandria7 May 14, 2019
0dcc41b
routes for Movies controller
alexandria7 May 14, 2019
b163928
added Customer to be able to use seeds
alexandria7 May 14, 2019
211a03b
added validations for movie
alexandria7 May 14, 2019
374b02e
added presence requirement for movie inventory
alexandria7 May 14, 2019
abc7b01
updated movies fixtures
alexandria7 May 14, 2019
e92e000
added tests for movie validations
alexandria7 May 14, 2019
4368f4f
created rental model
alexandria7 May 14, 2019
7eb6e25
added validations for customer
alexandria7 May 14, 2019
4bd80d5
updated customer fixtures
alexandria7 May 14, 2019
b203f39
added basic customer tests
alexandria7 May 14, 2019
5e46be8
Merge branch 'master' into rental-model
alexandria7 May 14, 2019
b20b62a
deleted down migration file until we know how we want to set up renta…
alexandria7 May 14, 2019
c69105d
added initial test for rental
alexandria7 May 14, 2019
af417bc
movies index action and tests
alexandria7 May 14, 2019
b3270e6
movies show action and tests
alexandria7 May 14, 2019
66ef0e2
added relationship to customer model
Bitaman May 15, 2019
a46c38d
added the actions to the customer controller
Bitaman May 15, 2019
883d356
added validation test to customer all model tests are passing
Bitaman May 15, 2019
6e8d9d0
changed the data required in render json for customer
Bitaman May 15, 2019
6d35b96
added tests for create action
alexandria7 May 15, 2019
6aaf0d7
strengthened test for show
alexandria7 May 15, 2019
4aac60b
commented out test route and method
alexandria7 May 15, 2019
045108b
Merge branch 'am-movies-setup' into relationships
alexandria7 May 15, 2019
427c9c8
added relationships between models
alexandria7 May 15, 2019
dbb67aa
added initial rental model test
alexandria7 May 15, 2019
be45d2a
changed JSON return values for index
alexandria7 May 15, 2019
63a2e3a
changed back json returns for index
alexandria7 May 15, 2019
9da7e95
added json test for each action
alexandria7 May 15, 2019
6d899c7
movies controller tests passing and complete
alexandria7 May 15, 2019
d9a8dc9
fixed movie params
alexandria7 May 15, 2019
e74cf4b
merge conflicts resolved
alexandria7 May 15, 2019
6dce3f9
added relationship tests for rental, all passing
Bitaman May 15, 2019
eabe72c
added available_inventory model method
alexandria7 May 15, 2019
9715a7f
added available_inventory method and added it to show method
alexandria7 May 15, 2019
87f3dff
added tests for custom method available_inventory
alexandria7 May 15, 2019
e75c6fc
Merge branch 'master' of https://github.com/alexandria7/VideoStoreAPI
alexandria7 May 15, 2019
47969e8
fixed merge conflicts
alexandria7 May 15, 2019
3b99b02
tests for customer controller passing
Bitaman May 15, 2019
82f4864
Merge branch 'master' into bita-ctest
Bitaman May 15, 2019
d12dfe5
fixed test names
alexandria7 May 15, 2019
aab9723
Merge branch 'master' of https://github.com/alexandria7/VideoStoreAPI
alexandria7 May 15, 2019
d7c99e6
minor change in customer test
Bitaman May 15, 2019
8f4a3d7
pulled the master
Bitaman May 15, 2019
b8e89b0
edited models to have less validations
alexandria7 May 15, 2019
d3eb55c
Merge branch 'master' of https://github.com/alexandria7/VideoStoreAPI
alexandria7 May 15, 2019
addde17
added the movies checked out method to customer model
Bitaman May 15, 2019
c619405
fixed a test in customer
Bitaman May 15, 2019
77b0036
Merge branch 'master' of https://github.com/alexandria7/VideoStoreAPI
Bitaman May 15, 2019
a3b7bf2
added columns to movie and customer for keeping track of check out nu…
alexandria7 May 16, 2019
153fb37
updated movie model and tests to reflect available_inventory
alexandria7 May 16, 2019
095989b
removed movies_checked_out_count method from customer model
alexandria7 May 16, 2019
f3f312c
created rentals controller and added routes
alexandria7 May 16, 2019
7e980d8
fixed model method to set available inventory before movie creation
alexandria7 May 16, 2019
0b9c50e
wrote tests for checkout method
alexandria7 May 16, 2019
783a81c
added another test case for checkout method
alexandria7 May 16, 2019
af2640d
wrote passing nominal test for check in method
alexandria7 May 16, 2019
a948739
fixed typo
alexandria7 May 17, 2019
3cb864c
simplified check-in method and added negative case test
alexandria7 May 17, 2019
78aa691
added test to customer
Bitaman May 17, 2019
e21ebfa
Merge branch 'last-branch-ever' of https://github.com/alexandria7/Vid…
Bitaman May 17, 2019
90e29a3
edited movies controller index test to include negative case
alexandria7 May 17, 2019
df597a8
added the self method to rental
Bitaman May 17, 2019
6e85364
Merge branch 'last-branch-ever' of https://github.com/alexandria7/Vid…
Bitaman May 17, 2019
add374b
added the custom method test to rental
Bitaman 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
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.
14 changes: 14 additions & 0 deletions app/controllers/customers_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
class CustomersController < ApplicationController
def index
customer = Customer.all
render json: customer.as_json(only: [:id, :name, :registered_at, :postal_code, :phone, :movies_checked_out_count]), status: :ok
end



private

def customer_params
params.permit(:id, :name, :registered_at, :postal_code, :phone)
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 @@
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, :available_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 json: {ok: false, error_message: "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]), status: :ok
else
render json: {ok: false, errors: movie.errors.messages},
status: :bad_request
end
end

# def zomg
# render json: {message: "it works!"}
# end

private

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

if rental.movie.available_inventory > 0

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 rental.save
rental.movie.available_inventory -= 1
rental.movie.save

rental.customer.movies_checked_out_count += 1
rental.customer.save


render json: rental.as_json(only: [:id, :customer_id, :movie_id, :check_out, :due_date]), status: :ok
else
render json: {ok: false, errors: rental.errors.messages},
status: :bad_request
end
else
render json: {ok: false, error_message: "No available inventory"}, status: :bad_request
end
end

def check_in
rental = Rental.find_by(rental_params)

if rental
rental.movie.available_inventory += 1
rental.movie.save

rental.customer.movies_checked_out_count -= 1
rental.customer.save

render json: rental.as_json(only: [:id, :customer_id, :movie_id]), status: :ok
else
render json: {ok: false, error_message: "Could not find rental"}, status: :not_found
end
end

private

def rental_params
params.permit(:customer_id, :movie_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.
6 changes: 6 additions & 0 deletions app/models/customer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
class Customer < ApplicationRecord
validates :name, presence: true

has_many :rentals, dependent: :destroy
has_many :movies, through: :rentals
end
Loading