Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ampers: Mariko, Kate, and Katie #10

Open
wants to merge 46 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
9622481
new rails project for api setup complete
kcforsman May 7, 2018
9ea204a
generated customer and movie models to match seed data/ERD
kcforsman May 7, 2018
01e65d5
adds tests for customer model and validations
marikoja May 7, 2018
dce714d
creates model validations and tests
Oh-KPond May 7, 2018
4cf305f
Merge branch 'master' of github.com:kcforsman/VideoStoreAPI into feat…
Oh-KPond May 7, 2018
13effd2
Merge pull request #1 from kcforsman/feature_model-test
marikoja May 7, 2018
85421ec
added routes for movies and customers endpoints, and generated movies…
kcforsman May 7, 2018
0198d23
added method to the index action in the Movies Controller...oops we'l…
kcforsman May 7, 2018
242ddf4
adds customer controller index action
marikoja May 7, 2018
048a402
Merge branch 'master' of https://github.com/kcforsman/VideoStoreAPI
marikoja May 7, 2018
013f21d
adds movies_checked_out_count to customers model
marikoja May 7, 2018
4d32360
adds movies_checked_out_count to customer controller
marikoja May 7, 2018
7b1b37c
added nominal customer controller tests for the index action
kcforsman May 7, 2018
29ad211
updated customers controller test for index action to include test fo…
kcforsman May 7, 2018
1532046
movies index controlller tests
marikoja May 7, 2018
3b15c18
Merge branch 'master' of https://github.com/kcforsman/VideoStoreAPI
marikoja May 7, 2018
c1eaa88
adds all movies controller index tests, refactors customer controller…
marikoja May 7, 2018
657d931
updates movies yml file to have valid data (4 total)
kcforsman May 8, 2018
b805ebc
TDD for show action in movie controller
kcforsman May 8, 2018
d6e6f5c
created two migration to add column to movies table for available_inv…
kcforsman May 8, 2018
919906f
added available_inventory to the json response for the movie show act…
kcforsman May 8, 2018
a558f66
creates tests for the create method in the movies controller
Oh-KPond May 8, 2018
b9aee67
adds protect_from_forgery
Oh-KPond May 8, 2018
a85bafe
creates code for the create method for movies
Oh-KPond May 8, 2018
54b59e4
remove commented out code
Oh-KPond May 8, 2018
24140d2
Merge pull request #2 from kcforsman/feature_tests-and-code-movies-co…
marikoja May 8, 2018
b57162e
changes code to get smoke tests working
Oh-KPond May 8, 2018
036da8d
Merge pull request #3 from kcforsman/ex_removing-movie-from-params
kcforsman May 8, 2018
5ef36b2
generated Rental model with necessary attributes
kcforsman May 8, 2018
4544050
updated schema with the rental model details
kcforsman May 8, 2018
7fa7579
tets for RentalsController checkout and check_out action for RentalsC…
marikoja May 8, 2018
7445271
refactored check out action in rental controller to pass negative cas…
kcforsman May 8, 2018
e853e4c
rentals_controller check_in code and error handling and testing
kcforsman May 8, 2018
9457dd4
creates test for movie relationships to rentals
Oh-KPond May 9, 2018
d39749b
Merge pull request #4 from kcforsman/feature_movie-relationship-test
kcforsman May 9, 2018
dbceeda
adds tests for rental model validation tests and relationship tests
kcforsman May 9, 2018
ca24b26
Merge pull request #5 from kcforsman/rental-model-tests
Oh-KPond May 9, 2018
84f65cb
relationship testing customer has many rentals
marikoja May 9, 2018
212180a
Merge pull request #6 from kcforsman/customer_relationship_testing
Oh-KPond May 9, 2018
1243782
changed the movie create method to set the available inventory within…
kcforsman May 10, 2018
52e87d0
added logic to rental controller checkout and checkin to allow for 'i…
kcforsman May 10, 2018
fdbce8c
added conditional for rental check_out method so number of rentals ca…
kcforsman May 11, 2018
88cad2e
updates yml files to account for available inventory and customers mo…
kcforsman May 11, 2018
6528651
updated tests to handle foreign key violations from adjusted code and…
kcforsman May 11, 2018
c931c6e
rentals controller tests checkout inventory management
marikoja May 11, 2018
445f1dc
rental controller tests for checkin inventory management and updates …
marikoja May 11, 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
16 changes: 16 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# 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

