lib/sidekiq/cron/web_extension.rb



module Sidekiq
  module Cron
    module WebExtension
      module Helpers
        def cron_route_params(key)
          if Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new("8.0.0")
            route_params(key)
          else
            route_params[key]
          end
        end

        # This method constructs the URL for the cron jobs page within the specified namespace.
        def namespace_redirect_path
          "#{root_path}cron/namespaces/#{cron_route_params(:namespace)}"
        end

        def redirect_to_previous_or_default
          if Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new("8.0.0")
            redirect url_params('redirect') || namespace_redirect_path
          else
            redirect params["redirect"] || namespace_redirect_path
          end
        end

        def render_erb(view)
          path = Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new("8.0.0") ? "views" : "views/legacy"
          views_path = File.join(File.expand_path("..", __FILE__), path)
          erb(File.read(File.join(views_path, "#{view}.erb")))
        end
      end

      def self.registered(app)
        locales = if Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new("8.0.0")
                    Sidekiq::Web.configure.locales
                  else
                    app.settings.locales
                  end

        locales << File.join(File.expand_path("..", __FILE__), "locales")

        app.helpers(Helpers)

        # Index page.
        app.get '/cron' do
          @current_namespace = 'default'
          @cron_jobs = Sidekiq::Cron::Job.all(@current_namespace)

          render_erb(:cron)
        end

        # Detail page for a specific namespace.
        app.get '/cron/namespaces/:name' do
          @current_namespace = cron_route_params(:name)
          @cron_jobs = Sidekiq::Cron::Job.all(@current_namespace)

          render_erb(:cron)
        end

        # Display job detail + jid history.
        app.get '/cron/namespaces/:namespace/jobs/:name' do
          @current_namespace = cron_route_params(:namespace)
          @job = Sidekiq::Cron::Job.find(cron_route_params(:name), @current_namespace)

          if @job
            render_erb(:cron_show)
          else
            redirect namespace_redirect_path
          end
        end

        # Enqueue all cron jobs.
        app.post '/cron/namespaces/:namespace/all/enqueue' do
          Sidekiq::Cron::Job.all(cron_route_params(:namespace)).each(&:enqueue!)

          redirect_to_previous_or_default
        end

        # Enqueue cron job.
        app.post '/cron/namespaces/:namespace/jobs/:name/enqueue' do
          if job = Sidekiq::Cron::Job.find(cron_route_params(:name), cron_route_params(:namespace))
            job.enqueue!
          end

          redirect_to_previous_or_default
        end

        # Delete all schedules.
        app.post '/cron/namespaces/:namespace/all/delete' do
          Sidekiq::Cron::Job.all(cron_route_params(:namespace)).each(&:destroy)

          redirect_to_previous_or_default
        end

        # Delete schedule.
        app.post '/cron/namespaces/:namespace/jobs/:name/delete' do
          if job = Sidekiq::Cron::Job.find(cron_route_params(:name), cron_route_params(:namespace))
            job.destroy
          end

          redirect_to_previous_or_default
        end

        # Enable all jobs.
        app.post '/cron/namespaces/:namespace/all/enable' do
          Sidekiq::Cron::Job.all(cron_route_params(:namespace)).each(&:enable!)

          redirect_to_previous_or_default
        end

        # Enable job.
        app.post '/cron/namespaces/:namespace/jobs/:name/enable' do
          if job = Sidekiq::Cron::Job.find(cron_route_params(:name), cron_route_params(:namespace))
            job.enable!
          end

          redirect_to_previous_or_default
        end

        # Disable all jobs.
        app.post '/cron/namespaces/:namespace/all/disable' do
          Sidekiq::Cron::Job.all(cron_route_params(:namespace)).each(&:disable!)

          redirect_to_previous_or_default
        end

        # Disable job.
        app.post '/cron/namespaces/:namespace/jobs/:name/disable' do
          if job = Sidekiq::Cron::Job.find(cron_route_params(:name), cron_route_params(:namespace))
            job.disable!
          end

          redirect_to_previous_or_default
        end
      end
    end
  end
end