Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
d6f1387
new rails api
gyjin Nov 5, 2019
9e9d499
Created initial project file
juliabouv Nov 5, 2019
4d9bc86
Generated movie and customer models and controllers
juliabouv Nov 5, 2019
8655787
Added columns to Movie and Customer tables
juliabouv Nov 5, 2019
c4b987a
Added registered_at date to customers
juliabouv Nov 5, 2019
1b395c0
fixed merge conflicts
gyjin Nov 5, 2019
1979449
added index method and tests
gyjin Nov 6, 2019
f7d5106
Implemented customer index and tests
juliabouv Nov 6, 2019
c5b525e
added movie fixtures
gyjin Nov 6, 2019
95392ff
Updated customer fixture
juliabouv Nov 6, 2019
95cd8e0
added movie show method and tests
gyjin Nov 6, 2019
40c2e2b
Merge branch 'master' of https://github.com/juliabouv/video-store-api
gyjin Nov 6, 2019
8c5ed8e
fixed merge conflicts in routes
gyjin Nov 6, 2019
c5b77dc
Added rental model
juliabouv Nov 6, 2019
7509e2d
added create movie method and tests
gyjin Nov 7, 2019
dbc1c0d
Merge pull request #1 from juliabouv/movie-create
gyjin Nov 7, 2019
7c934de
Implemented checkin and checkout
juliabouv Nov 7, 2019
156360b
Merged master
juliabouv Nov 7, 2019
88350d6
added movies checked out count to customer model
gyjin Nov 7, 2019
681fd7f
fixed merge conflicts in schema
gyjin Nov 7, 2019
20a1148
changed customer controllers to include movies checked out count
gyjin Nov 7, 2019
db0c1a5
added available inventory to movies
gyjin Nov 7, 2019
356e4ef
Implemented check-in tests
juliabouv Nov 7, 2019
78ead4d
Merge branch 'master' of https://github.com/juliabouv/video-store-api
juliabouv Nov 7, 2019
99e157c
added validations for movies and tests
gyjin Nov 8, 2019
9db1f40
merged origin master into branch
gyjin Nov 8, 2019
08fb452
Merge pull request #2 from juliabouv/movie-validation
gyjin Nov 8, 2019
2c12072
added movie model tests
gyjin Nov 8, 2019
fb1f7cc
removed some comments
gyjin Nov 8, 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 @@
2.5.5
59 changes: 59 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.5.5'

# 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 :development do
gem 'debase', '>= 0.2.4.1'
gem 'ruby-debug-ide', '>= 0.7.0'
end

group :test do
gem 'minitest-rails'
gem 'minitest-reporters'
end
175 changes: 175 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
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.5)
msgpack (~> 1.0)
builder (3.2.3)
byebug (11.0.1)
coderay (1.1.2)
concurrent-ruby (1.1.5)
crass (1.0.5)
debase (0.2.4.1)
debase-ruby_core_source (>= 0.10.2)
debase-ruby_core_source (0.10.6)
erubi (1.9.0)
ffi (1.11.1)
globalid (0.4.2)
activesupport (>= 4.2.0)
i18n (1.7.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.3.1)
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.2)
mini_portile2 (2.4.0)
minitest (5.13.0)
minitest-rails (5.2.0)
minitest (~> 5.10)
railties (~> 5.2.0)
minitest-reporters (1.4.2)
ansi
builder
minitest (>= 5.0)
ruby-progressbar
msgpack (1.3.1)
nio4r (2.5.2)
nokogiri (1.10.5)
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.3.0)
loofah (~> 2.3)
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 (13.0.0)
rb-fsevent (0.10.3)
rb-inotify (0.10.0)
ffi (~> 1.0)
ruby-debug-ide (0.7.0)
rake (>= 0.8.1)
ruby-progressbar (1.10.1)
ruby_dep (1.5.0)
spring (2.1.0)
spring-watcher-listen (2.0.1)
listen (>= 2.7, < 4.0)
spring (>= 1.2, < 3.0)
sprockets (4.0.0)
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.1)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.4)

PLATFORMS
ruby

DEPENDENCIES
bootsnap (>= 1.1.0)
byebug
debase (>= 0.2.4.1)
listen (>= 3.0.5, < 3.2)
minitest-rails
minitest-reporters
pg (>= 0.18, < 2.0)
pry-rails
puma (~> 3.11)
rails (~> 5.2.3)
ruby-debug-ide (>= 0.7.0)
spring
spring-watcher-listen (~> 2.0.0)
tzinfo-data

RUBY VERSION
ruby 2.5.5p157

BUNDLED WITH
2.0.2
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.
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
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, :title, :release_date]), status: :ok
end

def show
movie = Movie.find_by_id(params[:id])

if movie.nil?
render json: {"errors" => {"id" => ["no movie by ID: #{params[:id]}"]}}, status: :not_found
return
end

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

def create
movie = Movie.new(movie_params)

if movie.save
render json: movie.as_json(only: [:id, :title, :overview, :release_date, :inventory]), status: :ok
return
else
render json: {
ok: false,
errors: movie.errors.messages
}, status: :bad_request
return
end
end

private

def movie_params
params.permit(:title, :overview, :release_date, :inventory, :available_inventory)
end
end

52 changes: 52 additions & 0 deletions app/controllers/rentals_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
class RentalsController < ApplicationController
def checkout

Choose a reason for hiding this comment

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

Nothing to ensure that there are enough movies in the inventory to check it out?

customer = Customer.find_by(id: params["rental"]["customer_id"])
# binding.pry
if customer.nil?
render json: { ok: false, errors: ["Customer not found"] }, status: :bad_request
return
end
movie = Movie.find_by(id: params["rental"]["movie_id"])
if movie.nil?
render json: { ok: false, errors: ["Movie not found"] }, status: :bad_request
return
end

rental = Rental.new(checkout_date: Date.today, checkin_date: nil, due_date: Date.today + 7, customer_id: customer.id, movie_id: movie.id)

if rental.save
render json: rental.as_json, status: :ok
return
else
render json: { ok: false, errors: rental.errors.messages }, status: :bad_request
return
end
end

def checkin

Choose a reason for hiding this comment

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

The check-in/out logic would make sense to put into a model method

customer = Customer.find_by(id: params["rental"]["customer_id"])
if customer.nil?
render json: { ok: false, errors: ["Customer not found"] }, status: :bad_request
return
end
movie = Movie.find_by(id: params["rental"]["movie_id"])
if movie.nil?
render json: { ok: false, errors: ["Movie not found"] }, status: :bad_request
return
end

rental = Rental.find_by(customer_id: customer.id, movie_id: movie.id)
if rental.nil?
render json: { ok: false, errors: ["Rental not found"] }, status: :bad_request
return
end

if rental.update(checkin_date: Date.today)
render json: rental.as_json, status: :ok
return
else
render json: { ok: false, errors: rental.errors.messages }, status: :bad_request
return
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
Loading