add pagination info for document list, move it to meta sub object
authorymh <ymh.work@gmail.com>
Fri, 07 Oct 2016 02:07:34 +0200
changeset 324 92fc9d077f95
parent 323 47f0611cc57d
child 325 31a4987f6017
add pagination info for document list, move it to meta sub object
cms/app-client/mirage/serializers/sparse-document.js
cms/app-client/mirage/serializers/utils.js
server/src/app/Http/Controllers/Api/DocumentController.php
server/src/config/corpusparole.php
--- 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
--- /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 <stevenlevithan.com>
+// 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;
+  }
+};
--- 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]);
     }
 
     /**
--- 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'),