From c05b4e53a13c0fcef70666a4e91c6a8963264730 Mon Sep 17 00:00:00 2001 From: Gabor Szabo Date: Sun, 2 Nov 2014 07:20:01 +0200 Subject: [PATCH 1/9] pager implemented for /author/PAUSEID/releases page #1356 --- lib/MetaCPAN/Web/Controller/Author.pm | 22 +++++++++++++++------- root/author/releases.html | 2 +- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/lib/MetaCPAN/Web/Controller/Author.pm b/lib/MetaCPAN/Web/Controller/Author.pm index 77a8c7b691..53dc9c00a4 100644 --- a/lib/MetaCPAN/Web/Controller/Author.pm +++ b/lib/MetaCPAN/Web/Controller/Author.pm @@ -9,6 +9,8 @@ use Locale::Country (); BEGIN { extends 'MetaCPAN::Web::Controller' } +use MetaCPAN::Web::Types qw( PositiveInt ); + # Capture the PAUSE id in the root of the chain so we handle the upper-case redirect once. # Later actions in the chain can get the pauseid out of the stash. sub root : Chained('/') PathPart('author') CaptureArgs(1) { @@ -84,14 +86,19 @@ sub index : Chained('root') PathPart('') Args(0) { # /author/*/releases sub releases : Chained('root') PathPart Args(0) { my ( $self, $c ) = @_; + my $req = $c->req; my $id = $c->stash->{pauseid}; - my $size = 100; - my $page = $c->req->page > 0 ? $c->req->page : 1; + my $page_size = $req->param('size'); + unless ( is_PositiveInt($page_size) && $page_size <= 500 ) { + $page_size = 100; + } + + my $page = $c->req->page > 0 ? $c->req->page : 1; my $author_cv = $c->model('API::Author')->get($id); my $releases_cv - = $c->model('API::Release')->all_by_author( $id, $size, $page ); + = $c->model('API::Release')->all_by_author( $id, $page_size, $page ); my ( $author, $releases ) = ( $author_cv->recv, $releases_cv->recv ); @@ -100,7 +107,7 @@ sub releases : Chained('root') PathPart Args(0) { my $pageset = Data::Pageset->new( { total_entries => $releases->{hits}->{total}, - entries_per_page => $size, + entries_per_page => $page_size, current_page => $page, pages_per_set => 10, mode => 'slide' @@ -109,9 +116,10 @@ sub releases : Chained('root') PathPart Args(0) { $c->stash( { - releases => \@releases, - author => $author, - pageset => $pageset, + releases => \@releases, + author => $author, + pageset => $pageset, + page_size => $page_size, } ); } diff --git a/root/author/releases.html b/root/author/releases.html index 74a9f27761..fc0785775f 100644 --- a/root/author/releases.html +++ b/root/author/releases.html @@ -1,3 +1,3 @@ <% title = "All releases by " _ author.pauseid %> <% INCLUDE inc/release-table.html header = 1, tablesorter = 0 %> -<% INCLUDE inc/pager.html %> +<% INCLUDE inc/pager.html size = page_size %> From 8f997c0292ff2c598c2f820ce1d8719e3701496c Mon Sep 17 00:00:00 2001 From: Gabor Szabo Date: Sun, 2 Nov 2014 08:48:26 +0200 Subject: [PATCH 2/9] save the page size for the releases page #1356 --- root/static/js/cpan.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/root/static/js/cpan.js b/root/static/js/cpan.js index 0c50a3ca8a..216a88279c 100644 --- a/root/static/js/cpan.js +++ b/root/static/js/cpan.js @@ -301,6 +301,23 @@ $(document).ready(function () { $('#size').val(size); } + // TODO use a more specific locator for /author/PAUSID/release ? + $('a[href*="/releases"').on('click', function() { + var url = $(this).attr('href'); + var result = /size=(\d+)/.exec(url); + if (result && result[1]) { + var releases_page_size = result[1]; + localStorage.setItem('releases_page_size', releases_page_size); + return true; + } else { + releases_page_size = localStorage.getItem('releases_page_size'); + if (releases_page_size) { + document.location.href = url + '?size=' + releases_page_size; + return false; + }; + } + }); + }); function searchForNearest() { From e9897dde250bdb2183fd80a640c78837d419e92c Mon Sep 17 00:00:00 2001 From: Gabor Szabo Date: Sun, 2 Nov 2014 09:34:37 +0200 Subject: [PATCH 3/9] implement paging for the /recent page #1356 --- lib/MetaCPAN/Web/Controller/Recent.pm | 21 ++++++++++++++++----- lib/MetaCPAN/Web/Model/API/Release.pm | 6 +++--- root/recent.html | 2 +- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/lib/MetaCPAN/Web/Controller/Recent.pm b/lib/MetaCPAN/Web/Controller/Recent.pm index ea9fc91b41..c31132769d 100644 --- a/lib/MetaCPAN/Web/Controller/Recent.pm +++ b/lib/MetaCPAN/Web/Controller/Recent.pm @@ -3,19 +3,30 @@ use strict; use warnings; use base 'MetaCPAN::Web::Controller'; +use MetaCPAN::Web::Types qw( PositiveInt ); + sub index : Path { my ( $self, $c ) = @_; + my $req = $c->req; + + my $page_size = $req->param('size'); + unless ( is_PositiveInt($page_size) && $page_size <= 500 ) { + $page_size = 100; + } + my ($data) = $c->model('API::Release') - ->recent( $c->req->page, $c->req->params->{f} || 'l' )->recv; + ->recent( $c->req->page, $page_size, $c->req->params->{f} || 'l' ) + ->recv; my $latest = [ map { $_->{fields} } @{ $data->{hits}->{hits} } ]; $c->res->last_modified( $latest->[0]->{date} ) if (@$latest); $c->stash( { - recent => $latest, - took => $data->{took}, - total => $data->{hits}->{total}, - template => 'recent.html' + recent => $latest, + took => $data->{took}, + total => $data->{hits}->{total}, + template => 'recent.html', + page_size => $page_size, } ); } diff --git a/lib/MetaCPAN/Web/Model/API/Release.pm b/lib/MetaCPAN/Web/Model/API/Release.pm index e25df2bc37..79e2d4933b 100644 --- a/lib/MetaCPAN/Web/Model/API/Release.pm +++ b/lib/MetaCPAN/Web/Model/API/Release.pm @@ -114,7 +114,7 @@ sub all_by_author { } sub recent { - my ( $self, $page, $type ) = @_; + my ( $self, $page, $page_size, $type ) = @_; my $query; if ( $type eq 'n' ) { $query = $self->_new_distributions_query; @@ -134,8 +134,8 @@ sub recent { $self->request( '/release/_search', { - size => 100, - from => ( $page - 1 ) * 100, + size => $page_size, + from => ( $page - 1 ) * $page_size, query => $query, fields => [qw(name author status abstract date distribution)], sort => [ { 'date' => { order => 'desc' } } ] diff --git a/root/recent.html b/root/recent.html index bf87a60d50..81d456fea3 100644 --- a/root/recent.html +++ b/root/recent.html @@ -27,5 +27,5 @@ releases.push(release); END %> <% INCLUDE inc/release-table.html releases = releases %> -<% INCLUDE inc/pager.html size = 100 %> +<% INCLUDE inc/pager.html size = page_size %> From f1c7737d7af9432435f1bdf38c77fb47237aa0ea Mon Sep 17 00:00:00 2001 From: Gabor Szabo Date: Sun, 2 Nov 2014 09:42:15 +0200 Subject: [PATCH 4/9] save the page size setting for the /recent page #1356 --- root/static/js/cpan.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/root/static/js/cpan.js b/root/static/js/cpan.js index 216a88279c..441b7fdbb9 100644 --- a/root/static/js/cpan.js +++ b/root/static/js/cpan.js @@ -318,6 +318,23 @@ $(document).ready(function () { } }); + $('a[href*="/recent"').on('click', function() { + var url = $(this).attr('href'); + var result = /size=(\d+)/.exec(url); + if (result && result[1]) { + var recent_page_size = result[1]; + localStorage.setItem('recent_page_size', recent_page_size); + return true; + } else { + recent_page_size = localStorage.getItem('recent_page_size'); + if (recent_page_size) { + document.location.href = url + '?size=' + recent_page_size; + return false; + }; + } + }); + + }); function searchForNearest() { From b8bf40fc1b8e9879184cdde2655ecee1c40f99b9 Mon Sep 17 00:00:00 2001 From: Gabor Szabo Date: Sun, 2 Nov 2014 10:04:13 +0200 Subject: [PATCH 5/9] implement page size change for /requires pages #1356 --- lib/MetaCPAN/Web/Controller/Requires.pm | 29 ++++++++++++++++++++----- lib/MetaCPAN/Web/Model/API/Module.pm | 6 ++--- lib/MetaCPAN/Web/Model/API/Release.pm | 6 ++--- root/requires.html | 2 +- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/lib/MetaCPAN/Web/Controller/Requires.pm b/lib/MetaCPAN/Web/Controller/Requires.pm index ce09b6a55e..e7be9390ff 100644 --- a/lib/MetaCPAN/Web/Controller/Requires.pm +++ b/lib/MetaCPAN/Web/Controller/Requires.pm @@ -5,6 +5,8 @@ use namespace::autoclean; BEGIN { extends 'MetaCPAN::Web::Controller' } +use MetaCPAN::Web::Types qw( PositiveInt ); + # The order of the columns matters here. It aims to be compatible # to jQuery tablesorter plugin. __PACKAGE__->config( @@ -25,15 +27,24 @@ sub index : Chained('/') : PathPart('requires') : CaptureArgs(0) { sub distribution : Chained('index') : PathPart : Args(1) : Does('Sortable') { my ( $self, $c, $distribution, $sort ) = @_; - my $cv = AE::cv(); + my $req = $c->req; + my $cv = AE::cv(); + + my $page_size = $req->param('size'); + unless ( is_PositiveInt($page_size) && $page_size <= 500 ) { + $page_size = 50; + } + my $data = $c->model('API::Release') - ->reverse_dependencies( $distribution, $c->req->page, $sort )->recv; + ->reverse_dependencies( $distribution, $c->req->page, $page_size, + $sort )->recv; $c->stash( { %{$data}, type_of_required => 'distribution', required => $distribution, + page_size => $page_size, template => 'requires.html' } ); @@ -41,15 +52,23 @@ sub distribution : Chained('index') : PathPart : Args(1) : Does('Sortable') { sub module : Chained('index') : PathPart : Args(1) : Does('Sortable') { my ( $self, $c, $module, $sort ) = @_; - my $cv = AE::cv(); + my $req = $c->req; + my $cv = AE::cv(); + + my $page_size = $req->param('size'); + unless ( is_PositiveInt($page_size) && $page_size <= 500 ) { + $page_size = 50; + } + my $data - = $c->model('API::Module')->requires( $module, $c->req->page, $sort ) - ->recv; + = $c->model('API::Module') + ->requires( $module, $c->req->page, $page_size, $sort )->recv; $c->stash( { %{$data}, type_of_required => 'module', required => $module, + page_size => $page_size, template => 'requires.html' } ); diff --git a/lib/MetaCPAN/Web/Model/API/Module.pm b/lib/MetaCPAN/Web/Model/API/Module.pm index c08d6ae16e..85baa59e35 100644 --- a/lib/MetaCPAN/Web/Model/API/Module.pm +++ b/lib/MetaCPAN/Web/Model/API/Module.pm @@ -427,7 +427,7 @@ sub _search_in_distributions { } sub requires { - my ( $self, $module, $page, $sort ) = @_; + my ( $self, $module, $page, $page_size, $sort ) = @_; $sort ||= { date => 'desc' }; my $cv = $self->cv; $self->request( @@ -449,8 +449,8 @@ sub requires { } } }, - size => 50, - from => $page * 50 - 50, + size => $page_size, + from => $page * $page_size - $page_size, sort => [$sort], } )->cb( diff --git a/lib/MetaCPAN/Web/Model/API/Release.pm b/lib/MetaCPAN/Web/Model/API/Release.pm index 79e2d4933b..5147c1eb54 100644 --- a/lib/MetaCPAN/Web/Model/API/Release.pm +++ b/lib/MetaCPAN/Web/Model/API/Release.pm @@ -242,7 +242,7 @@ sub find { # stolen from Module/requires sub reverse_dependencies { - my ( $self, $distribution, $page, $sort ) = @_; + my ( $self, $distribution, $page, $page_size, $sort ) = @_; $sort ||= { date => 'desc' }; my $cv = $self->cv; @@ -262,8 +262,8 @@ sub reverse_dependencies { } } }, - size => 50, - from => $page * 50 - 50, + size => $page_size, + from => $page * $page_size - $page_size, sort => [$sort], } )->cb( diff --git a/root/requires.html b/root/requires.html index c212bb198f..80774b002c 100644 --- a/root/requires.html +++ b/root/requires.html @@ -11,7 +11,7 @@ Distributions Which Depend on <%- required %> <% IF data.size > 0 %> <% INCLUDE inc/release-table.html releases = data, header = 1, tablesorter = 1, default_sort = '2,1', table_id = "revdep_releases" %> -<% INCLUDE inc/pager.html size = 50 %> +<% INCLUDE inc/pager.html size = page_size %> <% ELSE %>

