diff --git a/lib/CPAN/Testers/Web.pm b/lib/CPAN/Testers/Web.pm index 0c88eb9..67786d6 100644 --- a/lib/CPAN/Testers/Web.pm +++ b/lib/CPAN/Testers/Web.pm @@ -47,11 +47,44 @@ sub startup ( $app ) { catdir( dist_dir( 'CPAN-Testers-Web' ), 'public' ); unshift @{ $app->commands->namespaces }, 'CPAN::Testers::Web::Command'; + $app->moniker( 'web' ); # This application has no configuration yet $app->plugin( Config => { default => { api_host => 'api.cpantesters.org', + dist_modules => [qw/ + Mojolicious + Moose + Moo + DBIx-Class + App-cpanminus + DBI + Plack + DateTime + Devel-NYTProf + Test-Simple + Path-Tiny + Dist-Zilla + Scalar-List-Utils + App-perlbrew + Try-Tiny + libwww-perl + AnyEvent + Catalyst-Runtime + Data-Printer + Dancer + Template-Toolkit + Type-Tiny + Perl-Tidy + Dancer2 + Perl-Critic + ack + Carton + Getopt-Long + List-MoreUtils + Task-Kensho + /] }, } ); @@ -222,12 +255,9 @@ sub startup ( $app ) { ->name( 'release.dist' ) ->to( 'reports#dist_versions' ); - $r->get( '/dist' ) - ->name( 'dist-search' ) - ->to( cb => sub { - my ( $c ) = @_; - $c->render( 'dist-search' ); - } ); + $r->get( '/dist' )->name( 'dist-search' )->to( 'dist#search' ); + $r->post( '/dist' )->name( 'dist-recent' )->to( 'dist#recent' ); + $r->post( '/dist/valid' )->name( 'dist-valid' )->to( 'dist#valid' ); $r->get( '/author/:author', [ format => [qw( html rss json)] ] ) ->name( 'reports.author' ) diff --git a/lib/CPAN/Testers/Web/Controller/Dist.pm b/lib/CPAN/Testers/Web/Controller/Dist.pm new file mode 100644 index 0000000..edf7446 --- /dev/null +++ b/lib/CPAN/Testers/Web/Controller/Dist.pm @@ -0,0 +1,92 @@ +package CPAN::Testers::Web::Controller::Dist; +our $VERSION = '0.001'; +# ABSTRACT: Endpoints for viewing and managing distributions + +=head1 DESCRIPTION + +=head1 SEE ALSO + +=cut + +use Mojo::Base 'Mojolicious::Controller'; +use CPAN::Testers::Web::Base; +use CPAN::Testers::Web::Controller::Legacy; + +=method search + +Landing page for /dist + +Lists modules configured in the config + +=cut + +sub search ( $c ) { + $c->render('dist/search', + dists => $c->config->{dist_modules} + ); +} + +=method recent + +Expects a list of dists and will return the most recent for each. + +=cut + +sub recent ( $c ) { + my $join = $c->schema->perl5->resultset('Release')->search({ + dist => { -in => $c->req->json->{dists} } + }, { + group_by => [qw( me.dist )], + select => [qw/dist/, \('MAX(version)')], + as => [qw/dist version/] + }); + + if (!$join->count) { + return $c->render( json => { dists => [] } ); + } + + my $rs = $c->schema->perl5->resultset('Release')->search({ + -or => [ + map +{ 'me.dist' => $_->dist, 'me.version' => $_->version }, $join->all() + ], + }, { + join => 'upload' + }); + + $c->render( json => { + dists => [ + map +{ + $_->get_inflated_columns, + released => $_->upload->released->datetime( ' ' ), + }, + $rs->all + ] + + } ); +} + +=method valid + +validate that a dist exists + +=cut + +sub valid ( $c ) { + my $rs = $c->schema->perl5->resultset('Release')->search({ + dist => { like => $c->req->json->{dist} . '%' } + }, { + distinct => 1, + select => ['dist'], + as => ['dist'], + rows => 50 + }); + + $c->render( json => { + dists => [ + map { $_->dist } + $rs->all + ] + } ); +} + +1; diff --git a/share/public/css/cpantesters.css b/share/public/css/cpantesters.css index 818efdd..dd33eb0 100644 --- a/share/public/css/cpantesters.css +++ b/share/public/css/cpantesters.css @@ -16,3 +16,13 @@ body { margin-bottom: 1em; } + +#popular tr th:first-child { + min-width: 150px; +} + +@media only screen and (max-width: 600px) { + #popular tr th:first-child { + min-width: auto; + } +} diff --git a/share/templates/dist/search.html.ep b/share/templates/dist/search.html.ep new file mode 100644 index 0000000..18267a2 --- /dev/null +++ b/share/templates/dist/search.html.ep @@ -0,0 +1,207 @@ + +% title 'Search Distributions'; + +
+
+
+ +

Search Distributions

+ +
+
+ + +
+ +
+ +

Popular Distributions

+ + + + + + + + + + + + + + + + + + + + + +
+
+