Skip to content

Latest commit

 

History

History
executable file
·
151 lines (116 loc) · 2.94 KB

movie-finder-api.md

File metadata and controls

executable file
·
151 lines (116 loc) · 2.94 KB

Movie Finder API in Rails

Model and migrations

  • a user has many likes
  • a like belongs to a user
  • a like has a movie's omdb_id and title

Code

In Gemfile,

source 'https://rubygems.org'

ruby '2.2.2'
gem 'rails', '4.2.3'

gem 'pg'
gem 'jbuilder', '~> 2.0'
gem 'uglifier', '>= 1.3.0'
gem 'unicorn'
gem 'devise_token_auth'
gem 'omniauth'
gem 'rack-cors', :require => 'rack/cors'

group :development do
  gem "web-console"
  gem "better_errors"
  gem "binding_of_caller"
end

group :development, :test do
  gem "awesome_print"
  gem "bundler-audit", require: false
  gem "byebug"
  gem "dotenv-rails"
  gem "factory_girl_rails"
  gem "pry-rails"
  gem "rspec-rails", "~> 3.0"
end

In config/database.yml,

default: &default
  adapter: postgresql
  host: localhost
  port: 5432
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: rails_movie_finder_development

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: rails_movie_finder_test

production:
  <<: *default
  database: db/production.sqlite3

In config/routes.rb,

Rails.application.routes.draw do
  mount_devise_token_auth_for 'User', at: 'auth'

  resources :users, only: [:show] do
    resources :likes, only: [:index, :create]
  end

  get '/movies' => 'movies#index'
  get '/movies/:omdb_id' => 'movies#show'
end

In config/application.rb,

config.middleware.insert_before 0, "Rack::Cors" do
  allow do
    origins '*' # Control the domains
    resource '*', :headers => :any, :methods => [:get, :post, :options, :put, :patch, :delete] # Control the resources
  end
end

In app/controllers/application_controller.rb,

class ApplicationController < ActionController::Base
  include DeviseTokenAuth::Concerns::SetUserByToken
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  # protect_from_forgery with: :exception
end

In app/controllers/movies_controller.rb,

class MoviesController < ApplicationController
  def index
    require 'open-uri'

    url = "http://www.omdbapi.com?s=" + params[:query]
    url_data = open(url).read

    render json: url_data
  end

  def show
    require 'open-uri'

    url = "http://www.omdbapi.com?i=" + params[:omdb_id]
    url_data = open(url).read

    render json: url_data
  end
end

In app/controllers/likes_controller.rb,

class LikesController < ApplicationController
  def index
    @user = User.find(params[:user_id])
    @likes = @user.likes
    @likes = @likes.where(omdb_id: params[:omdb_id]) if params[:omdb_id]

    render json: @likes, status: :ok
  end

  def create
    @user = User.find(params[:user_id])
    @like = @user.likes.create(omdb_id: params[:like][:omdb_id], title: params[:like][:title])

    render json: @like
  end
end