@fontoxml/fontoxml-development-tools
Version:
Development tools for Fonto.
132 lines (111 loc) • 2.91 kB
JavaScript
/** @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;