diff --git a/Gemfile b/Gemfile index 009415af..c5fd8e8b 100644 --- a/Gemfile +++ b/Gemfile @@ -37,6 +37,9 @@ gem 'jbuilder', '~> 2.5' gem 'will_paginate' +# Provide suppert for cross-origin resource sharing +gem 'rack-cors', require: 'rack/cors' + group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'byebug', platform: :mri diff --git a/Gemfile.lock b/Gemfile.lock index 9f7601a8..fcb76c2a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -118,8 +118,9 @@ GEM slop (~> 3.4) pry-rails (0.3.4) pry (>= 0.9.10) - puma (3.6.2) + puma (3.11.4) rack (2.0.1) + rack-cors (1.0.2) rack-test (0.6.3) rack (>= 1.0) rails (5.0.1) @@ -210,6 +211,7 @@ DEPENDENCIES minitest-spec-rails pry-rails puma (~> 3.0) + rack-cors rails (~> 5.0.1) sass-rails (~> 5.0) spring diff --git a/app/controllers/customers_controller.rb b/app/controllers/customers_controller.rb index be25f1be..39b46849 100644 --- a/app/controllers/customers_controller.rb +++ b/app/controllers/customers_controller.rb @@ -1,3 +1,5 @@ +require 'date' + class CustomersController < ApplicationController SORT_FIELDS = %w(name registered_at postal_code) @@ -10,7 +12,16 @@ def index data = Customer.all end - data = data.paginate(page: params[:p], per_page: params[:n]) + # data = data.paginate(page: params[:p], per_page: params[:n]) + + render json: data.as_json( + only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone, :account_credit], + methods: [:movies_checked_out_count] + ) + end + + def show + data = Customer.find_by(id: params[:id]) render json: data.as_json( only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone, :account_credit], @@ -18,7 +29,50 @@ def index ) end + def create + customer = Customer.new(customer_params) + customer.registered_at = Date.today + + if customer.save + render json: customer.as_json( + only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone, :account_credit], + methods: [:movies_checked_out_count] + ), status: :ok + else + render status: :bad_request + end + end + + def update + customer = Customer.find_by(id: params[:id]) + + customer.assign_attributes(customer_params) + + if customer.save + render json: customer.as_json( + only: [:id, :name, :registered_at, :address, :city, :state, :postal_code, :phone, :account_credit], + methods: [:movies_checked_out_count] + ), status: :ok + else + render status: :bad_request + end + + end + + def destroy + if Customer.delete(params[:id]) + render status: :ok + else + render status: :bad_request + end + end + private + + def customer_params + return params.permit(:name, :address, :city, :state, :postal_code, :phone, :account_credit) + end + def parse_query_args errors = {} @sort = params[:sort] diff --git a/app/controllers/movies_controller.rb b/app/controllers/movies_controller.rb index 362e2791..3d2a0409 100644 --- a/app/controllers/movies_controller.rb +++ b/app/controllers/movies_controller.rb @@ -21,6 +21,24 @@ def show ) end + def create + + movie = Movie.new( + title: params[:title], + overview: params[:overview], + release_date: params[:release_date], + image_url: params[:image_url], + external_id: params[:external_id], + inventory: 1 + ) + + if movie.save + render :nothing => true, status: :ok + else + render status: :bad_request + end + end + private def require_movie diff --git a/config/application.rb b/config/application.rb index cc803322..0e371183 100644 --- a/config/application.rb +++ b/config/application.rb @@ -15,9 +15,11 @@ 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, :options] + end + end end end diff --git a/config/routes.rb b/config/routes.rb index 54bf033e..2485ca36 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,9 +1,9 @@ Rails.application.routes.draw do # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html - resources :customers, only: [:index] + resources :customers, only: [:index, :show, :create, :update, :destroy] - 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"