-
Notifications
You must be signed in to change notification settings - Fork 25
Cara/Brandy/Jamila Octos C9 #15
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
cfbd01a
24161f5
b15fc44
45aca21
0dbf050
d008053
295af64
5e3415d
c273efe
8a42a8d
fef80bb
d29874a
f74a907
b8f512d
d138614
d6d8efb
7c7b54d
e3c63a7
2c54d52
e28edc8
0d5d9a7
a48f2a7
984e21d
bc8b387
5fb3cfc
0c0ef7f
006c635
cc3cdb2
2098fe5
57f0f6c
d835256
a73a2d6
0b9ea38
7cf9f9b
1e4eb65
8a08d6b
4dbfa70
a4d43e9
f2b70e5
9f08263
d9a48dd
7320155
d4047fd
cc84c68
0d4a369
5f411dc
9b21c8c
ce2d4f3
9bf00b7
fac7dd0
24c40ff
ece389e
d1debf0
af20364
29773cb
6b62423
89b8d40
20a098b
881a983
b481f07
f0c5087
a7b4b03
395231b
5a386a4
3c84c70
76da64d
05d9411
b426f7d
72f43ee
488c438
00e24ac
0bb1595
1905f82
f102b2c
d6ad444
c0468e9
5d84f98
719a12d
a93e03e
fae40f7
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,54 @@ | ||
| 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' | ||
|
|
||
| gem 'rabl' | ||
| gem 'oj' | ||
| gem 'jbuilder', '~> 2.5' | ||
|
|
||
| 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,164 @@ | ||
| 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) | ||
| jbuilder (2.7.0) | ||
| activesupport (>= 4.2.0) | ||
| multi_json (>= 1.2) | ||
| 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 | ||
| multi_json (1.13.1) | ||
| nio4r (2.3.1) | ||
| nokogiri (1.8.2) | ||
| mini_portile2 (~> 2.3.0) | ||
| oj (3.6.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) | ||
| rabl (0.13.1) | ||
| activesupport (>= 2.3.14) | ||
| 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 | ||
| jbuilder (~> 2.5) | ||
| listen (>= 3.0.5, < 3.2) | ||
| minitest-rails | ||
| minitest-reporters | ||
| oj | ||
| pg (>= 0.18, < 2.0) | ||
| pry-rails | ||
| puma (~> 3.7) | ||
| rabl | ||
| rails (~> 5.1.6) | ||
| spring | ||
| spring-watcher-listen (~> 2.0.0) | ||
| tzinfo-data | ||
|
|
||
| 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,26 @@ | ||
| class CustomersController < ApplicationController | ||
|
|
||
| def index | ||
| @customers = Customer.all | ||
| render :index, status: :ok | ||
| end | ||
|
|
||
| def show | ||
| @customer = Customer.find_by(id: cust_params[:id]) | ||
| if @customer.nil? | ||
| render json: { | ||
| errors: { | ||
| id: ["No customer with ID #{cust_params[:id]}"] | ||
| } | ||
| }, status: :not_found | ||
| else | ||
| render :show, status: :ok | ||
| end | ||
| end | ||
|
|
||
| private | ||
| def cust_params | ||
| params.permit(:id) | ||
| end | ||
|
|
||
| end | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,31 @@ | ||
| class MoviesController < ApplicationController | ||
|
|
||
| def index | ||
| @movies = Movie.all | ||
| render :index, status: :ok | ||
| end | ||
|
|
||
| def show | ||
| @movie = Movie.find_by(id: movie_params[:id]) | ||
| if @movie.nil? | ||
| render json: { | ||
| errors: { | ||
| id: ["No movie with ID #{movie_params[:id]}"] | ||
|
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. This is a good example of well-done error handling. |
||
| } | ||
| }, status: :not_found | ||
| else | ||
| render :show, status: :ok | ||
| end | ||
| end | ||
|
|
||
| def create | ||
| @movie = Movie.new(movie_params) | ||
| @movie.save! | ||
| render :create, status: :ok | ||
|
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. Using bang ( Something like this would be more appropriate: @movie = Movie.new(movie_params)
if @movie.save
render :create, status: :ok
else
render json: { errors: @movie.errors.messages }, status: :bad_request
end |
||
| end | ||
|
|
||
| private | ||
| def movie_params | ||
| params.permit(:id, :title, :overview, :release_date, :inventory) | ||
| end | ||
| end | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,76 @@ | ||
|
|
||
| class RentalsController < ApplicationController | ||
| def checkout | ||
| customer_id = check_params[:customer_id] | ||
| movie_id = check_params[:movie_id] | ||
|
|
||
| find_customer_and_movie(customer_id, movie_id) | ||
|
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 the idea of moving the shared logic to find the customer and the movie into a helper method. Why not take it a step further and make it a controller filter? |
||
|
|
||
| errors = Rental.check_dependencies(@customer, @movie) | ||
|
|
||
| if errors | ||
| render json: {errors: errors}, status: :not_found | ||
| else | ||
|
|
||
| @rental = Rental.create_checkout(@customer, @movie) | ||
|
|
||
| if @rental.save | ||
|
|
||
| Rental.process_checkout(@customer, @movie) | ||
|
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. This dance of checking the dependencies, creating the rentals, and then updating the dependent models is pretty complicated - it might make sense to encapsulate the whole thing in a model method. One thing that might help is using a transaction - go look this up! |
||
|
|
||
| render :check, status: :ok | ||
|
|
||
| else | ||
| render json: {errors: { unknown: ["Something went wrong"]}}, status: :bad_request | ||
| end | ||
| end | ||
|
|
||
| end | ||
|
|
||
| def checkin | ||
|
|
||
| customer_id = check_params[:customer_id] | ||
| movie_id = check_params[:movie_id] | ||
|
|
||
| find_customer_and_movie(customer_id, movie_id) | ||
|
|
||
| @rental = find_rental(customer_id, movie_id) | ||
|
|
||
|
|
||
| if @rental.nil? | ||
|
|
||
| render json: {errors: {id: ["No such rental with customer ID #{check_params[:customer_id]} and movie ID #{check_params[:movie_id]}"]}}, status: :not_found | ||
| return | ||
| end | ||
|
|
||
| @rental.checkin_date = Date.today | ||
| @rental.save | ||
|
|
||
| customer = Customer.find_by(id: @rental.customer_id) | ||
| movie = Movie.find_by(id: @rental.movie_id) | ||
|
|
||
| if @rental.save | ||
|
|
||
| Rental.process_checkin(customer, movie) | ||
|
|
||
| render :check, status: :ok | ||
| else | ||
| render json: { errors: @rental.errors.messages }, status: :bad_request | ||
| end | ||
|
|
||
| end | ||
|
|
||
| private | ||
| def check_params | ||
| params.permit(:customer_id, :movie_id) | ||
| end | ||
|
|
||
| def find_customer_and_movie(customer_id, movie_id) | ||
| @customer = Customer.find_by(id: customer_id) | ||
| @movie = Movie.find_by(id: movie_id) | ||
| end | ||
|
|
||
| def find_rental(customer_id, movie_id) | ||
| @rental = Rental.find_by(customer_id: customer_id, movie_id: movie_id) | ||
| end | ||
| end | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| class ApplicationJob < ActiveJob::Base | ||
| 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.
While this works, you don't typically use strong params for URL parameters.