UNPKG

promise-mock-api

Version:

Mock APIs using classes based in "Fetch API" and "Axios JS". Using "Local Storage" the data are saved, the "ApiBase" provides a GET, POST, PUT and DELETE default methods and easily add your own methods.

149 lines (115 loc) 5.34 kB
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } import CrudBase from './crud-base'; var ApiBase = function ApiBase(baseUrl) { var _this = this; var timeToResponse = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1500; _classCallCheck(this, ApiBase); this.get = function (resourceUrl, queryString, forcedResult) { var finalUrl = resourceUrl.endsWith('/') ? resourceUrl.substring(0, resourceUrl.length - 1) : resourceUrl; var getAction = _this._gets.find(function (x) { return x.url === finalUrl; }).action; if (!getAction) return Promise.reject(new Response(null, { "status": 404 })); var resultAction = getAction(queryString, forcedResult); return _this._defaultAction(resultAction); }; this.post = function (resourceUrl, bodyObj, forcedResult) { var finalUrl = resourceUrl.endsWith('/') ? resourceUrl.substring(0, resourceUrl.length - 1) : resourceUrl; var postAction = _this._posts.find(function (x) { return x.url === finalUrl; }).action; if (!postAction) return Promise.reject(new Response(null, { "status": 404 })); var resultAction = postAction(bodyObj, forcedResult); return _this._defaultAction(resultAction); }; this.put = function (resourceUrl, id, bodyObj, forcedResult) { var finalUrl = resourceUrl.endsWith('/') ? resourceUrl.substring(0, resourceUrl.length - 1) : resourceUrl; var putAction = _this._puts.find(function (x) { return x.url === finalUrl; }).action; if (!putAction) return Promise.reject(new Response(null, { "status": 404 })); var resultAction = putAction(id, bodyObj, forcedResult); return _this._defaultAction(resultAction); }; this['delete'] = function (resourceUrl, id, forcedResult) { var finalUrl = resourceUrl.endsWith('/') ? resourceUrl.substring(0, resourceUrl.length - 1) : resourceUrl; var deleteAction = _this._deletes.find(function (x) { return x.url === finalUrl; }).action; if (!deleteAction) return Promise.reject(new Response(null, { "status": 404 })); var resultAction = deleteAction(id, forcedResult); return _this._defaultAction(resultAction); }; this.addEndpoint = function () { for (var _len = arguments.length, endpoints = Array(_len), _key = 0; _key < _len; _key++) { endpoints[_key] = arguments[_key]; } var addAction = function (actions, newAction) { var url = newAction.url.endsWith('/') ? newAction.url.substring(0, newAction.url.length - 1) : newAction.url; var urlIndex = actions.findIndex(function (y) { return y.url === newAction.url; }); urlIndex >= 0 ? actions.splice(urlIndex, 1, { action: newAction.action, url: url }) : actions.push({ action: newAction.action, url: url }); }; endpoints.forEach(function (x) { switch (x.method.toUpperCase()) { case 'GET': addAction(_this._gets, x); break; case 'POST': addAction(_this._posts, x); break; case 'PUT': addAction(_this._puts, x); break; case 'DELETE': addAction(_this._deletes, x); } }); }; this._defaultGet = function (filter, forcedResult) { if (forcedResult) return { statusCode: forcedResult.statusCode, payload: forcedResult.body }; var data = _this._crud.get(filter); return { statusCode: 200, payload: data }; }; this._defaultPost = function (obj, forcedResult) { if (forcedResult) return { statusCode: forcedResult.statusCode, payload: forcedResult.body }; _this._crud.add(obj); _this._crud.commit(); return { statusCode: 200 }; }; this._defaultPut = function (id, obj, forcedResult) { if (forcedResult) return { statusCode: forcedResult.statusCode, payload: forcedResult.body }; var ok = _this._crud.update(id, obj); if (!ok) return { statusCode: 400 }; _this._crud.commit(); return { statusCode: 200 }; }; this._defaultDelete = function (id, forcedResult) { if (forcedResult) return { statusCode: forcedResult.statusCode, payload: forcedResult.body }; var ok = _this._crud.remove(id); if (!ok) return { statusCode: 400, payload: null }; _this._crud.commit(); return { statusCode: 200, payload: null }; }; this._defaultAction = function (result) { return new Promise(function (resolve) { return setTimeout(function () { return resolve(_this._createResponse(result.payload, result.statusCode)); }, _this._timeToResponse); }); }; this._createResponse = function (obj, statusCode) { if (!obj) return new Response(null, { "status": statusCode }); var blobJson = new Blob([JSON.stringify(obj)], { type: 'application/json' }); return new Response(blobJson, { "status": statusCode }); }; this.baseUrl = baseUrl; this._crud = new CrudBase(baseUrl); this._timeToResponse = timeToResponse; this._gets = [{ url: '', method: 'get', action: this._defaultGet }]; this._posts = [{ url: '', method: 'post', action: this._defaultPost }]; this._puts = [{ url: '', method: 'put', action: this._defaultPut }]; this._deletes = [{ url: '', method: 'delete', action: this._defaultDelete }]; }; export default ApiBase;