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

Emilce and Maja Octos #23

Open
wants to merge 50 commits into
base: master
Choose a base branch
from
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
82965e1
made file structure
mgraonic May 7, 2018
6306ce5
generated models; seeded db
mgraonic May 7, 2018
5b762eb
added routes
mgraonic May 7, 2018
6d16a91
generated controllers
mgraonic May 7, 2018
1ed3fb4
created movies controller tests
mgraonic May 7, 2018
071d0d0
Working on show action and tests
emilcecarlisa May 7, 2018
a6515f7
Passing show tests and movie yml
emilcecarlisa May 7, 2018
8bc020e
working out testing bugs
mgraonic May 7, 2018
cd24961
Merge branch 'development' of https://github.com/mgraonic/VideoStoreA…
mgraonic May 7, 2018
58351c3
working on movie create controller test
mgraonic May 7, 2018
94e9536
finished create action controller tests
mgraonic May 8, 2018
b74a235
teletype screen switch
mgraonic May 8, 2018
4cf5015
Completed show movie negative test case
emilcecarlisa May 8, 2018
926b8e0
reconcile changes
mgraonic May 8, 2018
4a0a9fb
Created customer controller action for index and tests
emilcecarlisa May 8, 2018
9bf9604
merge resolution
mgraonic May 8, 2018
9e55760
Merge branch 'development' of https://github.com/mgraonic/VideoStoreA…
mgraonic May 8, 2018
838ae1e
merge conflicts
mgraonic May 8, 2018
8450dcf
working on customers controller tests
mgraonic May 8, 2018
f2917d8
all controller tests passing; added optionals columns to movie and cu…
mgraonic May 8, 2018
7cf2c9f
fixed controllers that were failing smoke tests
mgraonic May 8, 2018
35ef903
fixed more controller actions that failed smoke tests
mgraonic May 8, 2018
f50a5a6
created rental model
mgraonic May 9, 2018
b4f71a3
created rentals controller; started controller tests
mgraonic May 9, 2018
4bfeda0
changed movies schema; working on checkout method
mgraonic May 9, 2018
dcaf466
Filled in some of the checkin functioning
emilcecarlisa May 9, 2018
a8cd9f9
Committing most recent changes
emilcecarlisa May 9, 2018
33f8417
Fixed checkin column with migration.
emilcecarlisa May 10, 2018
d3a7b1f
working on rentals controller; incomplete checkout method
mgraonic May 10, 2018
a6d4d48
finished basic version of checkout method; still working on rental cu…
mgraonic May 10, 2018
5ad83c7
swapped due_date for checkin_date; updated all methods
mgraonic May 10, 2018
153a7b8
Committing only to override with a pull from development origin
emilcecarlisa May 10, 2018
6238c49
Resolving merge conflict
emilcecarlisa May 10, 2018
bb8bcd3
added custom validation to rental model
mgraonic May 10, 2018
acdc1c6
annotated new code
mgraonic May 10, 2018
18ef11e
checkout tests passing;still need negative tests
mgraonic May 10, 2018
c4e1eb1
updated rental validtion method
mgraonic May 10, 2018
f54ecea
Cleaned up checkin logic
emilcecarlisa May 10, 2018
31628a9
Tests passing for checkin method
emilcecarlisa May 10, 2018
1a75be5
Changed checkin method and tests....not final version
emilcecarlisa May 11, 2018
3a0431f
working on checkout method and tests
mgraonic May 11, 2018
a36093a
Resolving merge conflict
emilcecarlisa May 11, 2018
bdf7074
Deleted merge symbols from file
emilcecarlisa May 11, 2018
eefff5d
Resolving merge conflict on checkin2 merge
emilcecarlisa May 11, 2018
72905f3
last commit before merge
mgraonic May 11, 2018
f73735f
Merge branch 'development' of https://github.com/mgraonic/VideoStoreA…
mgraonic May 11, 2018
f2e3424
updated rental actions in controller
mgraonic May 11, 2018
2bf3d92
wave 3 smoke tests passing; zeroed out customer movie rented number
mgraonic May 11, 2018
e5c7119
can checkin a movie
mgraonic May 11, 2018
8481ed0
all tests passing; yay
mgraonic May 12, 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
18 changes: 18 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# 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

