{"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,SAAS,kBAAkB;AAE3B,YAAY,UAAU;AACtB,SAAS,iBAAmG;AAErG,MAAM,0BAA0B,OACtC,YACA,WACkC;AAElC,QAAM,QAA8C,CAAC;AACrD,QAAM,QAAQ,gBAAgB,OAAO,OAAO,OAAO,SAAS;AAC5D,MAAI,MAAO,OAAM,KAAK,KAAK;AAC3B,QAAM,OAAO,gBAAgB,OAAO,MAAM,OAAO,QAAQ;AACzD,MAAI,KAAM,OAAM,KAAK,IAAI;AACzB,MAAI,OAAO,UAAU,OAAO,OAAO,OAAO,SAAS,GAAG;AACrD,UAAM,SAAS,OAAO,OAAO,OAAO,IAAI,CAAC,WAAW;AAAA,MACnD,CAAC,KAAK,GAAG;AAAA,QACR,QAAQ,IAAI,OAAO,OAAO,OAAQ,OAAO,GAAG;AAAA,MAC7C;AAAA,IACD,EAAE;AACF,UAAM,KAAK,EAAE,KAAK,OAAO,CAAC;AAAA,EAC3B;AACA,QAAM,cAAc,CAAC;AACrB,MAAI,MAAM,SAAS,EAAG,aAAY,MAAM,IAAI;AAG5C,QAAM,OAAO,OAAO,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,SAAS,KAAK,CAAC;AAGtE,QAAM,MAAM,OAAO,OAAO;AAC1B,QAAM,QAAQ,OAAO;AACrB,QAAM,OAAO,OAAO;AAEpB,QAAM,QAAQ,MAAM,WAAW,eAAe,WAAW;AAEzD,MAAI,aAAa,WAAW,KAAK,WAAW;AAC5C,MAAI,KAAK,OAAQ,cAAa,WAAW,KAAK,OAAO,YAAY,IAAI,CAAC;AACtE,MAAI,CAAC,OAAO,OAAO;AAClB,iBAAa,WAAW,MAAM,KAAK;AACnC,QAAI,KAAM,cAAa,WAAW,MAAM,OAAO,KAAK,KAAK;AAAA,EAC1D;AAEA,QAAM,UAAU,MAAM,WAAW,QAAQ;AACzC,QAAM,QAAQ;AACd,QAAM,OAAO,KAAK,KAAK,QAAQ,KAAK,KAAK;AACzC,QAAM,OAAO,QAAQ,OAAO,OAAO,OAAO;AAC1C,QAAM,WAAW,QAAQ,QAAQ,OAAO,OAAO;AAE/C,SAAO;AAAA,IACN,OAAO,EAAE,OAAO,MAAM,MAAM,UAAU,SAAS,KAAK;AAAA,IACpD,MAAM,EAAE,OAAO,OAAO,OAAO,QAAQ,OAAO;AAAA,IAC5C;AAAA,EACD;AACD;AAEA,SAAS,aAAa,OAAmD;AACxE,SAAO,OAAO,OAAO,SAAS,EAAE,SAAS,MAAM,SAAsB;AACtE;AAEA,MAAM,kBAAkB,CAAC,QAA4B,MAAiB,UAAU,QAAoD;AACnI,QAAM,SAAS,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,GAC/C,IAAI,CAAC,UAAU;AACf,QAAI,aAAa,KAAK,EAAG,QAAO,gBAAgB,MAAM,OAAO,MAAM,SAAS;AAC5E,UAAM,EAAE,MAAM,IAAI;AAClB,UAAM,eAAe,UAAU,OAAO,QAAS,SAAS;AACxD,UAAM,eAAe,MAAM,UAAU,SAAY,KAAK,MAAM;AAC5D,WAAO;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,WAAW,MAAM;AAAA,MACjB,SAAS;AAAA,IACV;AAAA,EACD,CAAC,EACA,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EACjB,IAAI,CAAC,MAAM;AACX,QAAI,EAAE,QAAS,QAAO,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE;AAAA,QACpE,QAAO;AAAA,EACb,CAAC;AAEF,SAAO,MAAM,SAAS,IAAI,EAAE,CAAC,IAAI,GAAG,EAAE,GAAG,MAAM,IAAI;AACpD;","names":[]}