Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
ea894fa
rails app initiated
marshi23 Nov 5, 2018
2fff523
models created
marshi23 Nov 5, 2018
f1ae420
added foreign keys migration
Nov 5, 2018
2967049
added foreign keys
Nov 5, 2018
c8ce3d6
validations added
marshi23 Nov 5, 2018
1b53b13
added two customer model tests, both passing
Nov 5, 2018
cf68a41
added third customer model test
Nov 5, 2018
cb55128
movie tests added
marshi23 Nov 5, 2018
e6ce34a
testing
marshi23 Nov 5, 2018
5f17609
created controllers
Nov 5, 2018
edc5eda
movie model test done
marshi23 Nov 5, 2018
ac5a4d5
Merge branch 'master' of https://github.com/marshi23/VideoStoreAPI
marshi23 Nov 5, 2018
853030b
added show method, works
Nov 6, 2018
236d480
returning customers working
marshi23 Nov 6, 2018
9c86988
merging
marshi23 Nov 6, 2018
e0b3dd5
added two controller tests, both passing
Nov 6, 2018
394c72f
three controller tests, all passing
Nov 6, 2018
3133cea
seven tests in movie controller, all passing
Nov 6, 2018
8a6a67b
customer controller tests added, checkout added
marshi23 Nov 6, 2018
76ada12
Merge branch 'master' of https://github.com/marshi23/VideoStoreAPI
marshi23 Nov 6, 2018
8080a96
checking updates
Nov 7, 2018
a8188ae
checkout function working
marshi23 Nov 7, 2018
2ac4e38
all movie controller tests passing
Nov 7, 2018
0d4d47d
all movie controller tests passing
Nov 7, 2018
59f0ffe
Merge branch 'master' of https://github.com/marshi23/VideoStoreAPI
marshi23 Nov 7, 2018
a7f3786
customers movie count bug fix
marshi23 Nov 7, 2018
b68c5ec
all tests passing, except smoke avail_inventory
Nov 7, 2018
7f99d38
Merge branch 'master' of https://github.com/marshi23/VideoStoreAPI
Nov 7, 2018
0972807
all tests passing, including smoke
Nov 7, 2018
aa5145f
added one rental test, passing
Nov 7, 2018
72e8e0f
rental model test for checkout action added
marshi23 Nov 7, 2018
2c629f2
Merge branch 'master' of https://github.com/marshi23/VideoStoreAPI
marshi23 Nov 7, 2018
80d5e5a
fixing tests that broke, one or two left
Nov 8, 2018
950c4ee
fixed test, all tests passing
Nov 9, 2018
1555d09
sorting out checkin method
Nov 9, 2018
f1948c8
rental test added"
marshi23 Nov 9, 2018
2778034
merging versions
marshi23 Nov 9, 2018
e0f4ffc
space cleanup
marshi23 Nov 9, 2018
5d352e3
merging files
Nov 9, 2018
866bb84
merging
marshi23 Nov 9, 2018
7160f0d
adding test
marshi23 Nov 9, 2018
e167b1a
checkin controller action added
marshi23 Nov 9, 2018
62cf4be
pushing up changes
Nov 9, 2018
6a22ddb
rental controller checkin update
marshi23 Nov 9, 2018
2473886
checkin path test working
marshi23 Nov 9, 2018
b663200
tests passing
marshi23 Nov 9, 2018
ff383b0
changing tests and amending code
Nov 10, 2018
38e7317
all tests passing properly
Nov 10, 2018
cfd6136
need to add expectation to rentals controller inventory
Nov 10, 2018
88677a6
fixed last test, all green
Nov 13, 2018
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
Binary file added .DS_Store
Binary file not shown.
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
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.1'
# 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.1)
actionpack (= 5.2.1)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
actionmailer (5.2.1)
actionpack (= 5.2.1)
actionview (= 5.2.1)
activejob (= 5.2.1)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
actionpack (5.2.1)
actionview (= 5.2.1)
activesupport (= 5.2.1)
rack (~> 2.0)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (5.2.1)
activesupport (= 5.2.1)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.3)
activejob (5.2.1)
activesupport (= 5.2.1)
globalid (>= 0.3.6)
activemodel (5.2.1)
activesupport (= 5.2.1)
activerecord (5.2.1)
activemodel (= 5.2.1)
activesupport (= 5.2.1)
arel (>= 9.0)
activestorage (5.2.1)
actionpack (= 5.2.1)
activerecord (= 5.2.1)
marcel (~> 0.3.1)
activesupport (5.2.1)
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.3.2)
msgpack (~> 1.0)
builder (3.2.3)
byebug (10.0.2)
coderay (1.1.2)
concurrent-ruby (1.1.1)
crass (1.0.4)
erubi (1.7.1)
ffi (1.9.25)
globalid (0.4.1)
activesupport (>= 4.2.0)
i18n (1.1.1)
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.1)
mimemagic (0.3.2)
mini_mime (1.0.1)
mini_portile2 (2.3.0)
minitest (5.11.3)
minitest-rails (3.0.0)
minitest (~> 5.8)
railties (~> 5.0)
minitest-reporters (1.3.5)
ansi
builder
minitest (>= 5.0)
ruby-progressbar
msgpack (1.2.4)
nio4r (2.3.1)
nokogiri (1.8.5)
mini_portile2 (~> 2.3.0)
pg (1.1.3)
pry (0.12.0)
coderay (~> 1.1.0)
method_source (~> 0.9.0)
pry-rails (0.3.6)
pry (>= 0.10.4)
puma (3.12.0)
rack (2.0.5)
rack-test (1.1.0)
rack (>= 1.0, < 3)
rails (5.2.1)
actioncable (= 5.2.1)
actionmailer (= 5.2.1)
actionpack (= 5.2.1)
actionview (= 5.2.1)
activejob (= 5.2.1)
activemodel (= 5.2.1)
activerecord (= 5.2.1)
activestorage (= 5.2.1)
activesupport (= 5.2.1)
bundler (>= 1.3.0)
railties (= 5.2.1)
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.1)
actionpack (= 5.2.1)
activesupport (= 5.2.1)
method_source
rake (>= 0.8.7)
thor (>= 0.19.0, < 2.0)
rake (12.3.1)
rb-fsevent (0.10.3)
rb-inotify (0.9.10)
ffi (>= 0.5.0, < 2)
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.0)
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.1)
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.
10 changes: 10 additions & 0 deletions app/controllers/customers_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class CustomersController < ApplicationController
# protect_from_forgery with: :null_session