.DS_Store
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
3 changes: 3 additions & 0 deletions app/controllers/application_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class ApplicationController < ActionController::API

end
Empty file added app/controllers/concerns/.keep
Empty file.
35 changes: 35 additions & 0 deletions app/controllers/customers_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
class CustomersController < ApplicationController

def index
customers = Customer.all

render json: customers.as_json(only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone, :movies_checked_out_count]), status: :ok
end

def show
customer = Customer.find_by(id: params[:id])

if customer.nil?
render json: {errors: {id: ["No customer like that found, #{params[:id]}"]}}, status: :not_found
else
render json: customer.as_json(only: [:name, :registered_at, :address, :city, :state, :postal_code, :phone]), status: :ok
end
end

def create
customer = Customer.new(customer_params)

if customer.save
#do something
render json: { id: customer.id}, status: :created
else
render json: { errors: customer.errors.messages }, status: :bad_request
end
end

private
def customer_params
params.require(:customer).permit(:name, :registered_at, :address, :city, :state, :postal_code, :phone)
end

end
40 changes: 40 additions & 0 deletions app/controllers/movies_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
class MoviesController < ApplicationController

def index
movies = Movie.all

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

def show
# binding.pry
movie = Movie.find_by(id: params[:id])

if movie.nil?
render json: {
errors: {
id: ["No movie like that found, #{params[:id]}"]
}
}, status: :not_found
else
render json: movie.as_json(only: [:overview, :release_date, :title, :inventory], methods: [:available_inventory]), status: :ok
# won't work unless rabl
# render 'movies/show'
end
end

def create
movie = Movie.new(movie_params)

if movie.save
render json: { id: movie.id}, status: :ok
else
render json: { errors: movie.errors.messages }, status: :bad_request
end
end

private
def movie_params
params.permit(:title, :overview, :release_date, :inventory)
end
end
67 changes: 67 additions & 0 deletions app/controllers/rentals_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
require 'pry'

class RentalsController < ApplicationController
def checkout
# take in query params
movie_id = params[:movie_id]
customer_id = params[:customer_id]

# find customer and movie by id's
movie = Movie.find_by(id: movie_id)
customer = Customer.find_by(id: customer_id)

checkout_date = Date.today
due_date = checkout_date + 7

# initialize a rental
rental = Rental.new(customer_id: customer_id, movie_id: movie_id, checkout_date: checkout_date, due_date: due_date)

if movie && customer

# save rental if valid, otherwise send errors
if rental.save

# increase the customer's checked-out movie number
customer.movies_checked_out_count += 1
customer.save

Choose a reason for hiding this comment

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

You do a lot of work in this function: calculating dates, creating a Rental, increasing the movie count. It would be good to encapsulate all that in one model method.


# if the rental custom validations pass, set rental attributes
# and return rental id and status
render json: { id: rental.id }, status: :ok
else
# if the rental's custom validations fail, render errors
# errors come from custom rental validation method (see rental.rb)
render json: { errors: rental.errors.messages }, status: :bad_request
end
else
render json: {errors: { id: ["Must enter a valid movie and customer"]}}, status: :bad_request
end

Choose a reason for hiding this comment

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

Here you should probably specify which field is bad. id by itself doesn't correspond to either of the parameters the client sent.

end

def checkin
movie_id = params[:movie_id].to_i
customer_id = params[:customer_id].to_i

# rental = Rental.where(movie_id: movie_id, customer_id: customer_id).where.not(due_date: nil).first

rental = Rental.where.not(due_date: nil).where(movie_id: movie_id, customer_id: customer_id).order(checkout_date: :desc).first
# rental = Rental.where(movie_id: movie_id, customer_id: customer_id).order(checkout_date: :desc).where.not(due_date: nil)

Choose a reason for hiding this comment

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

This is a really complex database query! Could you encapsulate it as a self method on Rental? Maybe something like Rental.outstanding(movie_id, customer_id)


if rental && rental.due_date != nil

rental.due_date = nil

unless rental.save
render json: { errors: rental.errors.messages }, status: :bad_request
return
end

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

render json: rental.as_json(only: [:id, :checkout_date, :due_date]), status: :ok
else
render json: { errors: { rental: ["not found"]}}, status: :not_found
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: '[email protected]'
layout 'mailer'
end
Loading