Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
998a625
new api project with movie and customer models
MyriamWD May 14, 2019
737f5fe
relationship in models
MyriamWD May 14, 2019
5e8b7c6
migrations
MyriamWD May 14, 2019
82bc010
added validations - test running
MyriamWD May 14, 2019
e9579eb
changed inventory validation to be greater than -1
evelynnkaplan May 14, 2019
e19ceea
validation tests for movie model
evelynnkaplan May 14, 2019
f4449de
added error message testing to movie model tests
evelynnkaplan May 14, 2019
68236e3
wrote validation tests for customer model
evelynnkaplan May 14, 2019
cf4ebdc
create customermovie join table
evelynnkaplan May 14, 2019
073d026
relationship testing for customer model
evelynnkaplan May 14, 2019
173e017
generated customermovie model
evelynnkaplan May 14, 2019
034c38b
migration to add columns to Customer Movie table
evelynnkaplan May 14, 2019
ac19d58
eliminated extra customers_movies join table
MyriamWD May 14, 2019
94a904b
tests for customer movies join table and customer test
MyriamWD May 14, 2019
5a83492
generated movies and customers controllers
evelynnkaplan May 15, 2019
8e88d9f
Customers#index action and tests pass
evelynnkaplan May 15, 2019
a61f315
wrote Movies#index action and tests to pass
evelynnkaplan May 15, 2019
e823963
create show action
MyriamWD May 15, 2019
375ec6a
tests for movie show action
MyriamWD May 15, 2019
fd01f22
started create action and tests
evelynnkaplan May 15, 2019
edc3398
tests pass
evelynnkaplan May 15, 2019
c2436da
wrote failure case test for Movie#create
evelynnkaplan May 15, 2019
c682eec
test for checkout method in customer movies controller
MyriamWD May 15, 2019
1f374b8
test for checkout method in customer movies controller
MyriamWD May 15, 2019
bc76fee
added checkout method
MyriamWD May 15, 2019
ab8cd50
created tests for checkout method
MyriamWD May 15, 2019
032d96e
added route for checkout method
MyriamWD May 15, 2019
b752132
fixed failing CustomerMovie controller tests
evelynnkaplan May 16, 2019
2332764
tests for checkin action
MyriamWD May 16, 2019
119dae5
added checkin action
MyriamWD May 16, 2019
9791d3c
checkin route'
MyriamWD May 16, 2019
c0c0d3a
checkin testing
MyriamWD May 17, 2019
81672a7
migration to add status to CustomerMovie
MyriamWD May 17, 2019
d52d497
smoke tests wave 2 and 3 passing
MyriamWD May 17, 2019
5c41b97
Merge pull request #1 from evelynnkaplan/controllers
MyriamWD 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.
41 changes: 41 additions & 0 deletions app/controllers/customer_movies_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
class CustomerMoviesController < ApplicationController
def checkout
customer_movie = CustomerMovie.new(customer_movie_params)
if customer_movie.save
checkout_movie = customer_movie.movie.title
Copy link

Choose a reason for hiding this comment

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

Should we be setting checkout_movie to the value of its movie's title? This doesn't seem to break any tests, but it reads really strangely to me.

customer_movie.checkout_date = Date.today
customer_movie.due_date = Date.today.next_week
customer_movie.movie.inventory -= 1
Copy link

Choose a reason for hiding this comment

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

I think it would be really cool if all of this work around modifying customer_movie were pulled into an instance method on CustomerMovie! Imagine a method on CustomerMovie named checkout called with checkout_movie.checkout:

def checkout
  self.checkout_date = Date.today
  self.due_date = Date.today.next_week
  self.movie.inventory -= 1
end

customer_movie.save
customer_movie.movie.save

render json: {movie: checkout_movie, checkout_date: customer_movie.checkout_date, due_date: customer_movie.due_date},
status: :ok
else
render json: {ok: false, errors: customer_movie.errors.messages},
status: :bad_request
end
end

def checkin
customer_movie = CustomerMovie.where(customer_id: customer_movie_params[:customer_id], movie_id: customer_movie_params[:movie_id])
if customer_movie != []
customer_movie[0].movie.inventory += 1
customer_movie[0].status = "returned"
Copy link

Choose a reason for hiding this comment

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

Similar to above: it may be best if these two lines about incrementing inventory and changing status were pulled into an instance method. Even if it's two lines long, it's still helpful!

customer_movie[0].movie.save
customer_movie[0].save

render json: {movie: customer_movie[0].movie.title, checkin_status: customer_movie[0].status},
status: :ok
else
render json: {ok: false, errors: ["Customer has not checked out this movie"]},
status: :bad_request
end
end

private

def customer_movie_params
params.require(:customer_movie).permit(:customer_id, :movie_id)
end
end
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
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 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 json: movie.as_json(only: [:id, :title, :overview, :release_date, :inventory]), status: :ok
else
render json: {ok: false, 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]),
status: :ok
else
render json: {ok: false, errors: movie.errors.messages},
status: :bad_request
end
end

private

def movie_params
params.require(:movie).permit(:title, :overview, :release_date, :inventory)
Copy link

Choose a reason for hiding this comment

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

In Rails when we used forms, params would come back populated with a nested structure that had movie in it. In this API, we won't have that nested structure, so we need to take out the .require('movie') bit. When we do this, then most of Wave 2 starts working :)

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.
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
has_many :customer_movies
has_many :movies, through: :customer_movies
validates :name, presence: true
end
4 changes: 4 additions & 0 deletions app/models/customer_movie.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
class CustomerMovie < ApplicationRecord
belongs_to :customer
belongs_to :movie
end
6 changes: 6 additions & 0 deletions app/models/movie.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
class Movie < ApplicationRecord
has_many :customer_movies
has_many :customers, through: :customer_movies
validates :title, presence: true
validates :inventory, presence: true, numericality: {greater_than: -1}
end
Loading