UNPKG

@opengis/fastify-table

Version:

core-plugins

75 lines (57 loc) 2.64 kB
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, }; }