File Coverage

blib/lib/JPList/Request.pm
Criterion Covered Total %
statement 62 81 76.5
branch 22 40 55.0
condition 0 12 0.0
subroutine 9 9 100.0
pod 1 1 100.0
total 94 143 65.7


line stmt bran cond sub pod time code
1             # ========================================================================== #
2             # lib/JPList/Request.pm - JPList Request parser module
3             # Copyright (C) 2017 Exceleron Software, LLC
4             # ========================================================================== #
5              
6             package JPList::Request;
7              
8 2     2   15 use Moose;
  2         5  
  2         18  
9 2     2   19650 use URI::Escape;
  2         3850  
  2         161  
10 2     2   1079 use JSON;
  2         18982  
  2         17  
11              
12             with 'JPList::Controls::Filter';
13             with 'JPList::Controls::Sort';
14              
15             # ========================================================================== #
16              
17             =head1 NAME
18              
19             JPList::Request - JPList Request parser module
20              
21             =head1 VERSION
22              
23             Version 0.05
24              
25             =cut
26              
27             our $VERSION = '0.05';
28              
29             =head1 SYNOPSIS
30              
31             use JPList::Request;
32             my $jplist_req = JPList::Request->new(request_params => $self->request_params);
33              
34             =head1 DESCRIPTION
35              
36             The JPList::Request module allows you to decode the request params with all the controls
37              
38             =head2 ATTRIBUTES
39              
40             =over 4
41              
42             =cut
43              
44             # ========================================================================== #
45              
46             has 'request_params' => (
47             is => 'rw',
48             isa => 'Str'
49             );
50              
51             has 'request_data' => (
52             is => 'rw',
53             builder => '_decode_request_params',
54             lazy => 1,
55             clearer => 'clear_request_data'
56             );
57              
58             has 'filter_attrs' => (
59             is => 'rw',
60             isa => 'HashRef'
61             );
62              
63             has 'filter_data' => (
64             is => 'rw',
65             isa => 'ArrayRef'
66             );
67              
68             has 'sort_data' => (
69             is => 'rw',
70             isa => 'ArrayRef'
71             );
72              
73             has 'pagination_data' => (
74             is => 'rw',
75             isa => 'HashRef'
76             );
77              
78             has 'is_download' => (
79             is => 'rw',
80             default => 0
81             );
82              
83             # ========================================================================== #
84              
85             =back
86              
87             =head2 METHODS
88              
89             =over 4
90              
91             =cut
92              
93             # ========================================================================== #
94              
95             =item C<decode_data>
96              
97             Params : $statuses_request
98              
99             Returns: NONE
100              
101             Desc : decode the request params
102              
103             =cut
104              
105             sub decode_data
106             {
107 8     8 1 46650 my ($self) = @_;
108              
109 8 50       323 if (ref($self->request_data) eq 'ARRAY') {
110              
111 8         745 $self->_store_status_list($self->request_data);
112              
113             }
114             else {
115              
116 0         0 return undef;
117             }
118             }
119              
120             # ========================================================================== #
121              
122             =item C<_decode_request_params>
123              
124             Params : $self->request_params
125              
126             Returns: Data structure of formatted request data structure
127              
128             Desc : decode params
129              
130             =cut
131              
132             sub _decode_request_params
133             {
134              
135 8     8   27 my $self = shift;
136              
137 8         324 return decode_json(uri_unescape($self->request_params));
138             }
139              
140             # ========================================================================== #
141              
142             =item C<_store_status_list>
143              
144             Params : Request Data
145              
146             Returns: NONE
147              
148             Desc : parses the list of unique actions and computes filter, sort and pagination data
149              
150             =cut
151              
152             sub _store_status_list
153             {
154 8     8   38 my ($self, $statuses_request) = @_;
155              
156 8         31 foreach my $status_req (@$statuses_request) {
157 71         182 my $action = $status_req->{'action'};
158 71         140 push(@{$self->{'status_list'}->{$action}}, $status_req);
  71         661  
159             }
160              
161 8         42 $self->_get_filter_data();
162              
163 8         55 $self->_get_sort_data();
164              
165 8         44 $self->_get_pagination_data();
166              
167             ## Clear unwanted attributes
168 8         838 $self->clear_request_data();
169 8         118 delete($self->{'status_list'});
170             }
171              
172             # ========================================================================== #
173              
174             =item C<_get_filter_data>
175              
176             Params : NONE
177              
178             Returns: NONE
179              
180             Desc : private function to parse filter data
181              
182             =cut
183              
184             sub _get_filter_data
185             {
186 8     8   29 my ($self) = @_;
187              
188 8         26 my @filter_data;
189              
190             # This is used to store the values of filter by column name
191             # Eg: $jplist->jplist_request->filter_attrs->{'ServiceType'}
192             my %filter_attrs;
193              
194 8         19 foreach my $filter_vals (@{$self->{'status_list'}->{'filter'}}) {
  8         38  
195 40 100 0     321 if ($filter_vals->{'type'} eq 'textbox') {
    100          
    50          
    50          
    50          
    50          
    0          
196 19         95 my $filter_result = $self->textbox($filter_vals);
197 19 100       79 if (defined $filter_result) {
198 1         3 push(@filter_data, $filter_result);
199 1         6 $filter_attrs{$filter_result->{'column'}} = $filter_result->{'value'};
200             }
201             }
202             elsif ($filter_vals->{'type'} eq 'filter-drop-down') {
203 7         40 my $filter_result = $self->filterdropdown($filter_vals);
204 7 100       29 if (defined $filter_result) {
205 2         7 push(@filter_data, $filter_result);
206 2         10 $filter_attrs{$filter_result->{'column'}} = $filter_result->{'value'};
207             }
208             }
209             elsif ($filter_vals->{'type'} eq 'filter-select') {
210 0         0 my $filter_result = $self->filterselect($filter_vals);
211 0 0       0 if (defined $filter_result) {
212 0         0 push(@filter_data, $filter_result);
213 0         0 $filter_attrs{$filter_result->{'column'}} = $filter_result->{'value'};
214             }
215             }
216             elsif ($filter_vals->{'type'} eq 'date-picker-range-filter') {
217 0         0 my $filter_result = $self->filterdaterange($filter_vals);
218 0 0       0 if (defined $filter_result) {
219 0         0 push(@filter_data, $filter_result);
220 0         0 $filter_attrs{$filter_result->{'column'}} = $filter_result;
221             }
222             }
223             elsif ($filter_vals->{'type'} eq 'date-picker-filter') {
224 0         0 my $filter_result = $self->filterdatepicker($filter_vals);
225 0 0       0 if (defined $filter_result) {
226 0         0 push(@filter_data, $filter_result);
227 0         0 $filter_attrs{$filter_result->{'column'}} = $filter_result->{'value'};
228             }
229             }
230             elsif ($filter_vals->{'type'} eq 'checkbox-group-filter') {
231 14         66 my $filter_result = $self->checkboxgroup($filter_vals);
232 14 50       93 if (defined $filter_result) {
233 0         0 push(@filter_data, $filter_result);
234 0         0 $filter_attrs{$filter_result->{'column'}} = $filter_result->{'values'};
235             }
236             }
237             elsif ($filter_vals->{'type'} eq 'button-filter' and $filter_vals->{'name'} eq 'download') {
238 0         0 print STDERR "[jplist info] download request filter called\n";
239 0         0 my $data = $filter_vals->{'data'};
240 0 0 0     0 if ( exists($data->{'filterType'})
      0        
      0        
241             and ($data->{'filterType'} eq 'path')
242             and exists($data->{'path'})
243             and ($data->{'path'} eq '.download'))
244             {
245 0         0 $self->is_download(1);
246             }
247             }
248             }
249              
250 8         445 $self->filter_data(\@filter_data);
251 8         354 $self->filter_attrs(\%filter_attrs);
252             }
253              
254             # ========================================================================== #
255              
256             =item C<_get_sort_data>
257              
258             Params : NONE
259              
260             Returns: NONE
261              
262             Desc : private functiont to parse sort data
263              
264             =cut
265              
266             sub _get_sort_data
267             {
268 8     8   31 my ($self) = @_;
269              
270 8         20 my @sort_data;
271              
272 8         22 foreach my $sort_vals (@{$self->{'status_list'}->{'sort'}}) {
  8         42  
273 8 100       39 if ($sort_vals->{'type'} eq 'sort-drop-down') {
    50          
274 7         46 my $sort_result = $self->sortdropdown($sort_vals);
275 7         33 push(@sort_data, $sort_result);
276             }
277             elsif ($sort_vals->{'type'} eq 'sort-select') {
278 1         75 my $sort_result = $self->sortselect($sort_vals);
279 1         6 push(@sort_data, $sort_result);
280             }
281             }
282              
283 8         340 $self->sort_data(\@sort_data);
284             }
285              
286             # ========================================================================== #
287              
288             =item C<_get_pagination_data>
289              
290             Params : NONE
291              
292             Returns: NONE
293              
294             Desc : private functiont to parse pagination data
295              
296             =cut
297              
298             sub _get_pagination_data
299             {
300 8     8   26 my ($self) = @_;
301              
302 8         17 my $pagination_data;
303              
304 8         19 foreach my $paging_vals (@{$self->{'status_list'}->{'paging'}}) {
  8         37  
305 16         40 my $data = $paging_vals->{'data'};
306              
307 16 50       48 if ($data) {
308 16 100       116 if ($data->{'currentPage'}) {
309 2         7 $pagination_data->{'currentPage'} = $data->{'currentPage'};
310             }
311              
312 16 100       55 if ($data->{'number'}) {
313 8         36 $pagination_data->{'number'} = $data->{'number'};
314             }
315             }
316             }
317              
318 8         349 $self->pagination_data($pagination_data);
319             }
320              
321             1;
322              
323             __END__
324              
325             =back
326            
327             =head1 AUTHORS
328              
329             Sheeju Alex, <sheeju@exceleron.com>
330              
331             =head1 BUGS
332              
333             https://github.com/sheeju/JPList/issues
334              
335             =head1 SUPPORT
336              
337             You can find documentation for this module with the perldoc command.
338              
339             perldoc JPList
340              
341              
342             You can also look for information at:
343              
344             =over 4
345              
346             =item * RT: CPAN's request tracker (report bugs here)
347              
348             L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=JPList>
349              
350             =item * AnnoCPAN: Annotated CPAN documentation
351              
352             L<http://annocpan.org/dist/JPList>
353              
354             =item * CPAN Ratings
355              
356             L<http://cpanratings.perl.org/d/JPList>
357              
358             =item * Search CPAN
359              
360             L<http://search.cpan.org/dist/JPList/>
361              
362             =back
363              
364             =head1 ACKNOWLEDGEMENTS
365              
366             Development time supported by Exceleron L<www.exceleron.com|http://www.exceleron.com>.
367              
368             =head1 LICENSE AND COPYRIGHT
369              
370             Copyright (C) 2017 Exceleron Software, LLC
371              
372             This program is free software; you can redistribute it and/or modify it
373             under the terms of the the Artistic License (2.0). You may obtain a
374             copy of the full license at:
375              
376             L<http://www.perlfoundation.org/artistic_license_2_0>
377              
378             Any use, modification, and distribution of the Standard or Modified
379             Versions is governed by this Artistic License. By using, modifying or
380             distributing the Package, you accept this license. Do not use, modify,
381             or distribute the Package, if you do not accept this license.
382              
383             If your Modified Version has been derived from a Modified Version made
384             by someone other than you, you are nevertheless required to ensure that
385             your Modified Version complies with the requirements of this license.
386              
387             This license does not grant you the right to use any trademark, service
388             mark, tradename, or logo of the Copyright Holder.
389              
390             This license includes the non-exclusive, worldwide, free-of-charge
391             patent license to make, have made, use, offer to sell, sell, import and
392             otherwise transfer the Package with respect to any patent claims
393             licensable by the Copyright Holder that are necessarily infringed by the
394             Package. If you institute patent litigation (including a cross-claim or
395             counterclaim) against any party alleging that the Package constitutes
396             direct or contributory patent infringement, then this Artistic License
397             to you shall terminate on the date that such litigation is filed.
398              
399             Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER
400             AND CONTRIBUTORS "AS IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
401             THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
402             PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY
403             YOUR LOCAL LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR
404             CONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR
405             CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE,
406             EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
407              
408             =cut
409              
410             # vim: ts=4
411             # vim600: fdm=marker fdl=0 fdc=3