From 5d48e42d72d9e242771a06e1743c8cff5921e2d6 Mon Sep 17 00:00:00 2001 From: Katie Jahanmir Date: Mon, 17 Dec 2018 15:24:28 -0800 Subject: [PATCH 01/14] added route and movie create --- app/controllers/movies_controller.rb | 14 ++++++++++++++ config/routes.rb | 3 ++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 362e2791..6e51b80d 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -11,6 +11,20 @@ def index render status: :ok, json: data end + def create + movie = Movie.new(movie_params) + if movie.save + render json: movie.as_json(only: [:id]), + status: :ok + else + render json: { + ok: false, + message: movie.errors.messages + }, status: :bad_request + end + end + + def show render( status: :ok, diff --git a/config/routes.rb b/config/routes.rb index f4c99688..29205898 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -3,12 +3,13 @@ resources :customers, only: [:index] - resources :movies, only: [:index, :show], param: :title + resources :movies, only: [:index, :show, :create], param: :title post "/rentals/:title/check-out", to: "rentals#check_out", as: "check_out" post "/rentals/:title/return", to: "rentals#check_in", as: "check_in" get "/rentals/overdue", to: "rentals#overdue", as: "overdue" + root 'movies#index' end From 28840a15d8f239b5e696ac79c1f4496040d819bf Mon Sep 17 00:00:00 2001 From: Alice Hsiao Date: Mon, 17 Dec 2018 16:10:45 -0800 Subject: [PATCH 02/14] Added strong params for movies controller --- app/controllers/movies_controller.rb | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 6e51b80d..a8d27f75 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -13,17 +13,17 @@ def index def create movie = Movie.new(movie_params) - if movie.save - render json: movie.as_json(only: [:id]), - status: :ok - else - render json: { - ok: false, - message: movie.errors.messages - }, status: :bad_request - end - end + if movie.save + render json: movie.as_json(only: [:id]), + status: :ok + else + render json: { + ok: false, + message: movie.errors.messages + }, status: :bad_request + end + end def show render( @@ -43,4 +43,8 @@ def require_movie render status: :not_found, json: { errors: { title: ["No movie with title #{params["title"]}"] } } end end + + def movie_params + params.permit(:title, :external_id, :overview, :image_url, :release_date) + end end From 21d796695c1b386105bbcd18e721af5976f0f0fa Mon Sep 17 00:00:00 2001 From: Alice Hsiao Date: Mon, 17 Dec 2018 16:23:37 -0800 Subject: [PATCH 03/14] Added conditional to make sure movie is not added to library if it already exists there --- app/controllers/movies_controller.rb | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index a8d27f75..af3107f2 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -12,16 +12,25 @@ def index end def create - movie = Movie.new(movie_params) + @movie = Movie.find_by(title: params[:title]) - if movie.save - render json: movie.as_json(only: [:id]), - status: :ok + if !@movie + new_movie = Movie.new(movie_params) + + if new_movie.save + render json: new_movie.as_json(only: [:id]), + status: :ok + else + render json: { + ok: false, + message: new_movie.errors.messages + }, status: :bad_request + end else render json: { - ok: false, - message: movie.errors.messages - }, status: :bad_request + ok: false, + message: "Movie already exists in the library." + }, status: :bad_request end end From 778b4184b68d3ee055aeb6ceb01287e8c2a4e9b9 Mon Sep 17 00:00:00 2001 From: Alice Hsiao Date: Tue, 18 Dec 2018 10:35:49 -0800 Subject: [PATCH 04/14] Slight changes to controller --- app/controllers/movies_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index af3107f2..9b25ddb0 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -56,4 +56,4 @@ def require_movie def movie_params params.permit(:title, :external_id, :overview, :image_url, :release_date) end -end +end \ No newline at end of file From ba99a2d1830d09a92a39f06c7149f8bdd5a87ace Mon Sep 17 00:00:00 2001 From: Katie Jahanmir Date: Tue, 18 Dec 2018 10:40:06 -0800 Subject: [PATCH 05/14] added controller testing create method --- app/controllers/movies_controller.rb | 48 +++++++++++----------- app/models/movie.rb | 7 ++++ test/controllers/movies_controller_test.rb | 47 +++++++++++++++++++++ test/fixtures/movies.yml | 4 ++ test/models/movie_test.rb | 4 +- 5 files changed, 86 insertions(+), 24 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index af3107f2..ad9dcbcb 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -14,25 +14,27 @@ def index def create @movie = Movie.find_by(title: params[:title]) - if !@movie - new_movie = Movie.new(movie_params) - - if new_movie.save - render json: new_movie.as_json(only: [:id]), - status: :ok - else - render json: { - ok: false, - message: new_movie.errors.messages - }, status: :bad_request - end - else - render json: { - ok: false, - message: "Movie already exists in the library." - }, status: :bad_request - end - end + if !@movie + new_movie = Movie.new(movie_params) + + if new_movie.save + render json: new_movie.as_json(only: [:id]), + status: :ok + else + render json: { + ok: false, + message: new_movie.errors.messages + }, status: :bad_request + end + else + render json: { + ok: false, + message: "Movie already exists in library" + }, status: :bad_request + end + + end + def show render( @@ -46,14 +48,14 @@ def show private + def movie_params + params.permit(:title, :external_id, :overview, :image_url, :release_date) + end + def require_movie @movie = Movie.find_by(title: params[:title]) unless @movie render status: :not_found, json: { errors: { title: ["No movie with title #{params["title"]}"] } } end end - - def movie_params - params.permit(:title, :external_id, :overview, :image_url, :release_date) - end end diff --git a/app/models/movie.rb b/app/models/movie.rb index 0016080b..89927704 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -2,6 +2,13 @@ class Movie < ApplicationRecord has_many :rentals has_many :customers, through: :rentals + + validates :title, presence: true + validates :overview, presence: true + validates :image_url, presence: true + validates :release_date, presence: true + validates :external_id, presence: true + def available_inventory self.inventory - Rental.where(movie: self, returned: false).length end diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 9172cf6e..3b294314 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -75,4 +75,51 @@ class MoviesControllerTest < ActionDispatch::IntegrationTest end end + + describe "create" do + let(:movie_data) { + { + "title": "Jack the Movie", + "overview": "A cool movie", + "release_date": "Oct 23 2018", + "external_id": 10, + "image_url": "image", + } + } + + it "creates a new movie given valid data" do + + expect { + post movies_path, params: movie_data + }.must_change "Movie.count", 1 + + body = JSON.parse(response.body) + + expect(body).must_be_kind_of Hash + expect(body).must_include "id" + + movie = Movie.find(body["id"].to_i) + expect(movie.title).must_equal movie_data[:title] + must_respond_with :success + + end + + + it "returns an error for invalid movie data" do + # arrange + movie_data["title"] = nil + + expect { + post movies_path, params: { movie: movie_data } + }.wont_change "Movie.count" + + body = JSON.parse(response.body) + + expect(body).must_be_kind_of Hash + expect(body).must_include "message" + expect(body["message"]).must_include "title" + must_respond_with :bad_request + end + + end end diff --git a/test/fixtures/movies.yml b/test/fixtures/movies.yml index caf6e68b..7162f057 100644 --- a/test/fixtures/movies.yml +++ b/test/fixtures/movies.yml @@ -5,9 +5,13 @@ one: overview: MyText release_date: 2017-01-11 inventory: 4 + external_id: 121323 + image_url: http://lorempixel.com/185/278/ two: title: MuchFilm overview: MyText release_date: 2017-01-11 inventory: 7 + external_id: 3545 + image_url: http://lorempixel.com/185/278/ diff --git a/test/models/movie_test.rb b/test/models/movie_test.rb index 70b6a7c6..3e0934a1 100644 --- a/test/models/movie_test.rb +++ b/test/models/movie_test.rb @@ -6,7 +6,9 @@ class MovieTest < ActiveSupport::TestCase "title": "Hidden Figures", "overview": "Some text", "release_date": "1960-06-16", - "inventory": 8 + "inventory": 8, + "external_id": 343, + "image_url": "http://lorempixel.com/185/278/" } } From 08c52df19d79ee7f61555ae9a1fb87ddb323ad5c Mon Sep 17 00:00:00 2001 From: Alice Hsiao Date: Tue, 18 Dec 2018 10:56:01 -0800 Subject: [PATCH 06/14] Added logic to make sure post requests coming from anywhere outside our application much be a legitimate movie before it adds to our video library --- app/controllers/movies_controller.rb | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 062c15a1..fe6dcc57 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -13,8 +13,10 @@ def index def create @movie = Movie.find_by(title: params[:title]) + data = MovieWrapper.search(params[:title]) - if !@movie + # if movie is not in our library, and also exists as a real movie in the external api, THEN add it + if !@movie && !data.empty? new_movie = Movie.new(movie_params) if new_movie.save @@ -29,7 +31,7 @@ def create else render json: { ok: false, - message: "Movie already exists in the library." + message: "Movie already exists in the library OR movie does not exist in this world." }, status: :bad_request end @@ -58,12 +60,4 @@ def require_movie render status: :not_found, json: { errors: { title: ["No movie with title #{params["title"]}"] } } end end -<<<<<<< HEAD end -======= - - def movie_params - params.permit(:title, :external_id, :overview, :image_url, :release_date) - end -end ->>>>>>> 778b4184b68d3ee055aeb6ceb01287e8c2a4e9b9 From 79b6da70e0e866c6b4ce1ee34a519992c0119b76 Mon Sep 17 00:00:00 2001 From: Katie Jahanmir Date: Tue, 18 Dec 2018 10:58:13 -0800 Subject: [PATCH 07/14] finished test on controller movies --- app/controllers/movies_controller.rb | 7 --- test/controllers/movies_controller_test.rb | 53 +++++++++++++++++++++- 2 files changed, 52 insertions(+), 8 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 062c15a1..db76f59b 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -58,12 +58,5 @@ def require_movie render status: :not_found, json: { errors: { title: ["No movie with title #{params["title"]}"] } } end end -<<<<<<< HEAD -end -======= - def movie_params - params.permit(:title, :external_id, :overview, :image_url, :release_date) - end end ->>>>>>> 778b4184b68d3ee055aeb6ceb01287e8c2a4e9b9 diff --git a/test/controllers/movies_controller_test.rb b/test/controllers/movies_controller_test.rb index 3b294314..f603c1ff 100644 --- a/test/controllers/movies_controller_test.rb +++ b/test/controllers/movies_controller_test.rb @@ -88,7 +88,7 @@ class MoviesControllerTest < ActionDispatch::IntegrationTest } it "creates a new movie given valid data" do - + expect { post movies_path, params: movie_data }.must_change "Movie.count", 1 @@ -121,5 +121,56 @@ class MoviesControllerTest < ActionDispatch::IntegrationTest must_respond_with :bad_request end + it "returns an error for invalid movie data" do + # arrange + movie_data["overview"] = nil + + expect { + post movies_path, params: { movie: movie_data } + }.wont_change "Movie.count" + + body = JSON.parse(response.body) + + expect(body).must_be_kind_of Hash + expect(body).must_include "message" + expect(body["message"]).must_include "overview" + must_respond_with :bad_request + end + + it "returns an error for invalid movie data" do + # arrange + movie_data["release_date"] = nil + + expect { + post movies_path, params: { movie: movie_data } + }.wont_change "Movie.count" + + body = JSON.parse(response.body) + + expect(body).must_be_kind_of Hash + expect(body).must_include "message" + expect(body["message"]).must_include "release_date" + must_respond_with :bad_request + end + + it "returns an error for invalid movie data" do + # arrange + movie_data["external_id"] = nil + + expect { + post movies_path, params: { movie: movie_data } + }.wont_change "Movie.count" + + body = JSON.parse(response.body) + + expect(body).must_be_kind_of Hash + expect(body).must_include "message" + expect(body["message"]).must_include "external_id" + must_respond_with :bad_request + end + + + + end end From 3f78f75100d288be305cd6d466035281ca91daaf Mon Sep 17 00:00:00 2001 From: Alice Hsiao Date: Tue, 18 Dec 2018 11:00:06 -0800 Subject: [PATCH 08/14] Add comments to the code about movies create --- app/controllers/movies_controller.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index fe6dcc57..f15474e9 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -14,8 +14,9 @@ def index def create @movie = Movie.find_by(title: params[:title]) data = MovieWrapper.search(params[:title]) - - # if movie is not in our library, and also exists as a real movie in the external api, THEN add it + + # data exists for the sole purpose of when someone tries to add a movie NOT through our web app (ex: postman) + # if movie is not in our library, and also exists as a real movie in the external api, THEN add it if !@movie && !data.empty? new_movie = Movie.new(movie_params) From 970168688e1cc25976d57b14ab9eea513572455a Mon Sep 17 00:00:00 2001 From: Alice Hsiao Date: Tue, 18 Dec 2018 15:42:46 -0800 Subject: [PATCH 09/14] Added logic to manage customer movies checked out count in database --- app/controllers/rentals_controller.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 67e77073..8abb460c 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -7,7 +7,9 @@ def check_out rental = Rental.new(movie: @movie, customer: @customer, due_date: params[:due_date]) if rental.save - render status: :ok, json: {} + @customer.movies_checked_out_count += 1 + @customer.save + render status: :ok, json: { success: "Movie has been checked out!" } else render status: :bad_request, json: { errors: rental.errors.messages } end From fab6cab0b76769544a8d4a58f7f99d96507a938e Mon Sep 17 00:00:00 2001 From: Alice Hsiao Date: Tue, 18 Dec 2018 16:04:33 -0800 Subject: [PATCH 10/14] Deleted movies checked out count --- app/controllers/rentals_controller.rb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/controllers/rentals_controller.rb b/app/controllers/rentals_controller.rb index 8abb460c..67e77073 100644 --- a/app/controllers/rentals_controller.rb +++ b/app/controllers/rentals_controller.rb @@ -7,9 +7,7 @@ def check_out rental = Rental.new(movie: @movie, customer: @customer, due_date: params[:due_date]) if rental.save - @customer.movies_checked_out_count += 1 - @customer.save - render status: :ok, json: { success: "Movie has been checked out!" } + render status: :ok, json: {} else render status: :bad_request, json: { errors: rental.errors.messages } end From abef45d2134adb252ff65ba7bde43a8875aa387c Mon Sep 17 00:00:00 2001 From: Alice Hsiao Date: Wed, 19 Dec 2018 14:52:49 -0800 Subject: [PATCH 11/14] updated bundler --- .gitignore | 5 +++++ app/controllers/movies_controller.rb | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 4a494a75..58456ca4 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,8 @@ # Ignore master key for decrypting credentials and more. /config/master.key + +# Elastic Beanstalk Files +.elasticbeanstalk/* +!.elasticbeanstalk/*.cfg.yml +!.elasticbeanstalk/*.global.yml diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 3ab2aabf..bcd6dcdd 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -14,7 +14,7 @@ def index def create @movie = Movie.find_by(title: params[:title]) data = MovieWrapper.search(params[:title]) - + # data exists for the sole purpose of when someone tries to add a movie NOT through our web app (ex: postman) # if movie is not in our library, and also exists as a real movie in the external api, THEN add it if !@movie && !data.empty? From 00a712e5253cfc3fcc371260633403c2b14e73c4 Mon Sep 17 00:00:00 2001 From: Alice Hsiao Date: Wed, 19 Dec 2018 14:53:56 -0800 Subject: [PATCH 12/14] changed ruby version in gemfile --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 2d53ba9c..7f721b54 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,7 @@ source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } -ruby '2.5.1' +ruby '2.5.3' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' From 2c95432c91660b84f0c19fcb3c6f9cd6c11910f7 Mon Sep 17 00:00:00 2001 From: Alice Hsiao Date: Wed, 19 Dec 2018 14:55:41 -0800 Subject: [PATCH 13/14] Added production code --- config/database.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/config/database.yml b/config/database.yml index 50748d61..5e7bd939 100644 --- a/config/database.yml +++ b/config/database.yml @@ -21,7 +21,9 @@ test: production: <<: *default - database: _production - username: - password: <%= ENV['_DATABASE_PASSWORD'] %> + database: <%= ENV['RDS_DB_NAME'] %> + username: <%= ENV['RDS_USERNAME'] %> + password: <%= ENV['RDS_PASSWORD'] %> + host: <%= ENV['RDS_HOSTNAME'] %> + port: <%= ENV['RDS_PORT'] %> From a40e20044828edeae1de6ab40a49d9baa109baef Mon Sep 17 00:00:00 2001 From: Alice Hsiao Date: Wed, 19 Dec 2018 14:56:20 -0800 Subject: [PATCH 14/14] Updated GemFile --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 7f721b54..2d53ba9c 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,7 @@ source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } -ruby '2.5.3' +ruby '2.5.1' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails'