diff --git a/Gemfile b/Gemfile index 2d53ba9c..8837c688 100644 --- a/Gemfile +++ b/Gemfile @@ -17,6 +17,7 @@ gem 'httparty' gem 'awesome_print' gem 'will_paginate' gem "active_model_serializers", require: true +gem 'react-rails' # Use Redis adapter to run Action Cable in production # gem 'redis', '~> 4.0' diff --git a/Gemfile.lock b/Gemfile.lock index a0a07df1..570414f6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -50,6 +50,10 @@ GEM ansi (1.5.0) arel (9.0.0) awesome_print (1.8.0) + babel-source (5.8.35) + babel-transpiler (0.7.0) + babel-source (>= 4.0, < 6) + execjs (~> 2.0) bootsnap (1.3.2) msgpack (~> 1.0) builder (3.2.3) @@ -57,13 +61,16 @@ GEM case_transform (0.2) activesupport coderay (1.1.2) + coffee-script-source (1.12.2) concurrent-ruby (1.1.4) + connection_pool (2.2.2) crass (1.0.4) dotenv (2.5.0) dotenv-rails (2.5.0) dotenv (= 2.5.0) railties (>= 3.2, < 6.0) erubi (1.7.1) + execjs (2.7.0) ffi (1.9.25) globalid (0.4.1) activesupport (>= 4.2.0) @@ -148,6 +155,13 @@ GEM rb-fsevent (0.10.3) rb-inotify (0.10.0) ffi (~> 1.0) + react-rails (1.7.1) + babel-transpiler (>= 0.7.0) + coffee-script-source (~> 1.8) + connection_pool + execjs + rails (>= 3.2) + tilt ruby-progressbar (1.10.0) ruby_dep (1.5.0) spring (2.0.2) @@ -164,6 +178,7 @@ GEM sprockets (>= 3.0.0) thor (0.20.3) thread_safe (0.3.6) + tilt (2.0.8) tzinfo (1.2.5) thread_safe (~> 0.1) websocket-driver (0.7.0) @@ -190,6 +205,7 @@ DEPENDENCIES puma (~> 3.11) rack-cors rails (~> 5.2.0) + react-rails spring spring-watcher-listen (~> 2.0.0) tzinfo-data diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 362e2791..2ada9e16 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -11,18 +11,32 @@ def index render status: :ok, json: data end + def create + movie = Movie.new(movie_params) + if movie.save + render json: movie.as_json(only:[:title, :overview, :release_date, :image_url, :external_id]) + else + render status: :bad_request, json: { errors: movie.errors.messages } + end + end + + def show render( status: :ok, json: @movie.as_json( only: [:title, :overview, :release_date, :inventory], methods: [:available_inventory] - ) ) + ) end private + def movie_params + params.permit(:title, :overview, :release_date, :inventory, :image_url) + end + def require_movie @movie = Movie.find_by(title: params[:title]) unless @movie 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..c7cb7c0a 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 + + # These are extensions that must be enabled in order to support this database + enable_extension "plpgsql" create_table "customers", force: :cascade do |t| - t.string "name" + 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" + 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" + 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