{"version":3,"sources":["../../../../src/dbs/mongo/query.ts","/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/query.cjs"],"names":[],"mappings":"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","file":"/home/runner/work/equipped/equipped/dist/cjs/dbs/mongo/query.cjs","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",null]}