diff --git a/Gemfile b/Gemfile index 2d53ba9c..67166a4b 100644 --- a/Gemfile +++ b/Gemfile @@ -54,9 +54,13 @@ gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] group :development, :test do gem 'pry-rails' gem 'dotenv-rails' + gem 'rack-cors', :require => 'rack/cors' + end group :test do gem 'minitest-rails' gem 'minitest-reporters' end + +gem 'rack-cors', :require => 'rack/cors' diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index b6f240a3..6cab55f7 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,3 +1,6 @@ class ApplicationController < ActionController::Base #protect_from_forgery with: :exception + def render_error(status, errors) + render json: { errors: errors}, status: status + end end diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 362e2791..e7ff2521 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -21,6 +21,20 @@ def show ) end + def create + movie = Movie.new(movie_params) + + result = movie.save + if result + # Do we need this line? + movie_id = movie.id + render json: movie.as_json(only: :id), status: :ok + else + render_error(:bad_request, movie.errors.messages) + end + + end + private def require_movie @@ -29,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(:external_id, :title, :overview, :release_date, :inventory, :image_url) + end end diff --git a/app/models/movie.rb b/app/models/movie.rb index 0016080b..61bda5e9 100644 --- a/app/models/movie.rb +++ b/app/models/movie.rb @@ -1,6 +1,7 @@ class Movie < ApplicationRecord has_many :rentals has_many :customers, through: :rentals + validates :title, uniqueness: true def available_inventory self.inventory - Rental.where(movie: self, returned: false).length diff --git a/config/application.rb b/config/application.rb index 7da209d4..d2f01ac5 100644 --- a/config/application.rb +++ b/config/application.rb @@ -15,10 +15,16 @@ class Application < Rails::Application #this loads everything in the lib folder automatically config.eager_load_paths << Rails.root.join('lib') + # config.action_dispatch.default_headers = { + # 'Access-Control-Allow-Origin' => '*', + # 'Access-Control-Request-Method' => %w{GET POST OPTIONS}.join(",") + # } + config.middleware.insert_before 0, Rack::Cors do allow do origins '*' resource '*', headers: :any, methods: [:get, :post, :patch, :put, :delete, :options] + end end end diff --git a/config/routes.rb b/config/routes.rb index f4c99688..76715f9a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -3,7 +3,7 @@ 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" diff --git a/db/schema.rb b/db/schema.rb index ffb28f7e..d4b52b3c 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,40 +10,43 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20180618042754) do +ActiveRecord::Schema.define(version: 2018_06_18_042754) do - create_table "customers", force: :cascade do |t| - t.string "name" + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" + + create_table "customers", id: :serial, force: :cascade do |t| + t.string "name" t.datetime "registered_at" - t.string "address" - t.string "city" - t.string "state" - t.string "postal_code" - t.string "phone" - t.float "account_credit" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false + t.string "address" + t.string "city" + t.string "state" + t.string "postal_code" + t.string "phone" + t.float "account_credit" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false end - create_table "movies", force: :cascade do |t| - t.string "title" - t.text "overview" - t.date "release_date" - t.integer "inventory" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.string "image_url" - t.integer "external_id" + create_table "movies", id: :serial, force: :cascade do |t| + t.string "title" + t.text "overview" + t.date "release_date" + t.integer "inventory" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.string "image_url" + t.integer "external_id" end - create_table "rentals", force: :cascade do |t| - t.integer "customer_id" - t.integer "movie_id" - t.date "checkout_date" - t.date "due_date" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.boolean "returned" + create_table "rentals", id: :serial, force: :cascade do |t| + t.integer "customer_id" + t.integer "movie_id" + t.date "checkout_date" + t.date "due_date" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.boolean "returned" t.index ["customer_id"], name: "index_rentals_on_customer_id" t.index ["movie_id"], name: "index_rentals_on_movie_id" end diff --git a/lib/movie_wrapper.rb b/lib/movie_wrapper.rb index c51d05ee..88ce716e 100644 --- a/lib/movie_wrapper.rb +++ b/lib/movie_wrapper.rb @@ -1,7 +1,7 @@ class MovieWrapper BASE_URL = "https://api.themoviedb.org/3/" - KEY = ENV["MOVIEDB_KEY"] + KEY = ENV["API_KEY"] BASE_IMG_URL = "https://image.tmdb.org/t/p/" DEFAULT_IMG_SIZE = "w185"