def index
customers = Customer.all
# customers.movies_checked_out_count
render json: customers.as_json( only: [:id, :name, :registered_at, :postal_code,
:phone, :movies_checked_out_count] ), status: :ok
end
end
34 changes: 34 additions & 0 deletions app/controllers/movies_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
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.nil?
render status: :not_found

else

render json: movie.as_json(only: [:title, :overview, :release_date, :inventory]), status: :ok
end
end

def create
@movie = Movie.new(movie_params)
@movie.save!

Choose a reason for hiding this comment

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

You should return a json response if the move wasn't able to be saved. Provide error messages.

render json: {
id: @movie.id,
overview: @movie.overview }, status: :ok
end
end



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

def checkout

if rental_params[:customer_id] && rental_params[:movie_id]
rental = Rental.checkout!(rental_params[:customer_id], rental_params[:movie_id])
render json: { ok: true, message: 'Checkout successful!' }, status: :ok
else
render json: { ok: false, message: 'Unable to checkout' },

Choose a reason for hiding this comment

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

This wouldn't be a not found but rather a bad request.

status: :not_found
end

rescue ArgumentError
render json: { ok: false, message: 'Unable to checkout: movie or customer does not exist' }, status: :not_found

Choose a reason for hiding this comment

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

Again, not_found is probably not the right response here.

end

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

if rental_params[:customer_id] && rental_params[:movie_id]
rental.checkin(rental_params[:customer_id],rental_params[:movie_id])
render json: { ok: true, message: 'Checkin successful!' }, status: :ok
else
render json: { ok: false, message: 'Unable to checkin' },
status: :not_found
end

rescue ArgumentError
render json: { ok: false, message: 'Unable to checkin: movie or customer does not exist' }, status: :not_found
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: '[email protected]'
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.
15 changes: 15 additions & 0 deletions app/models/customer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
class Customer < ApplicationRecord
has_many :rentals, :foreign_key => :customer_id

validates :name, presence: true
validates :registered_at, presence: true
validates :address, presence: true
validates :city, presence: true
validates :state, presence: true
validates :postal_code, presence: true
validates :phone, presence: true

# def movies_checked_out_count
# self[:movies_checked_out_count] || 0
# end
end
8 changes: 8 additions & 0 deletions app/models/movie.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
class Movie < ApplicationRecord
has_many :rentals, :foreign_key => :movie_id

validates :title, presence: true
validates :overview, presence: true
validates :release_date, presence: true
validates :inventory, numericality: true
end
Loading