No distributions depending on <%- required %> could be found

<% END %> From 5e836a101959de2436a903451b580e2732c53f4b Mon Sep 17 00:00:00 2001 From: Gabor Szabo Date: Sun, 2 Nov 2014 10:10:01 +0200 Subject: [PATCH 6/9] save the selected page size for /requires pages #1356 --- root/static/js/cpan.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/root/static/js/cpan.js b/root/static/js/cpan.js index 441b7fdbb9..7fff690812 100644 --- a/root/static/js/cpan.js +++ b/root/static/js/cpan.js @@ -334,6 +334,26 @@ $(document).ready(function () { } }); + $('a[href*="/requires"').on('click', function() { + var url = $(this).attr('href'); + var result = /size=(\d+)/.exec(url); + if (result && result[1]) { + var requires_page_size = result[1]; + localStorage.setItem('requires_page_size', requires_page_size); + return true; + } else { + requires_page_size = localStorage.getItem('requires_page_size'); + if (requires_page_size) { + if (/\?/.exec(url)) { + document.location.href = url + '&size=' + requires_page_size; + } else { + document.location.href = url + '?size=' + requires_page_size; + } + return false; + }; + } + }); + }); From ec8967126b8e4a9f9b077a7eadf0c53a96759580 Mon Sep 17 00:00:00 2001 From: Gabor Szabo Date: Sun, 2 Nov 2014 10:17:26 +0200 Subject: [PATCH 7/9] implement page size change for /favorie/recent page #1356 --- lib/MetaCPAN/Web/Controller/Favorite.pm | 12 +++++++++++- lib/MetaCPAN/Web/Model/API/Favorite.pm | 6 +++--- root/favorite/recent.html | 2 +- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/MetaCPAN/Web/Controller/Favorite.pm b/lib/MetaCPAN/Web/Controller/Favorite.pm index f278098fa0..c700c0d1e0 100644 --- a/lib/MetaCPAN/Web/Controller/Favorite.pm +++ b/lib/MetaCPAN/Web/Controller/Favorite.pm @@ -3,10 +3,19 @@ use strict; use warnings; use base 'MetaCPAN::Web::Controller'; +use MetaCPAN::Web::Types qw( PositiveInt ); + sub recent : Path('/favorite/recent') { my ( $self, $c ) = @_; + my $req = $c->req; + + my $page_size = $req->param('size'); + unless ( is_PositiveInt($page_size) && $page_size <= 500 ) { + $page_size = 100; + } - my $data = $c->model('API::Favorite')->recent( $c->req->page )->recv; + my $data = $c->model('API::Favorite')->recent( $c->req->page, $page_size ) + ->recv; my @faves = map { $_->{_source} } @{ $data->{hits}->{hits} }; my @user_ids = map { $_->{user} } @faves; @@ -30,6 +39,7 @@ sub recent : Path('/favorite/recent') { show_clicked_by => 1, took => $data->{took}, total => $data->{hits}->{total}, + page_size => $page_size, template => 'favorite/recent.html', } ); diff --git a/lib/MetaCPAN/Web/Model/API/Favorite.pm b/lib/MetaCPAN/Web/Model/API/Favorite.pm index b867409c6f..20991d00e7 100644 --- a/lib/MetaCPAN/Web/Model/API/Favorite.pm +++ b/lib/MetaCPAN/Web/Model/API/Favorite.pm @@ -82,12 +82,12 @@ sub by_user { } sub recent { - my ( $self, $page ) = @_; + my ( $self, $page, $page_size ) = @_; $self->request( '/favorite/_search', { - size => 100, - from => ( $page - 1 ) * 100, + size => $page_size, + from => ( $page - 1 ) * $page_size, query => { match_all => {} }, sort => [ { 'date' => { order => 'desc' } } ] } diff --git a/root/favorite/recent.html b/root/favorite/recent.html index 26ed4371af..efc827e437 100644 --- a/root/favorite/recent.html +++ b/root/favorite/recent.html @@ -21,5 +21,5 @@ favorites.push(favorite); END; %> <% INCLUDE inc/favorite-table.html favorites = favorites %> -<% INCLUDE inc/pager.html size = 100 %> +<% INCLUDE inc/pager.html size = page_size %> From fe07864eeebfc907d1e9933f678b9ab3e0cec18e Mon Sep 17 00:00:00 2001 From: Gabor Szabo Date: Sun, 9 Nov 2014 08:42:59 +0200 Subject: [PATCH 8/9] merge 3 cases of page_size setting #1356 --- root/static/js/cpan.js | 52 +++++++++++------------------------------- 1 file changed, 13 insertions(+), 39 deletions(-) diff --git a/root/static/js/cpan.js b/root/static/js/cpan.js index 7fff690812..72711b8597 100644 --- a/root/static/js/cpan.js +++ b/root/static/js/cpan.js @@ -302,61 +302,35 @@ $(document).ready(function () { } // TODO use a more specific locator for /author/PAUSID/release ? - $('a[href*="/releases"').on('click', function() { - var url = $(this).attr('href'); - var result = /size=(\d+)/.exec(url); - if (result && result[1]) { - var releases_page_size = result[1]; - localStorage.setItem('releases_page_size', releases_page_size); - return true; - } else { - releases_page_size = localStorage.getItem('releases_page_size'); - if (releases_page_size) { - document.location.href = url + '?size=' + releases_page_size; - return false; - }; - } - }); + set_page_size('a[href*="/releases"', 'releases_page_size'); + set_page_size('a[href*="/recent"', 'recent_page_size'); + set_page_size('a[href*="/requires"','requires_page_size'); - $('a[href*="/recent"').on('click', function() { - var url = $(this).attr('href'); - var result = /size=(\d+)/.exec(url); - if (result && result[1]) { - var recent_page_size = result[1]; - localStorage.setItem('recent_page_size', recent_page_size); - return true; - } else { - recent_page_size = localStorage.getItem('recent_page_size'); - if (recent_page_size) { - document.location.href = url + '?size=' + recent_page_size; - return false; - }; - } - }); +}); - $('a[href*="/requires"').on('click', function() { +function set_page_size(selector, storage_name) { + $(selector).on('click', function() { var url = $(this).attr('href'); var result = /size=(\d+)/.exec(url); if (result && result[1]) { - var requires_page_size = result[1]; - localStorage.setItem('requires_page_size', requires_page_size); + var page_size = result[1]; + localStorage.setItem(storage_name, page_size); return true; } else { - requires_page_size = localStorage.getItem('requires_page_size'); - if (requires_page_size) { + page_size = localStorage.getItem(storage_name); + if (page_size) { if (/\?/.exec(url)) { - document.location.href = url + '&size=' + requires_page_size; + document.location.href = url + '&size=' + page_size; } else { - document.location.href = url + '?size=' + requires_page_size; + document.location.href = url + '?size=' + page_size; } return false; }; } }); +} -}); - function searchForNearest() { $("#busy").css({ visibility: 'visible'}); navigator.geolocation.getCurrentPosition(function(pos) { From e588227084595f5d35dfedfc23708feed3a91ea2 Mon Sep 17 00:00:00 2001 From: Gabor Szabo Date: Sun, 9 Nov 2014 09:12:24 +0200 Subject: [PATCH 9/9] factor out the get_page_size method as @oalders suggested for #1356 --- lib/MetaCPAN/Web/Controller/Author.pm | 10 ++-------- lib/MetaCPAN/Web/Controller/Favorite.pm | 7 +------ lib/MetaCPAN/Web/Controller/Recent.pm | 7 +------ lib/MetaCPAN/Web/Controller/Requires.pm | 12 ++---------- lib/MetaCPAN/Web/Controller/Search.pm | 6 +----- lib/MetaCPAN/Web/Role/Request.pm | 13 +++++++++++++ 6 files changed, 20 insertions(+), 35 deletions(-) diff --git a/lib/MetaCPAN/Web/Controller/Author.pm b/lib/MetaCPAN/Web/Controller/Author.pm index 53dc9c00a4..956e9a77a6 100644 --- a/lib/MetaCPAN/Web/Controller/Author.pm +++ b/lib/MetaCPAN/Web/Controller/Author.pm @@ -9,8 +9,6 @@ use Locale::Country (); BEGIN { extends 'MetaCPAN::Web::Controller' } -use MetaCPAN::Web::Types qw( PositiveInt ); - # Capture the PAUSE id in the root of the chain so we handle the upper-case redirect once. # Later actions in the chain can get the pauseid out of the stash. sub root : Chained('/') PathPart('author') CaptureArgs(1) { @@ -88,12 +86,8 @@ sub releases : Chained('root') PathPart Args(0) { my ( $self, $c ) = @_; my $req = $c->req; - my $id = $c->stash->{pauseid}; - - my $page_size = $req->param('size'); - unless ( is_PositiveInt($page_size) && $page_size <= 500 ) { - $page_size = 100; - } + my $id = $c->stash->{pauseid}; + my $page_size = $req->get_page_size(100); my $page = $c->req->page > 0 ? $c->req->page : 1; my $author_cv = $c->model('API::Author')->get($id); diff --git a/lib/MetaCPAN/Web/Controller/Favorite.pm b/lib/MetaCPAN/Web/Controller/Favorite.pm index c700c0d1e0..af599a1756 100644 --- a/lib/MetaCPAN/Web/Controller/Favorite.pm +++ b/lib/MetaCPAN/Web/Controller/Favorite.pm @@ -3,16 +3,11 @@ use strict; use warnings; use base 'MetaCPAN::Web::Controller'; -use MetaCPAN::Web::Types qw( PositiveInt ); - sub recent : Path('/favorite/recent') { my ( $self, $c ) = @_; my $req = $c->req; - my $page_size = $req->param('size'); - unless ( is_PositiveInt($page_size) && $page_size <= 500 ) { - $page_size = 100; - } + my $page_size = $req->get_page_size(100); my $data = $c->model('API::Favorite')->recent( $c->req->page, $page_size ) ->recv; diff --git a/lib/MetaCPAN/Web/Controller/Recent.pm b/lib/MetaCPAN/Web/Controller/Recent.pm index c31132769d..65efc27293 100644 --- a/lib/MetaCPAN/Web/Controller/Recent.pm +++ b/lib/MetaCPAN/Web/Controller/Recent.pm @@ -3,16 +3,11 @@ use strict; use warnings; use base 'MetaCPAN::Web::Controller'; -use MetaCPAN::Web::Types qw( PositiveInt ); - sub index : Path { my ( $self, $c ) = @_; my $req = $c->req; - my $page_size = $req->param('size'); - unless ( is_PositiveInt($page_size) && $page_size <= 500 ) { - $page_size = 100; - } + my $page_size = $req->get_page_size(100); my ($data) = $c->model('API::Release') diff --git a/lib/MetaCPAN/Web/Controller/Requires.pm b/lib/MetaCPAN/Web/Controller/Requires.pm index e7be9390ff..f866730194 100644 --- a/lib/MetaCPAN/Web/Controller/Requires.pm +++ b/lib/MetaCPAN/Web/Controller/Requires.pm @@ -5,8 +5,6 @@ use namespace::autoclean; BEGIN { extends 'MetaCPAN::Web::Controller' } -use MetaCPAN::Web::Types qw( PositiveInt ); - # The order of the columns matters here. It aims to be compatible # to jQuery tablesorter plugin. __PACKAGE__->config( @@ -30,10 +28,7 @@ sub distribution : Chained('index') : PathPart : Args(1) : Does('Sortable') { my $req = $c->req; my $cv = AE::cv(); - my $page_size = $req->param('size'); - unless ( is_PositiveInt($page_size) && $page_size <= 500 ) { - $page_size = 50; - } + my $page_size = $req->get_page_size(50); my $data = $c->model('API::Release') @@ -55,10 +50,7 @@ sub module : Chained('index') : PathPart : Args(1) : Does('Sortable') { my $req = $c->req; my $cv = AE::cv(); - my $page_size = $req->param('size'); - unless ( is_PositiveInt($page_size) && $page_size <= 500 ) { - $page_size = 50; - } + my $page_size = $req->get_page_size(50); my $data = $c->model('API::Module') diff --git a/lib/MetaCPAN/Web/Controller/Search.pm b/lib/MetaCPAN/Web/Controller/Search.pm index 266b2fd688..4b2dc76e91 100644 --- a/lib/MetaCPAN/Web/Controller/Search.pm +++ b/lib/MetaCPAN/Web/Controller/Search.pm @@ -7,17 +7,13 @@ use Moose; BEGIN { extends 'MetaCPAN::Web::Controller' } -use MetaCPAN::Web::Types qw( PositiveInt ); use Plack::Response; sub index : Path { my ( $self, $c ) = @_; my $req = $c->req; - my $page_size = $req->param('size'); - unless ( is_PositiveInt($page_size) && $page_size <= 500 ) { - $page_size = 20; - } + my $page_size = $req->get_page_size(20); # Redirect back to main page if search query is empty irrespective of # whether we're feeling lucky or not. diff --git a/lib/MetaCPAN/Web/Role/Request.pm b/lib/MetaCPAN/Web/Role/Request.pm index e3c41c9eb3..f99f4ff43f 100644 --- a/lib/MetaCPAN/Web/Role/Request.pm +++ b/lib/MetaCPAN/Web/Role/Request.pm @@ -3,6 +3,8 @@ package MetaCPAN::Web::Role::Request; use Moose::Role; use Plack::Session; +use MetaCPAN::Web::Types qw( PositiveInt ); + sub page { my $page = shift->parameters->{p}; return $page && $page =~ /^\d+$/ ? $page : 1; @@ -13,4 +15,15 @@ sub session { return Plack::Session->new( $self->env ); } +sub get_page_size { + my $req = shift; + my $default_page_size = shift; + + my $page_size = $req->param('size'); + unless ( is_PositiveInt($page_size) && $page_size <= 500 ) { + $page_size = $default_page_size; + } + return $page_size; +} + 1;