UNPKG

hal-ts

Version:

Package to format api responses into hal format

128 lines 3.81 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getChunks = exports.chunkArray = exports.validateCollectionData = exports.generateHalCollectionResponse = exports.obtainCollectionLinks = exports.prepareCollectionLinks = void 0; const error_1 = require("../types/error"); const prepareCollectionLinks = (url, page, chunksQuantity, queryParams) => { if (queryParams === undefined) { queryParams = ""; } else { queryParams = `&${queryParams}`; } const selfUrl = `${url}?page=${page}${queryParams}`; const links = { selfUrl: selfUrl, firstUrl: page === 1 ? selfUrl : `${url}${queryParams ? "?" + queryParams.substring(1) : ""}`, lastUrl: `${url}?page=${chunksQuantity}${queryParams}`, nextUrl: chunksQuantity > 1 ? `${url}?page=${page + 1}${queryParams}` : `${url}?page=${page}${queryParams}`, prevUrl: page === 1 ? selfUrl : `${url}${page === 1 ? queryParams && "?" + queryParams.substring(1) : "?page=" + (page - 1) + queryParams}`, }; return links; }; exports.prepareCollectionLinks = prepareCollectionLinks; /** * * @param links * @returns */ const obtainCollectionLinks = (links) => { const response = { self: { href: links.selfUrl, }, first: { href: links.firstUrl, }, prev: { href: links.prevUrl, }, next: { href: links.nextUrl, }, last: { href: links.lastUrl, }, }; return response; }; exports.obtainCollectionLinks = obtainCollectionLinks; /** * * @param baseData * @returns */ const generateHalCollectionResponse = (baseData) => { const response = { _links: (0, exports.obtainCollectionLinks)(baseData.links), count: baseData.data ? baseData.data.length : 0, total: baseData.total, _embeded: { [baseData.collectionName]: baseData.data, }, page: baseData.page, }; return response; }; exports.generateHalCollectionResponse = generateHalCollectionResponse; /** * Validates the requested data * @param baseData */ const validateCollectionData = (baseData) => { if (baseData.page < 1) { throw new error_1.InvalidPage(); } if (baseData.chunk < 0) { throw new error_1.InvalidChunkSize(); } }; exports.validateCollectionData = validateCollectionData; /** * Split an array into chunks * @param array array of data * @param chunkSize chunk size for each split * @returns splited array */ const chunkArray = (array, chunkSize) => { const tempArray = []; for (let i = 0; i < array.length; i += chunkSize) { tempArray.push(array.slice(i, i + chunkSize)); } return tempArray; }; exports.chunkArray = chunkArray; /** * Takes an array chunks it and validates the requested page * @param array {@link IHalObject[]} * @param chunkSize chunk size to split array * @param page requested response page * @returns splited array */ const getChunks = (array, chunkSize, page) => { //TODO check function responsability if (array.length === 0) { if (page > 1) { throw new error_1.PageNotFoundError(); } return []; } else { const chunks = (0, exports.chunkArray)(array, chunkSize); if (chunks.length < page) { throw new error_1.PageNotFoundError(); } else { return chunks; } } }; exports.getChunks = getChunks; //# sourceMappingURL=collection.js.map