UNPKG

drf-paginator

Version:

Module for consuming paginated Django REST framework endpoints.

193 lines (155 loc) 5.67 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.BasePaginator = exports.errors = undefined; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); var _actions = require('../actions'); var actions = _interopRequireWildcard(_actions); var _paginatorError = require('../paginator-error'); var _paginatorError2 = _interopRequireDefault(_paginatorError); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var errors = exports.errors = Object.freeze({ queryHandlerMissing: 'A query handler must be set to generate parameters' }); var BasePaginator = exports.BasePaginator = function () { function BasePaginator(request) { var requestOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; _classCallCheck(this, BasePaginator); this._cache = Object.create(null); this._page = 0; this._request = request; this._requestOptions = _lodash2.default.cloneDeep(requestOptions); this.queryHandler = null; } _createClass(BasePaginator, [{ key: 'current', value: function current() { return this.fetchPage(this._page); } }, { key: 'next', value: function next() { return this.fetchPage(++this._page); } }, { key: 'prev', value: function prev() { return this.fetchPage(--this._page); } }, { key: 'first', value: function first() { return this.fetchPage(this._page = 1); } }, { key: 'last', value: function last() { var _this = this; var fetchLastPage = function fetchLastPage(pageCount) { return _this.fetchPage(_this._page = pageCount); }; return this.fetchPageCount().then(fetchLastPage); } }, { key: 'fetchPage', value: function fetchPage(page) { var _this2 = this; if (this._hasRequest(page)) { return this._getRequest(page).then(_lodash2.default.cloneDeep); } if (!this._isValidPage(page)) { return this._rejectPage(page); } var handleResponse = function handleResponse(response) { return _this2._handleResponse(response, page); }; var request = this._sendRequest(page).then(handleResponse); this._cacheRequest(page, request); return request.then(_lodash2.default.cloneDeep); } }, { key: 'fetchPageCount', value: function fetchPageCount() { var _this3 = this; if (this._pageCount) { return Promise.resolve(this._pageCount); } var setPageCount = function setPageCount(pageCount) { _this3._pageCount = pageCount; return pageCount; }; return this.fetchPage(1).then(actions.inferPageCount).then(setPageCount); } }, { key: 'setQueryHandler', value: function setQueryHandler(queryHandler) { this.queryHandler = queryHandler; return this; } }, { key: 'setQueryParams', value: function setQueryParams(queryParams) { this.queryHandler.setParams(queryParams); this._page = this.queryHandler.resolvePage(queryParams); return this; } }, { key: '_isValidPage', value: function _isValidPage(page) { return page >= 1 && (this._pageCount ? page <= this._pageCount : true); } }, { key: '_rejectPage', value: function _rejectPage(page) { var message = 'Invalid page "' + page + '".'; var error = new Error(message); error.response = { detail: message }; return Promise.reject(error); } }, { key: '_sendRequest', value: function _sendRequest(page) { if (!this.queryHandler) { throw new _paginatorError2.default(errors.queryHandlerMissing); } var requestOptions = _lodash2.default.cloneDeep(this._requestOptions); var queryParams = this.queryHandler.makeParams(page); return this._request(requestOptions, queryParams); } }, { key: '_cacheRequest', value: function _cacheRequest(page, response) { this._cache[page] = response; } }, { key: '_getRequest', value: function _getRequest(page) { return this._cache[page]; } }, { key: '_hasRequest', value: function _hasRequest(page) { return !!this._cache[page]; } }, { key: '_handleResponse', value: function _handleResponse(response, page) { if (this.queryHandler.onResponse) { this.queryHandler.onResponse(response, page); } return response; } }, { key: 'page', get: function get() { return this._page; } }]); return BasePaginator; }(); exports.default = BasePaginator;