.byebug_history
50 changes: 50 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
source 'https://rubygems.org'

git_source(:github) do |repo_name|
repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
"https://github.com/#{repo_name}.git"
end


# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.1.6'
# Use postgresql as the database for Active Record
gem 'pg', '>= 0.18', '< 2.0'
# Use Puma as the app server
gem 'puma', '~> 3.7'
# 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 Capistrano for deployment
# gem 'capistrano-rails', group: :development

# 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
154 changes: 154 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
GEM
remote: https://rubygems.org/
specs:
actioncable (5.1.6)
actionpack (= 5.1.6)
nio4r (~> 2.0)
websocket-driver (~> 0.6.1)
actionmailer (5.1.6)
actionpack (= 5.1.6)
actionview (= 5.1.6)
activejob (= 5.1.6)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
actionpack (5.1.6)
actionview (= 5.1.6)
activesupport (= 5.1.6)
rack (~> 2.0)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (5.1.6)
activesupport (= 5.1.6)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.3)
activejob (5.1.6)
activesupport (= 5.1.6)
globalid (>= 0.3.6)
activemodel (5.1.6)
activesupport (= 5.1.6)
activerecord (5.1.6)
activemodel (= 5.1.6)
activesupport (= 5.1.6)
arel (~> 8.0)
activesupport (5.1.6)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
ansi (1.5.0)
arel (8.0.0)
builder (3.2.3)
byebug (10.0.2)
coderay (1.1.2)
concurrent-ruby (1.0.5)
crass (1.0.4)
erubi (1.7.1)
ffi (1.9.23)
globalid (0.4.1)
activesupport (>= 4.2.0)
i18n (1.0.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.2)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
mail (2.7.0)
mini_mime (>= 0.1.1)
method_source (0.9.0)
mini_mime (1.0.0)
mini_portile2 (2.3.0)
minitest (5.11.3)
minitest-rails (3.0.0)
minitest (~> 5.8)
railties (~> 5.0)
minitest-reporters (1.2.0)
ansi
builder
minitest (>= 5.0)
ruby-progressbar
nio4r (2.3.1)
nokogiri (1.8.2)
mini_portile2 (~> 2.3.0)
pg (1.0.0)
pry (0.11.3)
coderay (~> 1.1.0)
method_source (~> 0.9.0)
pry-rails (0.3.6)
pry (>= 0.10.4)
puma (3.11.4)
rack (2.0.5)
rack-test (1.0.0)
rack (>= 1.0, < 3)
rails (5.1.6)
actioncable (= 5.1.6)
actionmailer (= 5.1.6)
actionpack (= 5.1.6)
actionview (= 5.1.6)
activejob (= 5.1.6)
activemodel (= 5.1.6)
activerecord (= 5.1.6)
activesupport (= 5.1.6)
bundler (>= 1.3.0)
railties (= 5.1.6)
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.1.6)
actionpack (= 5.1.6)
activesupport (= 5.1.6)
method_source
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rake (12.3.1)
rb-fsevent (0.10.3)
rb-inotify (0.9.10)
ffi (>= 0.5.0, < 2)
ruby-progressbar (1.9.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.1)
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.6.5)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.3)

PLATFORMS
ruby

DEPENDENCIES
byebug
listen (>= 3.0.5, < 3.2)
minitest-rails
minitest-reporters
pg (>= 0.18, < 2.0)
pry-rails
puma (~> 3.7)
rails (~> 5.1.6)
spring
spring-watcher-listen (~> 2.0.0)
tzinfo-data

