# HG changeset patch # User ymh # Date 1475798854 -7200 # Node ID 92fc9d077f9538cb56281857b8e4f1c24d135d04 # Parent 47f0611cc57d37177a666d7da09c1b319a06e1ef add pagination info for document list, move it to meta sub object diff -r 47f0611cc57d -r 92fc9d077f95 cms/app-client/mirage/serializers/sparse-document.js --- a/cms/app-client/mirage/serializers/sparse-document.js Thu Oct 06 16:45:37 2016 +0200 +++ b/cms/app-client/mirage/serializers/sparse-document.js Fri Oct 07 02:07:34 2016 +0200 @@ -1,17 +1,20 @@ // mirage/serializers/blog-post.js import BaseSerializer from './application'; import _ from 'lodash'; +import utils from './utils'; export default BaseSerializer.extend({ attrs: ['id', 'title', 'language', 'url', 'issued', 'modified', 'publishers', 'mediaArray', 'transcript'], serialize(response, request) { - console.log(request, response); // This is how to call super, as Mirage borrows [Backbone's implementation of extend](http://backbonejs.org/#Model-extend) let json = BaseSerializer.prototype.serialize.apply(this, arguments); - json['documents'] = _.map(json['documents'], function(doc) { + let page = Math.max(parseInt(request.queryParams.page || 1) - 1, 0); + let perPage = parseInt(request.queryParams.perpage || 15); + + json['documents'] = _.map(_.slice(json['documents'], page*perPage, (page+1)*perPage), function(doc) { let res = _.omit(doc, ['publishers', 'mediaArray', 'transcript']); res['publisher'] = doc['publishers'].join(', '); res['duration_ms'] = doc['mediaArray']?doc['mediaArray'][_(Object.keys(doc['mediaArray'])).first()]['extent_ms']:0; @@ -19,7 +22,43 @@ return res; }); + let meta = { + total: response.models.length, + per_page: perPage, + current_page: page+1, + last_page: Math.floor(response.models.length/perPage)+1, + from: page*perPage + 1, + to: Math.min((page+1)*perPage, response.models.length), + prev_page_url: null, + next_page_url: null + }; + + let urlParts = utils.parseUri(request.url); + + if(page>0) { + let prevUrlParts = _.clone(urlParts); + prevUrlParts.queryKey.page = page; + meta.prev_page_url = utils.mergeUri(prevUrlParts); + } + + if(page<(meta.last_page-1)) { + let nextUrlParts = _.clone(urlParts); + nextUrlParts.queryKey.page = page+2; + meta.next_page_url = utils.mergeUri(nextUrlParts); + } + + json['meta'] = meta; + return json; } }); + +// total 3373 +// per_page 15 +// current_page 1 +// last_page 225 +// next_page_url "http://localhost:8000/api/v1/documents?page=2" +// prev_page_url +// from 1 +// to 15 diff -r 47f0611cc57d -r 92fc9d077f95 cms/app-client/mirage/serializers/utils.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cms/app-client/mirage/serializers/utils.js Fri Oct 07 02:07:34 2016 +0200 @@ -0,0 +1,58 @@ +// taken from http://blog.stevenlevithan.com/archives/parseuri +// parseUri 1.2.2 +// (c) Steven Levithan +// MIT License +import _ from 'lodash'; + +const PARSEURI_DEFAULT_OPTIONS = { + strictMode: false, + key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], + q: { + name: "queryKey", + parser: /(?:^|&)([^&=]*)=?([^&]*)/g + }, + parser: { + strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, + loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ + } +}; + +export default { + parseUri : function (str, options) { + var o = _.defaultsDeep(options || {}, PARSEURI_DEFAULT_OPTIONS); + var m = o.parser[o.strictMode ? "strict" : "loose"].exec(str), + uri = {}, + i = 14; + + while (i--) { uri[o.key[i]] = m[i] || ""; } + + uri[o.q.name] = {}; + uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) { + if ($1) { uri[o.q.name][$1] = $2; } + }); + + return uri; + }, + mergeUri : function(uriParts) { + let res = ""; + if(uriParts.protocol) { + res += uriParts.protocol+":"; + } + if(uriParts.host) { + res += "//" + uriParts.host; + } + if(uriParts.port) { + res += ":" + uriParts.port; + } + if(uriParts.path) { + res += uriParts.path; + } + if(uriParts.queryKey) { + res += "?" + _.map(uriParts.queryKey, function(v,k) { + return k + "=" + v; + }).join("&"); + } + + return res; + } +}; diff -r 47f0611cc57d -r 92fc9d077f95 server/src/app/Http/Controllers/Api/DocumentController.php --- a/server/src/app/Http/Controllers/Api/DocumentController.php Thu Oct 06 16:45:37 2016 +0200 +++ b/server/src/app/Http/Controllers/Api/DocumentController.php Fri Oct 07 02:07:34 2016 +0200 @@ -25,17 +25,18 @@ * * @return Response */ - public function index() + public function index(Request $request) { - $paginator = $this->documentRepository->paginateAll(); + $perPage = intval($request->input('perpage', config('corpusparole.documents_per_page'))); + $paginator = $this->documentRepository->paginateAll($perPage); $res = $paginator->toArray(); if(array_key_exists('data', $res)) { $documents = $res['data']; unset($res['data']); - $res['documents'] = $documents; - //$res['documents'] = $this->documentRepository->resolveLexvo($documents); + } else { + $documents = []; } - return response()->json($res); + return response()->json([ 'documents' => $documents, 'meta' => $res]); } /** diff -r 47f0611cc57d -r 92fc9d077f95 server/src/config/corpusparole.php --- a/server/src/config/corpusparole.php Thu Oct 06 16:45:37 2016 +0200 +++ b/server/src/config/corpusparole.php Fri Oct 07 02:07:34 2016 +0200 @@ -5,6 +5,8 @@ $baseUrl = ($baseUrl && strlen($baseUrl)>0)?$baseUrl:"/"; return [ + 'documents_per_page' => 15, + 'sesame_base_url' => $sesameBaseUrl, 'sesame_repository' => env('CORPUSPAROLE_SESAME_REPOSITORY'), 'sesame_repository_raw' => env('CORPUSPAROLE_SESAME_REPOSITORY_RAW'),