All files / utils/api performQueryBigQuery.ts

96.87% Statements 62/64
90% Branches 9/10
100% Functions 1/1
96.87% Lines 62/64

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 651x 1x 1x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x 4x 4x 11x 11x 11x 11x 11x 11x 11x 4x 4x 4x 5x 5x 5x 5x     5x  
import { CustomError } from '../error'
 
export default async (req: any, $bq): Promise<Record<string, any>> => {
  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)
  }
}