BUNDLED WITH
1.16.1
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.
6 changes: 6 additions & 0 deletions app/controllers/customers_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
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
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])
end

def show
movie = Movie.find_by(id: params[:id])
if movie
render json: movie.as_json(only: [:inventory, :overview, :release_date, :title, :available_inventory])
else
render json: {ok: false, errors: "Movie not found"}, status: :not_found
end
end

def create
movie = Movie.new(movies_params)
movie.available_inventory = params["inventory"]
if movie.save
render json: {id: movie.id}, status: :ok
else
render json: {ok: false, errors: movie.errors}, status: :bad_request
end
end
end

private

def movies_params
# tests expect that params should not be nested inside movie
return params.permit(:title, :release_date, :inventory, :overview)
end
46 changes: 46 additions & 0 deletions app/controllers/rentals_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
class RentalsController < ApplicationController
def check_out
customer = Customer.find_by(id: params[:customer_id])

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

if customer && movie
if movie.available_inventory > 0
rental = Rental.new(customer: customer, movie: movie, checkout_date: Date.today, due_date: Date.today + 7.days)
customer.movies_checked_out_count += 1

Choose a reason for hiding this comment

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

This kind of business logic really doesn't go here.

movie.available_inventory -= 1
if rental.save && movie.save && customer.save
render json: { status: 200}
else
render json: { ok: false, errors: rental.errors}, status: :bad_request
end
else
render json: { ok: false, errors: "Sorry, not enough inventory"}, status: 404
end
else
render json: { ok: false, errors: "Invalid movie or customer"}, status: 404
end
end

def check_in
customer = Customer.find_by(id: params[:customer_id])
movie = Movie.find_by(id: params[:movie_id])
if customer && movie
rental = Rental.find_by(customer: customer, movie: movie, returned: false)
if rental
rental.returned = true
customer.movies_checked_out_count -= 1

Choose a reason for hiding this comment

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

ditto on business logic

movie.available_inventory += 1
if rental.save && movie.save && customer.save
render json: { status: 200}
else
render json: { ok: false, errors: "Something went wrong."}, status: :bad_request
end
else
render json: { ok: false, errors: "Invalid rental"}, status: 404
end
else
render json: { ok: false, errors: "Invalid movie or customer"}, status: 404
end
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
4 changes: 4 additions & 0 deletions app/models/application_record.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true

end
Empty file added app/models/concerns/.keep
Empty file.
5 changes: 5 additions & 0 deletions app/models/customer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class Customer < ApplicationRecord
validates :name, :registered_at, :address, :city, :state, :postal_code, :phone, presence: true

has_many :rentals
end
5 changes: 5 additions & 0 deletions app/models/movie.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class Movie < ApplicationRecord
validates :title, :release_date, :inventory, presence: true

has_many :rentals
end
7 changes: 7 additions & 0 deletions app/models/rental.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
class Rental < ApplicationRecord
belongs_to :movie
belongs_to :customer

validates :checkout_date, :due_date, presence: true
validates_inclusion_of :returned, in: [true, false]
end
13 changes: 13 additions & 0 deletions app/views/layouts/mailer.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
/* Email styles need to be inline */
</style>
</head>

<body>
<%= yield %>
</body>
</html>
1 change: 1 addition & 0 deletions app/views/layouts/mailer.text.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<%= yield %>
3 changes: 3 additions & 0 deletions bin/bundle
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#!/usr/bin/env ruby
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
load Gem.bin_path('bundler', 'bundle')
9 changes: 9 additions & 0 deletions bin/rails
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/usr/bin/env ruby
begin
load File.expand_path('../spring', __FILE__)
rescue LoadError => e
raise unless e.message.include?('spring')
end
APP_PATH = File.expand_path('../config/application', __dir__)
require_relative '../config/boot'
require 'rails/commands'
Loading