-
Notifications
You must be signed in to change notification settings - Fork 25
Kiera # Ana lisa - VideoStoreAPI - Octos #19
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
base: master
Are you sure you want to change the base?
Changes from all commits
7f2c133
11e364d
2e46775
801ab5f
acafe5f
083bcee
0b8a183
4db1e2b
80d7336
5d3ff7a
5d3fb01
5c8ffd3
c9e071d
1bda46d
c2c8955
9a5a63f
32cd0ff
6499f5a
bbb8791
2b0db94
3c0a3d2
6e37985
c391644
900eeb5
efefc9e
930bc59
d768dc9
fdcca7f
d77fdf4
1fbc05c
1f11a7d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| 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 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,52 @@ | ||
| 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' | ||
|
|
||
| # gem 'validates_date_time' | ||
| # 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 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,156 @@ | ||
| 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) | ||
| validates_date_time (1.0.0) | ||
| 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 | ||
| validates_date_time | ||
|
|
||
| BUNDLED WITH | ||
| 1.16.1 |
| 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 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| module ApplicationCable | ||
| class Channel < ActionCable::Channel::Base | ||
| end | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,4 @@ | ||
| module ApplicationCable | ||
| class Connection < ActionCable::Connection::Base | ||
| end | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| class ApplicationController < ActionController::API | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| class CustomersController < ApplicationController | ||
| def index | ||
| customers = Customer.all | ||
|
|
||
| render json: customers.as_json(only: [:id, :address, :city, :name, :phone, :postal_code, :registered_at]) | ||
| end | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,37 @@ | ||
| class MoviesController < ApplicationController | ||
|
|
||
| def index | ||
| movies = Movie.all | ||
| render json: movies.as_json(only: [:id, :title, :overview, :inventory, :available_inventory, :release_date]), status: :ok | ||
| end | ||
|
|
||
| def show | ||
| movie = Movie.find_by(id:params[:id]) | ||
| if movie.nil? | ||
| render json:{ | ||
| errors:{ | ||
| id: ["No movie with ID #{params[:id]}"] | ||
| } | ||
| }, status: :not_found | ||
| else | ||
| render json: movie.as_json(only: [:id, :title, :overview, :inventory, :available_inventory, :release_date], status: :ok) | ||
| end | ||
| end | ||
|
|
||
| def create | ||
| movie = Movie.new(movie_params) | ||
| movie.available_inventory = movie.inventory | ||
| 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 | ||
| return params.permit(:title, :overview, :inventory, :release_date) | ||
| end | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,71 @@ | ||
| require 'pry' | ||
| class RentalsController < ApplicationController | ||
|
|
||
| def checkout | ||
| movie_id = params[:movie_id] | ||
| customer_id = params[:customer_id] | ||
|
|
||
| date = Date.today | ||
| rental_params = { | ||
| checkout: nil, | ||
| due_date: nil, | ||
| customer_id: customer_id, | ||
| movie_id: movie_id | ||
| } | ||
|
|
||
| movie = Movie.find_by(id: movie_id) | ||
| customer = Customer.find_by(id: customer_id) | ||
|
|
||
| if movie[:available_inventory] == 0 | ||
| render json: { | ||
| errors: { | ||
| available_inventory: ["Movie is currently all checked out. Sorry."] | ||
| } | ||
| } , status: :bad_request | ||
| return | ||
| end | ||
|
|
||
| new_rental = Rental.new(rental_params) | ||
| new_rental[:checkout] = date | ||
| new_rental[:due_date] = date + 7 | ||
| movie[:available_inventory] -= 1 | ||
| if new_rental.save | ||
| movie.save | ||
| render json: { id: new_rental.id}, status: :ok | ||
| else | ||
| render json: { errors: new_rental.errors.messages }, status: :bad_request | ||
| end | ||
| end | ||
|
|
||
| def checkin | ||
| rental = Rental.find_by(customer_id: params[:customer_id], movie_id: params[:movie_id]) | ||
| puts "DPR: found rental #{rental}" | ||
|
|
||
|
|
||
| if rental.checked_in | ||
| render json: { | ||
| errors: { | ||
| checked_in: ["Movie has not been checked out."] | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I like that you're checking for this |
||
| } | ||
| }, status: :bad_request | ||
| return | ||
| end | ||
|
|
||
| # TODO: error handling | ||
| rental.update!(checked_in: true) | ||
|
|
||
|
|
||
| rental.movie.available_inventory += 1 | ||
| if rental.movie.save | ||
| render json: { id: rental.movie.id }, status: :ok | ||
| else | ||
|
|
||
| render json: { errors: rental.movie.errors.messages }, status: :bad_request | ||
| end | ||
| end | ||
|
|
||
| private | ||
| def rental_params | ||
| return params.permit(:checkout, :due_date, :customer_id, :movie_id) | ||
| end | ||
| end | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| class ApplicationJob < ActiveJob::Base | ||
| end |
| 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 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,3 @@ | ||
| class ApplicationRecord < ActiveRecord::Base | ||
| self.abstract_class = true | ||
| end |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| class Customer < ApplicationRecord | ||
| has_many :rentals | ||
| has_many :movies, through: :rentals | ||
|
|
||
| validates :name, presence: true | ||
| validates :phone, presence: true | ||
| validates :phone, length: { is: 14 } | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You might be over-validating here. Your app probably won't break if the customer's phone number isn't right, so validating it (and testing the validation, and making your tests provide the phone number in the right format) is more trouble than it's worth. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Same thing goes for many of your model validations. |
||
| end | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,11 @@ | ||
| class Movie < ApplicationRecord | ||
| has_many :rentals | ||
| has_many :customers, through: :rentals | ||
|
|
||
| validates :title, presence: true | ||
| validates :inventory, numericality: true | ||
| validates :inventory, numericality: {greater_than_or_equal_to: 0} | ||
| validates :available_inventory, numericality: true | ||
| validates :available_inventory, numericality: {greater_than_or_equal_to: 0} | ||
|
|
||
| end |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You should take all of the logic in this controller action and encapsulate it in a model method. Perhaps something like
Movie#checkout(customer_id). You could have it raise an exception if there's not enough inventory available, or implement a custom validation on the rental.