UNPKG

@fontoxml/fontoxml-development-tools

Version:

Development tools for Fonto.

132 lines (111 loc) 2.91 kB
/** @typedef {import('../../src/getAppConfig.js').DevCmsConfig} DevCmsConfig */ function filterItemsForRequest(files, assetTypes, resultTypes) { // Filter files/folders const results = files.filter(function (item) { if (item.type === 'folder') { return resultTypes.indexOf('folder') !== -1; } // Item is a file if (resultTypes.indexOf('file') === -1) { return false; } return assetTypes.indexOf(item.type) !== -1; }); // Sort by filename results.sort(function (a, b) { return a.label.localeCompare(b.label); }); return results; } /** * @param {DevCmsConfig} _config */ function configureBrowsePostRouteHandler(_config) { return (req, res) => { const assetTypes = req.body.assetTypes; const resultTypes = req.body.resultTypes; const folderId = req.body.folderId; const query = req.body.query; // Protect development/staging server from exposing non asset folders // Needs improvements, '..'' is not an watertight check if (folderId && folderId.indexOf('..') !== -1) { res.status(403).end(); return; } let files = req.cms.listSync( folderId, req.body.context.editSessionToken ); if (!files) { // The requested folder did not exist res.status(404).end(); return; } if (query) { // Request is a search, get files recursively, keep looping while we append new items to the files array for (let i = 0; i < files.length; ++i) { if (files[i].type !== 'folder') { continue; } const items = req.cms.listSync( files[i].id, req.body.context.editSessionToken, ); if (!items) { continue; } // Add files for this folder files = files.concat(items); } } // Filter requested types files = filterItemsForRequest(files, assetTypes, resultTypes); // Filter by query if (query) { files = files.filter(function (item) { // If fulltext is provided, filter by label if (query.fulltext) { return ( item.label .toLowerCase() .indexOf(query.fulltext.toLowerCase()) !== -1 ); } return true; }); } const totalItemCount = files.length; // Pagination let offset = req.body.offset; if (offset) { offset = parseInt(offset, 10); files = files.slice(offset); } let limit = req.body.limit; if (limit) { limit = parseInt(limit, 10); files = files.slice(0, limit); } // Add folderCount to folders files = files.map(function (file) { if (file.type === 'folder') { const folders = req.cms.listSync( file.id, req.body.context.editSessionToken ); file.folderCount = folders ? filterItemsForRequest(folders, assetTypes, ['folder']) .length : 0; } return file; }); res.status(200) .set('content-type', 'application/json; charset=utf-8') .json({ totalItemCount, items: files, }); }; } export default configureBrowsePostRouteHandler;