Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
e498c78
set up rails API
bcmdarroch May 9, 2017
4681742
started pseudocode
bcmdarroch May 9, 2017
32f7b22
pseudocoded routes
bcmdarroch May 9, 2017
7d6ccdf
set up models, controllers and routes
AlisonZ May 9, 2017
67abd17
seeded db
bcmdarroch May 9, 2017
fe61127
wrote some customer tests
bcmdarroch May 9, 2017
62714fd
made rental model
bcmdarroch May 9, 2017
4e45454
added new relationships
AlisonZ May 9, 2017
142dca1
initial test for customer
AlisonZ May 9, 2017
85c53d3
customer tests all passing
AlisonZ May 9, 2017
a25b25d
wrote movie tests, mostly passing
bcmdarroch May 9, 2017
6a46eca
almost finished customer and movie model testing, one bug to fix
AlisonZ May 9, 2017
7b56aa5
customer and movie tests all passing :)))
bcmdarroch May 10, 2017
16fe702
added coverage to gitignore
bcmdarroch May 10, 2017
7b2fa50
rentals tests. all broken
AlisonZ May 10, 2017
058a2c0
fixed rental tests
bcmdarroch May 10, 2017
a4964fd
made some controllers and the basic controller methods for movies and…
AlisonZ May 10, 2017
29c6247
wave 2 finished
AlisonZ May 10, 2017
85ca5e4
smoke test passes all tests, customer controller tests finished
AlisonZ May 10, 2017
e8e3423
most movie controller tests passing
bcmdarroch May 10, 2017
a52c485
deleted all coverage
bcmdarroch May 11, 2017
9a6aeef
movie controller passes all tests
bcmdarroch May 11, 2017
8851b84
added controller index test
bcmdarroch May 11, 2017
068c8b2
date time working
AlisonZ May 11, 2017
d5f2688
cleaned up movie test a lil
bcmdarroch May 11, 2017
29b40b4
customer controller tests done
AlisonZ May 11, 2017
f5e9fdf
Merge branch 'master' of https://github.com/bcmdarroch/VideoStoreAPI
AlisonZ May 11, 2017
bb24f80
start rentals controller
bcmdarroch May 11, 2017
4c57001
got rentals checkout working
bcmdarroch May 12, 2017
43ec255
checkin method
AlisonZ May 12, 2017
b236630
got checkout and checkin working, tested in postman
bcmdarroch May 12, 2017
4b152bc
rental model tests pass, fixed rental checkout and due date tests
AlisonZ May 12, 2017
d38104c
rental controller test stubs
bcmdarroch May 12, 2017
ad9d18f
fixed minor merge conflict
AlisonZ May 12, 2017
7c1152b
starting writing the rental controller tests
AlisonZ May 12, 2017
fa25392
rental controller returning json test working
AlisonZ May 12, 2017
a469ac3
wrote checkout tests
bcmdarroch May 12, 2017
05eae3e
finished testing for checkin controller
AlisonZ May 12, 2017
5dcb1a8
patch to put in rentals route
bcmdarroch May 12, 2017
cc46b70
Merge branch 'master' of https://github.com/bcmdarroch/VideoStoreAPI
bcmdarroch May 12, 2017
62f1076
wrote overdue controller method and model methods
bcmdarroch May 12, 2017
aefcf17
tested overdue in postman, works :))))
bcmdarroch May 12, 2017
c2589ea
finished rental controller tests except for one at the end
bcmdarroch May 12, 2017
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

