View | Details | Raw Unified | Return to bug 19196
Collapse All | Expand All

(-)a/Koha/REST/Plugin/Pagination.pm (-6 / +6 lines)
Lines 42-49 sub register { Link Here
42
    $c->add_pagination_headers({
42
    $c->add_pagination_headers({
43
        total  => $patrons->count,
43
        total  => $patrons->count,
44
        params => {
44
        params => {
45
            page     => ...
45
            _page     => ...
46
            per_page => ...
46
            _per_page => ...
47
            ...
47
            ...
48
        }
48
        }
49
    });
49
    });
Lines 59-66 It also adds X-Total-Count, containing the total results count. Link Here
59
            my ( $c, $args ) = @_;
59
            my ( $c, $args ) = @_;
60
60
61
            my $total    = $args->{total};
61
            my $total    = $args->{total};
62
            my $req_page = $args->{params}->{page};
62
            my $req_page = $args->{params}->{_page};
63
            my $per_page = $args->{params}->{per_page};
63
            my $per_page = $args->{params}->{_per_page};
64
64
65
            my $pages = int $total / $per_page;
65
            my $pages = int $total / $per_page;
66
            $pages++
66
            $pages++
Lines 124-131 sub _build_link { Link Here
124
124
125
    my $params = $args->{params};
125
    my $params = $args->{params};
126
126
127
    $params->{page}     = $args->{page};
127
    $params->{_page}     = $args->{page};
128
    $params->{per_page} = $args->{per_page};
128
    $params->{_per_page} = $args->{per_page};
129
129
130
    my $link = '<'
130
    my $link = '<'
131
        . $c->req->url->clone->query(
131
        . $c->req->url->clone->query(
(-)a/t/Koha/REST/Plugin/Pagination.t (-24 / +23 lines)
Lines 32-50 get '/empty' => sub { Link Here
32
32
33
get '/pagination_headers' => sub {
33
get '/pagination_headers' => sub {
34
    my $c = shift;
34
    my $c = shift;
35
    $c->add_pagination_headers({ total => 10, params => { page => 2, per_page => 3, firstname => 'Jonathan' } });
35
    $c->add_pagination_headers({ total => 10, params => { _page => 2, _per_page => 3, firstname => 'Jonathan' } });
36
    $c->render( json => { ok => 1 }, status => 200 );
36
    $c->render( json => { ok => 1 }, status => 200 );
37
};
37
};
38
38
39
get '/pagination_headers_first_page' => sub {
39
get '/pagination_headers_first_page' => sub {
40
    my $c = shift;
40
    my $c = shift;
41
    $c->add_pagination_headers({ total => 10, params => { page => 1, per_page => 3, firstname => 'Jonathan' } });
41
    $c->add_pagination_headers({ total => 10, params => { _page => 1, _per_page => 3, firstname => 'Jonathan' } });
42
    $c->render( json => { ok => 1 }, status => 200 );
42
    $c->render( json => { ok => 1 }, status => 200 );
43
};
43
};
44
44
45
get '/pagination_headers_last_page' => sub {
45
get '/pagination_headers_last_page' => sub {
46
    my $c = shift;
46
    my $c = shift;
47
    $c->add_pagination_headers({ total => 10, params => { page => 4, per_page => 3, firstname => 'Jonathan' } });
47
    $c->add_pagination_headers({ total => 10, params => { _page => 4, _per_page => 3, firstname => 'Jonathan' } });
48
    $c->render( json => { ok => 1 }, status => 200 );
48
    $c->render( json => { ok => 1 }, status => 200 );
49
};
49
};
50
50
Lines 67-110 subtest 'add_pagination_headers() tests' => sub { Link Here
67
    $t->get_ok('/pagination_headers')
67
    $t->get_ok('/pagination_headers')
68
      ->status_is( 200 )
68
      ->status_is( 200 )
69
      ->header_is( 'X-Total-Count' => 10, 'X-Total-Count contains the passed value' )
69
      ->header_is( 'X-Total-Count' => 10, 'X-Total-Count contains the passed value' )
70
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*per_page=3.*>; rel="prev",/ )
70
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*_per_page=3.*>; rel="prev",/ )
71
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*page=1.*>; rel="prev",/ )
71
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*_page=1.*>; rel="prev",/ )
72
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*firstname=Jonathan.*>; rel="prev",/ )
72
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*firstname=Jonathan.*>; rel="prev",/ )
73
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*per_page=3.*>; rel="next",/ )
73
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*_per_page=3.*>; rel="next",/ )
74
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*page=3.*>; rel="next",/ )
74
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*_page=3.*>; rel="next",/ )
75
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*firstname=Jonathan.*>; rel="next",/ )
75
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*firstname=Jonathan.*>; rel="next",/ )
76
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*per_page=3.*>; rel="first",/ )
76
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*_per_page=3.*>; rel="first",/ )
77
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*page=1.*>; rel="first",/ )
77
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*_page=1.*>; rel="first",/ )
78
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*firstname=Jonathan.*>; rel="first",/ )
78
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*firstname=Jonathan.*>; rel="first",/ )
79
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*per_page=3.*>; rel="last"/ )
79
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*_per_page=3.*>; rel="last"/ )
80
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*page=4.*>; rel="last"/ )
80
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*_page=4.*>; rel="last"/ )
81
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*firstname=Jonathan.*>; rel="last"/ );
81
      ->header_like( 'Link' => qr/<http:\/\/.*\?.*firstname=Jonathan.*>; rel="last"/ );
