drf-paginator
Version:
Module for consuming paginated Django REST framework endpoints.
193 lines (155 loc) • 5.67 kB
JavaScript
'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;