All files / src/databases parseDaos.ts

31.14% Statements 19/61
100% Branches 0/0
0% Functions 0/2
31.14% Lines 19/61

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 611x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x                                           1x 1x 1x 1x 1x 1x 1x 1x                                          
 
 
import { DaoHookNamesMongo, MongoDao, MongoDaoParsed } from './mongo/types/mongoDbTypes'
import { parseForClause } from '../security/helpers/parseForClause'
import { registerDaoHooks } from './0_hooks/registerDaoHooks'
import { asArray, JSONstringyParse } from 'topkat-utils'
 
 
 
 
export async function parseDaos<
  DaoConfigsRaw extends Record<string, MongoDaoParsed<any> | MongoDao<any>>,
  DaoConfigsParsed extends Record<keyof DaoConfigsRaw, MongoDaoParsed<any>>
>(
  modelNames: string[], // we provide modelNames in case some models doesn't have a dao
  daoConfigsGeneratedRaw: DaoConfigsRaw,
  defaultDaoConfig?: MongoDaoParsed<any> | MongoDao<any>,
): Promise<DaoConfigsParsed> {

  const daoConfigsParsed = {} as DaoConfigsParsed

  for (const modelName of modelNames) {
    // DEFAULT VALUES FOR EACH DAO
    (daoConfigsParsed as any)[modelName] ??= daoConfigsGeneratedRaw[modelName + 'Dao']

    await mergeDaoWithDefaults(daoConfigsParsed[modelName], defaultDaoConfig)

    await registerDaoHooks(modelName, daoConfigsParsed[modelName])
  }

  return daoConfigsParsed
}
 
 
 
//  ╦  ╦ ╔══╗ ╦    ╔══╗ ╔══╗ ╔══╗ ╔═══
//  ╠══╣ ╠═   ║    ╠══╝ ╠═   ╠═╦╝ ╚══╗
//  ╩  ╩ ╚══╝ ╚══╝ ╩    ╚══╝ ╩ ╚  ═══╝
 
 
async function mergeDaoWithDefaults(original: MongoDaoParsed<any>, toMerge?: MongoDaoParsed<any> | MongoDao<any>) {

  original.expose ??= []
  original.populate ??= []

  const toMergeNew = toMerge ? JSONstringyParse(toMerge) : {}

  for (const hookName in toMergeNew) {
    const hookInDaoConfForModel = original[hookName]

    // TODO replace with mongo Hook names when needed
    const authorizedToMerge: DaoHookNamesMongo[] = ['expose', 'mask']

    if (typeof hookInDaoConfForModel === 'undefined') original[hookName] = toMergeNew[hookName]
    else if (authorizedToMerge.includes(hookName as DaoHookNamesMongo)) original[hookName] = [...asArray(original[hookName]), ...asArray(toMergeNew[hookName], [])]

    for (const hook of original.expose) {
      if (hook.for && typeof hook.for !== 'function') hook.for = await parseForClause(hook.for)
    }
  }
}