package Mojolicious::Plugin::Minion::Overview; use Mojo::Base 'Mojolicious::Plugin'; use Mojolicious::Plugin::Minion::Overview::Facade; use Mojo::ByteStream 'b'; use Mojo::Date; use Mojo::File 'path'; our $VERSION = '0.1.2'; =head2 register Register the plugin and defined the routes =cut sub register { my ($self, $app, $config) = @_; # TODO: Find out why the connection is dropped # my $minion_overview = Mojolicious::Plugin::Minion::Overview::Facade->load($app->minion); $app->helper(minion_overview => sub { Mojolicious::Plugin::Minion::Overview::Facade->load($app->minion) }); $app->helper(overview_job_status => sub { my ($c, $status) = @_; my $html = sprintf('', $status); if ($status eq 'finished') { $html = sprintf('', $status); } elsif ($status eq 'failed') { $html = sprintf('', $status); } elsif ($status eq 'active') { $html = sprintf('', $status); } return b($html); }); $app->helper(overview_job_date => sub { my ($c, $timestamp) = @_; my $date = Mojo::Date->new($timestamp); return $date->to_datetime; }); push(@{ $app->routes->namespaces }, 'Mojolicious::Plugin::Minion::Overview::Controller'); # Config my $prefix = $config->{route} // $app->routes->route('minion-overview'); $prefix->to(return_to => $config->{return_to} // '/'); # Static files my $resources = path(__FILE__)->sibling('Overview', 'resources'); push @{$app->static->paths}, $resources->child('public')->to_string; # Templates push @{$app->renderer->paths}, $resources->child('templates')->to_string; # Set date $prefix->get('/date/:date') ->to(controller => 'Overview', action => 'setDate') ->name('minion_overview.overview.set_date'); # Dashboard $prefix->get('/') ->to(controller => 'Dashboard', action => 'search'); my $dashboard = $prefix->route('dashboard') ->to(controller => 'Dashboard'); $dashboard->get('/')->to(action => 'search') ->name('minion_overview.dashboard'); $dashboard->get('overview')->to(action => 'overview') ->name('minion_overview.dashboard.overview'); $dashboard->get('workers')->to(action => 'workers') ->name('minion_overview.dashboard.workers'); # Metrics my $metrics = $prefix->route('metrics') ->to(controller => 'Metrics'); $metrics->get('/')->to(action => 'search') ->name('minion_overview.metrics'); my $metrics_jobs = $metrics->route('jobs') ->to(controller => 'Metrics::Jobs'); $metrics_jobs->get(':job')->to(action => 'show') ->name('minion_overview.metrics.jobs.show'); my $metrics_workers = $metrics->route('workers') ->to(controller => 'Metrics::Workers'); $metrics_workers->get(':worker')->to(action => 'show') ->name('minion_overview.metrics.workers.show'); # Recent Jobs my $failed_jobs = $prefix->route('failed-jobs') ->to(controller => 'FailedJobs'); $failed_jobs->get('/')->to(action => 'search') ->name('minion_overview.failed_jobs'); # Jobs my $jobs = $prefix->route('jobs') ->to(controller => 'Jobs'); $jobs->get('/')->to(action => 'search') ->name('minion_overview.jobs'); $jobs->get('/:id')->to(action => 'show') ->name('minion_overview.jobs.show'); $jobs->get('/:id/retry')->to(action => 'retry') ->name('minion_overview.jobs.retry'); # API my $api = $prefix->route('api'); # Metrics my $api_metrics = $api->route('metrics'); # Jobs my $api_metrics_jobs = $api_metrics->route('jobs') ->to(controller => 'API::Metrics::Jobs'); $api_metrics_jobs->get('/:job/runtime')->to(action => 'runtime') ->name('minion_overview.api.metrics.jobs.runtime'); $api_metrics_jobs->get('/:job/throughput')->to(action => 'throughput') ->name('minion_overview.api.metrics.jobs.throughput'); # Workers my $api_metrics_workers = $api_metrics->route('workers') ->to(controller => 'API::Metrics::Workers'); $api_metrics_workers->get('/:worker/waittime')->to(action => 'waittime') ->name('minion_overview.api.metrics.workers.waittime'); $api_metrics_workers->get('/:worker/throughput')->to(action => 'throughput') ->name('minion_overview.api.metrics.workers.throughput'); } 1;