# Ignore Byebug command history file.
.byebug_history
/coverage/*
55 changes: 55 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
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.0.2'
# Use postgresql as the database for Active Record
gem 'pg', '~> 0.18'
# Use Puma as the app server
gem 'puma', '~> 3.0'
# 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', '~> 3.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', platform: :mri
end

group :development do
gem 'listen', '~> 3.0.5'
# 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 do
gem 'better_errors'
gem 'binding_of_caller'
gem 'pry-rails'
end

gem 'foundation-rails'
gem 'awesome_print'
group :test do
gem 'minitest-rails'
gem 'minitest-reporters'
gem 'simplecov'
end
187 changes: 187 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
GEM
remote: https://rubygems.org/
specs:
actioncable (5.0.2)
actionpack (= 5.0.2)
nio4r (>= 1.2, < 3.0)
websocket-driver (~> 0.6.1)
actionmailer (5.0.2)
actionpack (= 5.0.2)
actionview (= 5.0.2)
activejob (= 5.0.2)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
actionpack (5.0.2)
actionview (= 5.0.2)
activesupport (= 5.0.2)
rack (~> 2.0)
rack-test (~> 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
actionview (5.0.2)
activesupport (= 5.0.2)
builder (~> 3.1)
erubis (~> 2.7.0)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.3)
activejob (5.0.2)
activesupport (= 5.0.2)
globalid (>= 0.3.6)
activemodel (5.0.2)
activesupport (= 5.0.2)
activerecord (5.0.2)
activemodel (= 5.0.2)
activesupport (= 5.0.2)
arel (~> 7.0)
activesupport (5.0.2)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (~> 0.7)
minitest (~> 5.1)
tzinfo (~> 1.1)
ansi (1.5.0)
arel (7.1.4)
awesome_print (1.7.0)
babel-source (5.8.35)
babel-transpiler (0.7.0)
babel-source (>= 4.0, < 6)
execjs (~> 2.0)
better_errors (2.1.1)
coderay (>= 1.0.0)
erubis (>= 2.6.6)
rack (>= 0.9.0)
binding_of_caller (0.7.2)
debug_inspector (>= 0.0.1)
builder (3.2.3)
byebug (9.0.6)
coderay (1.1.1)
concurrent-ruby (1.0.5)
debug_inspector (0.0.3)
docile (1.1.5)
erubis (2.7.0)
execjs (2.7.0)
ffi (1.9.18)
foundation-rails (6.3.1.0)
railties (>= 3.1.0)
sass (>= 3.3.0, < 3.5)
sprockets-es6 (>= 0.9.0)
globalid (0.4.0)
activesupport (>= 4.2.0)
i18n (0.8.1)
json (2.1.0)
listen (3.0.8)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
loofah (2.0.3)
nokogiri (>= 1.5.9)
mail (2.6.5)
mime-types (>= 1.16, < 4)
method_source (0.8.2)
mime-types (3.1)
mime-types-data (~> 3.2015)
mime-types-data (3.2016.0521)
mini_portile2 (2.1.0)
minitest (5.10.1)
minitest-rails (3.0.0)
minitest (~> 5.8)
railties (~> 5.0)
minitest-reporters (1.1.14)
ansi
builder
minitest (>= 5.0)
ruby-progressbar
nio4r (2.0.0)
nokogiri (1.7.1)
mini_portile2 (~> 2.1.0)
pg (0.20.0)
pry (0.10.4)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
pry-rails (0.3.6)
pry (>= 0.10.4)
puma (3.8.2)
rack (2.0.2)
rack-test (0.6.3)
rack (>= 1.0)
rails (5.0.2)
actioncable (= 5.0.2)
actionmailer (= 5.0.2)
actionpack (= 5.0.2)
actionview (= 5.0.2)
activejob (= 5.0.2)
activemodel (= 5.0.2)
activerecord (= 5.0.2)
activesupport (= 5.0.2)
bundler (>= 1.3.0, < 2.0)
railties (= 5.0.2)
sprockets-rails (>= 2.0.0)
rails-dom-testing (2.0.2)
activesupport (>= 4.2.0, < 6.0)
nokogiri (~> 1.6)
rails-html-sanitizer (1.0.3)
loofah (~> 2.0)
railties (5.0.2)
actionpack (= 5.0.2)
activesupport (= 5.0.2)
method_source
rake (>= 0.8.7)
thor (>= 0.18.1, < 2.0)
rake (12.0.0)
rb-fsevent (0.9.8)
rb-inotify (0.9.8)
ffi (>= 0.5.0)
ruby-progressbar (1.8.1)
sass (3.4.23)
simplecov (0.14.1)
docile (~> 1.1.0)
json (>= 1.8, < 3)
simplecov-html (~> 0.10.0)
simplecov-html (0.10.0)
slop (3.6.0)
spring (2.0.1)
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-es6 (0.9.2)
babel-source (>= 5.8.11)
babel-transpiler
sprockets (>= 3.0.0)
sprockets-rails (3.2.0)
actionpack (>= 4.0)
activesupport (>= 4.0)
sprockets (>= 3.0.0)
thor (0.19.4)
thread_safe (0.3.6)
tzinfo (1.2.3)
thread_safe (~> 0.1)
websocket-driver (0.6.5)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.2)

PLATFORMS
ruby

DEPENDENCIES
awesome_print
better_errors
binding_of_caller
byebug
foundation-rails
listen (~> 3.0.5)
minitest-rails
minitest-reporters
pg (~> 0.18)
pry-rails
puma (~> 3.0)
rails (~> 5.0.2)
simplecov
spring
spring-watcher-listen (~> 2.0.0)
tzinfo-data

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

# def index
# render json: {'message' =>"it works"}
# end
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], methods: :movies_checked_out_count), status: :ok
end
end
15 changes: 15 additions & 0 deletions app/controllers/movies_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
class MoviesController < ApplicationController
def index
movies = Movie.all
render json: movies.as_json(only: [:title, :release_date]), status: :ok
end

def show
movie = Movie.find_by_title(params[:title])
if movie
render json: movie.as_json(except: [:updated_at, :created_at]), status: :ok
else
render json: { "errors" => { "title" => [ "Movie '#{ params[:title] }' not found" ] } }, status: :not_found
end
end
end
44 changes: 44 additions & 0 deletions app/controllers/rentals_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
class RentalsController < ApplicationController

def checkout
#add method to check if there is enough in available_inventory
rental = Rental.new
rental.movie = Movie.find_by_title(params[:title])
rental.customer = Customer.find_by_id(params[:rental][:customer_id])

# we decided to automatically set the checkout date to the day the request is posted
rental.checkout_date = Date.today
rental.due_date = Date.today + 7
rental.checked_out = true
rental.movie.available_inventory -= 1

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

end

def checkin
movie_id = Movie.find_by_title(params[:title]).id
customer_id = Customer.find_by_id(params[:rental][:customer_id])
rental = Rental.find_by_movie_id_and_customer_id(movie_id, customer_id)
if rental
rental.checked_out = false
rental.movie.available_inventory += 1

if rental.save && rental.movie.save
render json: { id: rental.id, checked_out: rental.checked_out }, status: :ok
end
else
render json: { errors: "could not find rental" }, status: :bad_request
end
end

def overdue
rentals = Rental.overdue
render json: rentals.as_json(only: [:customer_id, :checkout_date, :due_date], methods: [:title, :name, :postal_code]), status: :ok
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.
13 changes: 13 additions & 0 deletions app/models/customer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
class Customer < ApplicationRecord
has_many :rentals
has_many :movies, through: :rentals

validates :name, presence: true
validates :registered_at, presence: true
validates :phone, presence: true

def movies_checked_out_count
movies.length
end

end
9 changes: 9 additions & 0 deletions app/models/movie.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
class Movie < ApplicationRecord
has_many :rentals
has_many :customers, through: :rentals

validates :title, presence: true
validates :release_date, presence: true
validates :inventory, presence: true, numericality: { only_integer: true, greater_than: 0 }
validates :available_inventory, presence: true, if: :inventory, numericality: { only_integer: true, greater_than: 0, less_than_or_equal_to: :inventory }
end
Loading