{"version":3,"sources":["../../../../src/dbs/mongo/query.ts"],"sourcesContent":["import { Collection } from 'mongodb'\n\nimport * as core from '../base/core'\nimport { QueryKeys, type QueryParams, type QueryResults, type QueryWhereBlock, type QueryWhereClause } from '../pipes'\n\nexport const parseMongodbQueryParams = async <Model extends core.Model<{ _id: string }>>(\n\tcollection: Collection<Model>,\n\tparams: QueryParams,\n): Promise<QueryResults<Model>> => {\n\t// Handle where/search clauses\n\tconst query = <ReturnType<typeof buildWhereQuery>[]>[]\n\tconst where = buildWhereQuery(params.where, params.whereType)\n\tif (where) query.push(where)\n\tconst auth = buildWhereQuery(params.auth, params.authType)\n\tif (auth) query.push(auth)\n\tif (params.search && params.search.fields.length > 0) {\n\t\tconst search = params.search.fields.map((field) => ({\n\t\t\t[field]: {\n\t\t\t\t$regex: new RegExp(params.search!.value, 'i'),\n\t\t\t},\n\t\t}))\n\t\tquery.push({ $or: search })\n\t}\n\tconst totalClause = {}\n\tif (query.length > 0) totalClause['$and'] = query\n\n\t// Handle sort clauses\n\tconst sort = params.sort.map((p) => [p.field, p.desc ? 'desc' : 'asc'])\n\n\t// Handle limit/offest clause\n\tconst all = params.all ?? false\n\tconst limit = params.limit\n\tconst page = params.page\n\n\tconst total = await collection.countDocuments(totalClause)\n\n\tlet builtQuery = collection.find(totalClause)\n\tif (sort.length) builtQuery = builtQuery.sort(Object.fromEntries(sort))\n\tif (!all && limit) {\n\t\tbuiltQuery = builtQuery.limit(limit)\n\t\tif (page) builtQuery = builtQuery.skip((page - 1) * limit)\n\t}\n\n\tconst results = await builtQuery.toArray()\n\tconst start = 1\n\tconst last = Math.ceil(total / limit) || 1\n\tconst next = page >= last ? null : page + 1\n\tconst previous = page <= start ? null : page - 1\n\n\treturn {\n\t\tpages: { start, last, next, previous, current: page },\n\t\tdocs: { limit, total, count: results.length },\n\t\tresults: results as any[],\n\t} satisfies QueryResults<Model>\n}\n\nfunction isWhereBlock(param: QueryWhereClause): param is QueryWhereBlock {\n\treturn Object.values(QueryKeys).includes(param.condition as QueryKeys)\n}\n\nconst buildWhereQuery = (params: QueryWhereClause[], key: QueryKeys = QueryKeys.and): Record<string, Record<string, any>> | null => {\n\tconst where = (Array.isArray(params) ? params : [])\n\t\t.map((param) => {\n\t\t\tif (isWhereBlock(param)) return buildWhereQuery(param.value, param.condition)\n\t\t\tconst { field } = param\n\t\t\tconst checkedField = field === 'id' ? '_id' : (field ?? '')\n\t\t\tconst checkedValue = param.value === undefined ? '' : param.value\n\t\t\treturn {\n\t\t\t\tfield: checkedField,\n\t\t\t\tvalue: checkedValue,\n\t\t\t\tcondition: param.condition,\n\t\t\t\tisWhere: true,\n\t\t\t}\n\t\t})\n\t\t.filter((c) => !!c)\n\t\t.map((c) => {\n\t\t\tif (c.isWhere) return { [`${c.field}`]: { [`$${c.condition}`]: c.value } }\n\t\t\telse return c\n\t\t})\n\n\treturn where.length > 0 ? { [`$${key}`]: where } : null\n}\n"],"mappings":"AAAA,MAA2B,UAE3B,MAAsB,eACtB,OAAS,aAAAA,MAAmG,WAErG,MAAMC,EAA0B,MACtCC,EACAC,IACkC,CAElC,MAAMC,EAA8C,CAAC,EAC/CC,EAAQC,EAAgBH,EAAO,MAAOA,EAAO,SAAS,EACxDE,GAAOD,EAAM,KAAKC,CAAK,EAC3B,MAAME,EAAOD,EAAgBH,EAAO,KAAMA,EAAO,QAAQ,EAEzD,GADII,GAAMH,EAAM,KAAKG,CAAI,EACrBJ,EAAO,QAAUA,EAAO,OAAO,OAAO,OAAS,EAAG,CACrD,MAAMK,EAASL,EAAO,OAAO,OAAO,IAAKM,IAAW,CACnD,CAACA,CAAK,EAAG,CACR,OAAQ,IAAI,OAAON,EAAO,OAAQ,MAAO,GAAG,CAC7C,CACD,EAAE,EACFC,EAAM,KAAK,CAAE,IAAKI,CAAO,CAAC,CAC3B,CACA,MAAME,EAAc,CAAC,EACjBN,EAAM,OAAS,IAAGM,EAAY,KAAUN,GAG5C,MAAMO,EAAOR,EAAO,KAAK,IAAKS,GAAM,CAACA,EAAE,MAAOA,EAAE,KAAO,OAAS,KAAK,CAAC,EAGhEC,EAAMV,EAAO,KAAO,GACpBW,EAAQX,EAAO,MACfY,EAAOZ,EAAO,KAEda,EAAQ,MAAMd,EAAW,eAAeQ,CAAW,EAEzD,IAAIO,EAAaf,EAAW,KAAKQ,CAAW,EACxCC,EAAK,SAAQM,EAAaA,EAAW,KAAK,OAAO,YAAYN,CAAI,CAAC,GAClE,CAACE,GAAOC,IACXG,EAAaA,EAAW,MAAMH,CAAK,EAC/BC,IAAME,EAAaA,EAAW,MAAMF,EAAO,GAAKD,CAAK,IAG1D,MAAMI,EAAU,MAAMD,EAAW,QAAQ,EACnCE,EAAQ,EACRC,EAAO,KAAK,KAAKJ,EAAQF,CAAK,GAAK,EACnCO,EAAON,GAAQK,EAAO,KAAOL,EAAO,EACpCO,EAAWP,GAAQI,EAAQ,KAAOJ,EAAO,EAE/C,MAAO,CACN,MAAO,CAAE,MAAAI,EAAO,KAAAC,EAAM,KAAAC,EAAM,SAAAC,EAAU,QAASP,CAAK,EACpD,KAAM,CAAE,MAAAD,EAAO,MAAAE,EAAO,MAAOE,EAAQ,MAAO,EAC5C,QAASA,CACV,CACD,EAEA,SAASK,EAAaC,EAAmD,CACxE,OAAO,OAAO,OAAOxB,CAAS,EAAE,SAASwB,EAAM,SAAsB,CACtE,CAEA,MAAMlB,EAAkB,CAACH,EAA4BsB,EAAiBzB,EAAU,MAAoD,CACnI,MAAMK,GAAS,MAAM,QAAQF,CAAM,EAAIA,EAAS,CAAC,GAC/C,IAAKqB,GAAU,CACf,GAAID,EAAaC,CAAK,EAAG,OAAOlB,EAAgBkB,EAAM,MAAOA,EAAM,SAAS,EAC5E,KAAM,CAAE,MAAAf,CAAM,EAAIe,EACZE,EAAejB,IAAU,KAAO,MAASA,GAAS,GAClDkB,EAAeH,EAAM,QAAU,OAAY,GAAKA,EAAM,MAC5D,MAAO,CACN,MAAOE,EACP,MAAOC,EACP,UAAWH,EAAM,UACjB,QAAS,EACV,CACD,CAAC,EACA,OAAQI,GAAM,CAAC,CAACA,CAAC,EACjB,IAAKA,GACDA,EAAE,QAAgB,CAAE,CAAC,GAAGA,EAAE,KAAK,EAAE,EAAG,CAAE,CAAC,IAAIA,EAAE,SAAS,EAAE,EAAGA,EAAE,KAAM,CAAE,EAC7DA,CACZ,EAEF,OAAOvB,EAAM,OAAS,EAAI,CAAE,CAAC,IAAIoB,CAAG,EAAE,EAAGpB,CAAM,EAAI,IACpD","names":["QueryKeys","parseMongodbQueryParams","collection","params","query","where","buildWhereQuery","auth","search","field","totalClause","sort","p","all","limit","page","total","builtQuery","results","start","last","next","previous","isWhereBlock","param","key","checkedField","checkedValue","c"]}