nathan-v/resque-state

View on GitHub
lib/resque/state_server.rb

Summary

Maintainability
A
2 hrs
Test Coverage
require 'resque/server'
require 'resque-state'

module Resque
  ## Resque Server plugin for Resque Status
  module StateServer
    VIEW_PATH = File.join(File.dirname(__FILE__), 'server', 'views')
    PER_PAGE = 50

    def self.registered(app)
      app.get '/state' do
        @start = params[:start].to_i
        @end = @start + (params[:per_page] || per_page) - 1
        @statuses = Resque::Plugins::State::Hash.statuses(@start, @end)
        @size = Resque::Plugins::State::Hash.count
        status_view(:statuses)
      end

      app.get '/state/:id.js' do
        @status = Resque::Plugins::State::Hash.get(params[:id])
        content_type :js
        @status.json
      end

      app.get '/state/:id' do
        @status = Resque::Plugins::State::Hash.get(params[:id])
        status_view(:state)
      end

      app.post '/state/:id/kill' do
        Resque::Plugins::State::Hash.kill(params[:id])
        redirect u(:state)
      end

      app.post '/state/clear' do
        Resque::Plugins::State::Hash.clear
        redirect u(:state)
      end

      app.post '/state/clear/completed' do
        Resque::Plugins::State::Hash.clear_completed
        redirect u(:state)
      end

      app.post '/state/clear/failed' do
        Resque::Plugins::State::Hash.clear_failed
        redirect u(:state)
      end

      app.get '/state.poll' do
        content_type 'text/plain'
        @polling = true

        @start = params[:start].to_i
        @end = @start + (params[:per_page] || per_page) - 1
        @statuses = Resque::Plugins::State::Hash.statuses(@start, @end)
        @size = Resque::Plugins::State::Hash.count
        status_view(:statuses, layout: false)
      end

      app.helpers do
        def per_page
          PER_PAGE
        end

        def status_view(filename, options = {}, locals = {})
          erb(File.read(File.join(::Resque::StateServer::VIEW_PATH, "#{filename}.erb")), options, locals)
        end

        def status_poll(start)
          if @polling
            text = "Last Updated: #{Time.now.strftime('%H:%M:%S')}"
          else
            text = "<a href='#{u(request.path_info)}.poll?start=#{start}' rel='poll'>Live Poll</a>"
          end
          "<p class='poll'>#{text}</p>"
        end
      end

      app.tabs << 'State'
    end
  end
end

Resque::Server.register Resque::StateServer