hal-ts
Version:
Package to format api responses into hal format
128 lines • 3.81 kB
JavaScript
;
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