ike18t/spotify_jukebox

View on GitHub
app/jukebox_web.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'sinatra/asset_pipeline'

class JukeboxWeb < Sinatra::Base
  set :root, File.expand_path(File.join(File.dirname(__FILE__), '..'))
  set :bind, '0.0.0.0'
  set :sockets, []
  set :sprockets, Sprockets::Environment.new(root)
  set :assets_paths, %w('frontend/dist' 'app/js' 'app/css')
  set :assets_css_compressor, :scss
  set :assets_paths, %w(frontend/dist app/js app/css)
  set :assets_precompile, 'application.js', 'js/style.scss'
  set :logging, true

  helpers do
    include Sprockets::Helpers
  end

  register Sinatra::AssetPipeline

  @@currently_playing = nil
  post '/player_endpoint' do
    @@currently_playing = JSON.parse(params['now_playing']).merge(play_status: { playing: true, timestamp: Time.now.to_i })
    broadcast @@currently_playing
    :ok
  end

  get '/websocket_connect' do
    return 'Websocket connection required' unless request.websocket?
    request.websocket do |ws|
      ws.onopen do
        broadcast_enabled [ws]
        ws.send(@@currently_playing.to_json) unless @@currently_playing.nil?
        settings.sockets << ws
      end
      ws.onclose do
        settings.sockets.delete ws
      end
    end
  end

  get '/whatbeplayin' do
    headers 'Access-Control-Allow-Origin'         => '*',
            'Access-Conformation-Request-Method'  => 'GET'
    content_type 'application/json'
    @@currently_playing.merge(play_status: { playing: MusicService.playing?, timestamp: Time.now.to_i }).to_json
  end

  put '/play' do
    MusicService.play!
    broadcast(play_status: { playing: MusicService.playing?, timestamp: Time.now.to_i })
    :ok
  end

  put '/pause' do
    MusicService.stop!
    broadcast(play_status: { playing: MusicService.playing?, timestamp: Time.now.to_i })
    :ok
  end

  put '/skip' do
    MusicService.skip!
    :ok
  end

  get '/' do
    haml :index
  end

  get '/users' do
    UserService.get_users.map(&:to_hash).to_json
  end

  get '/playlists' do
    PlaylistService.get_playlists.map(&:to_hash).to_json
  end

  post '/playlists' do
    playlist_url = params[:playlist_url]
    playlist_info = WebHelper.get_playlist_id_and_user_id_from_url playlist_url
    playlist_uri = WebHelper.create_playlist_uri playlist_info[:playlist_id], playlist_info[:user_id]
    PlaylistService.create_playlist playlist_info[:playlist_id], playlist_info[:user_id], playlist_uri
    redirect '/'
  end

  post '/users/:user_id/playlists' do
    user_id = params[:user_id]
    playlist_url = params[:playlist_url]
    playlist_info = WebHelper.get_playlist_id_and_user_id_from_url playlist_url
    playlist_uri = WebHelper.create_playlist_uri playlist_info[:playlist_id], playlist_info[:user_id]
    PlaylistService.create_playlist playlist_info[:playlist_id], user_id, playlist_uri
    broadcast_enabled
    :ok
  end

  delete '/playlists/:playlist_id' do
    playlist_id = params[:playlist_id]
    PlaylistService.remove_playlist playlist_id
    :ok
  end

  delete '/users/:user_id' do
    user_id = params[:user_id]
    UserService.remove_user user_id
    :ok
  end

  put '/playlists/:playlist_id/enable' do
    return broadcast_results { PlaylistService.enable_playlist params[:playlist_id] }
  end

  put '/playlists/:playlist_id/disable' do
    return broadcast_results { PlaylistService.disable_playlist params[:playlist_id] }
  end

  put '/users/:user_id/enable' do
    return broadcast_results { UserService.enable_user params[:user_id] }
  end

  put '/users/:user_id/disable' do
    return broadcast_results { UserService.disable_user params[:user_id] }
  end

  def broadcast_results
    yield
    broadcast_enabled
    :ok
  end

  def broadcast_enabled(sockets = settings.sockets)
    users = UserService.get_users.map(&:to_hash)
    playlists = PlaylistService.get_playlists.map(&:to_hash)
    broadcast({ users: users, playlists: playlists }, sockets)
  end

  def broadcast(hash, sockets = settings.sockets)
    json_string = hash.to_json.to_s
    sockets.each do |socket|
      socket.send json_string
    end
  end
end