require 'librarix/filter' require 'librarix/menu' require 'librarix/the_movie_db' require 'librarix/helpers' require 'sinatra/base' require 'sinatra/content_for' require 'sinatra/json' require 'sinatra/namespace' require 'yaml' require 'slim' require 'themoviedb' module Librarix class Application < Sinatra::Application def initialize(app = nil) super Librarix::Menu.menu.add 'Home', '/' Librarix::Menu.menu.add 'Add a movie', '/search' end helpers Librarix::TheMovieDB helpers Librarix::Menu::Helper helpers Librarix::Helpers namespace '/api/v1' do helpers do def base_url @base_url ||= "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}" end def json_params begin JSON.parse(request.body.read) rescue halt 400, { message:'Invalid JSON' }.to_json end end end before do content_type 'application/json' end get '/movies' do Librarix::Filter.new(params).movies.to_json end post '/movies' do id = json_params['tmdb_id'].to_i movie = Tmdb::Movie.detail(id) if movie['status_code'] != 34 && !Librarix::Redis::Movie.new(id).added? Librarix::Redis::Movie.new(id).add.to_json end end get '/movies/:id' do |id| Librarix::Redis::Movie.new(id).fetch.to_json end get '/movies/:id/fetch' do |id| Librarix::Redis::Movie.new(id).update end patch '/movies/:id/view' do |id| Librarix::Redis::Movie.new(params[:id]).view end delete '/movies/:id' do |id| Librarix::Redis::Movie.new(params[:id]).remove end end get '/' do slim :index, locals: {filter: Librarix::Filter.new(params)} end get '/movie/:id' do |id| movie = Librarix::Redis::Movie.new(id).fetch if request.xhr? slim :'partials/movie', layout: false, locals: {movie: movie} else slim :movie, locals: {movie: movie} end end get '/search' do movies = if params['search'].nil? Tmdb::Movie.popular.map { |m| Tmdb::Movie.new(m) } elsif params['search'] == '' [] else Tmdb::Movie.find(params['search']) end slim :search, locals: {movies: movies} end post '/add' do id = params[:id].to_i movie = Tmdb::Movie.detail(id) if movie['status_code'] == 34 elsif Librarix::Redis::Movie.new(id).added? else Librarix::Redis::Movie.new(id).add end redirect to('/') end post '/update' do movie = Librarix::Redis::Movie.new(params[:id]).update if request.xhr? slim :'partials/movie', layout: false, locals: {movie: movie} else redirect to('/') end end post '/remove' do Librarix::Redis::Movie.new(params[:id]).remove if request.xhr? "" else redirect to('/') end end post '/view' do Librarix::Redis::Movie.new(params[:id]).view if request.xhr? "" else redirect to('/') end end end end