import { CustomError } from '../error' export default async (req: any, $bq): Promise> => { try { const { entityDef, body, query } = req const { primary, secondary, metaQuery } = query const response = { primary: [], secondary: {}, metadata: { total: 0, pages: 0, page: 0, size: 0, }, } /* * Primary query */ let sql = primary response.primary = await $bq.runQuery({ sql }) /* END Primary query */ /* * Metadata query */ sql = metaQuery const resultTotal = await $bq.runQuery({ sql }) response.metadata.total = resultTotal[0].count const pageSize = response.primary.length response.metadata.size = pageSize const pageNumber = body.pagination?.page || 1 response.metadata.page = pageNumber response.metadata.pages = Math.ceil( response.metadata.total / (body.pagination?.size || response.metadata.size) ) /* END Metadata query */ /* * Secondary queries */ if (!!response.primary[0] && !!entityDef.relationships) { await Promise.all( Object.keys(secondary).map(async (entity: string) => { const childEntityDef = entityDef.relationships[entity] sql = secondary[entity] sql = sql.replace( /{{foreignIdentifier}}/g, `'${response.primary[0][childEntityDef.foreignKey]}'` ) response.secondary[entity] = await $bq.runQuery({ sql }) }) ) } /* END Secondary queries */ return response } catch (error: any) { throw new CustomError(`[performQueryBigQuery] ${error.message}`, 400) } }