@opengis/fastify-table
Version:
core-plugins
75 lines (57 loc) • 2.64 kB
JavaScript
import {
getMeta, metaFormat, getTemplates, getTemplate, handlebars,
} from '../../../../utils.js';
function sequence(tables, data, fn) {
return tables.reduce((promise, table) => promise.then(() => fn({
...data, tableName: table.replace('.json', ''),
})), Promise.resolve());
}
async function getData({
pg, tableName, query = {}, maxLimit, res,
}) {
const loadTable = await getTemplate('table', tableName);
if (!loadTable) { return { message: 'not found', status: 404 }; }
const {
table, columns, meta,
} = loadTable;
const { pk } = await getMeta(table);
const cols = columns.map((el) => el.name || el).join(',');
const [orderColumn, orderDir] = (query.order || loadTable.order || '').split('-');
const order = cols.includes(orderColumn) && orderColumn?.length ? `order by ${orderColumn} ${query.desc || orderDir === 'desc' ? 'desc' : ''}` : '';
const limit = Math.max(maxLimit - res.rows.length, 0);
// Math.max(query.offset - res.rows.length,0)
const offset = query.page && query.page > 0 ? ` offset ${(query.page - 1) * limit}` : '';
const search1 = meta?.search && query.key ? `(${meta?.search.concat(meta?.title ? `,${meta?.title}` : '').split(',').map(el => `${el} ilike '%${query.key}%'`).join(' or ')})` : 'false';
const where = [!pk ? 'false' : 'true', loadTable.query, search1].filter((el) => el);
const q = `select ${[`"${pk}" as id`, meta?.title ? `${meta.title} as title` : ''].filter((el) => el).join(',')} from ${table} t where ${where.join(' and ') || 'true'} ${order} ${offset} limit ${limit}`;
if (query.sql) {
res.sql.push(q);
return null;
}
const { rows } = await pg.query(q);
const total = await pg.queryCache(`select count(*) from ${table} t where ${where.join(' and ') || 'true'}`).then((el) => el?.rows[0]?.count) || 0;
await metaFormat({ rows, table: tableName });
res.total += +total;
rows.forEach((row) => {
const href = meta?.href ? handlebars.compile(meta.href)({ ...row, [pk]: row.id }) : undefined;
res.rows.push({
...row, register: tableName, register_title: loadTable.ua, href,
});
});
return null;
}
export default async function search({
pg, funcs, query = {},
}) {
const time = Date.now();
const tables = query.table ? [query.table] : await getTemplates('table');
const res = { rows: [], sql: [], total: 0 };
const maxLimit = Math.min(100, query.limit || '16');
await sequence(tables, {
pg, funcs, query, maxLimit, res,
}, getData);
if (query.sql) return res.sql.join(';\n');
return {
time: Date.now() - time, total: res.total, count: res.rows.length, rows: res.rows,
};
}