82
82
83
    $t->get_ok('/pagination_headers_first_page')
83
    $t->get_ok('/pagination_headers_first_page')
84
      ->status_is( 200 )
84
      ->status_is( 200 )
85
      ->header_is( 'X-Total-Count' => 10, 'X-Total-Count contains the passed value' )
85
      ->header_is( 'X-Total-Count' => 10, 'X-Total-Count contains the passed value' )
86
      ->header_unlike( 'Link' => qr/<http:\/\/.*\?.*>; rel="prev",/ )
86
      ->header_unlike( 'Link' => qr/<http:\/\/.*\?.*>; rel="prev",/ )
87
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*per_page=3.*>; rel="next",/ )
87
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*_per_page=3.*>; rel="next",/ )
88
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*page=2.*>; rel="next",/ )
88
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*_page=2.*>; rel="next",/ )
89
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*firstname=Jonathan.*>; rel="next",/ )
89
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*firstname=Jonathan.*>; rel="next",/ )
90
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*per_page=3.*>; rel="first",/ )
90
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*_per_page=3.*>; rel="first",/ )
91
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*page=1.*>; rel="first",/ )
91
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*_page=1.*>; rel="first",/ )
92
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*firstname=Jonathan.*>; rel="first",/ )
92
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*firstname=Jonathan.*>; rel="first",/ )
93
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*per_page=3.*>; rel="last"/ )
93
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*_per_page=3.*>; rel="last"/ )
94
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*page=4.*>; rel="last"/ )
94
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*_page=4.*>; rel="last"/ )
95
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*firstname=Jonathan.*>; rel="last"/ );
95
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*firstname=Jonathan.*>; rel="last"/ );
96
96
97
    $t->get_ok('/pagination_headers_last_page')
97
    $t->get_ok('/pagination_headers_last_page')
98
      ->status_is( 200 )
98
      ->status_is( 200 )
99
      ->header_is( 'X-Total-Count' => 10, 'X-Total-Count contains the passed value' )
99
      ->header_is( 'X-Total-Count' => 10, 'X-Total-Count contains the passed value' )
100
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*per_page=3.*>; rel="prev",/ )
100
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*_per_page=3.*>; rel="prev",/ )
101
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*page=3.*>; rel="prev",/ )
101
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*_page=3.*>; rel="prev",/ )
102
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*firstname=Jonathan.*>; rel="prev",/ )
102
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*firstname=Jonathan.*>; rel="prev",/ )
103
      ->header_unlike( 'Link' => qr/<http:\/\/.*\?.*>; rel="next",/ )
103
      ->header_unlike( 'Link' => qr/<http:\/\/.*\?.*>; rel="next",/ )
104
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*per_page=3.*>; rel="first",/ )
104
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*_per_page=3.*>; rel="first",/ )
105
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*page=1.*>; rel="first",/ )
105
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*_page=1.*>; rel="first",/ )
106
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*firstname=Jonathan.*>; rel="first",/ )
106
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*firstname=Jonathan.*>; rel="first",/ )
107
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*per_page=3.*>; rel="last"/ )
107
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*_per_page=3.*>; rel="last"/ )
108
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*page=4.*>; rel="last"/ )
108
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*_page=4.*>; rel="last"/ )
109
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*firstname=Jonathan.*>; rel="last"/ );
109
      ->header_like(   'Link' => qr/<http:\/\/.*\?.*firstname=Jonathan.*>; rel="last"/ );
110
};
110
};
111
- 

Return to bug 19196