{"version":3,"sources":["../../../../src/dbs/mongo/db.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport {\n\tClientSession,\n\tCollection,\n\ttype CollectionInfo,\n\tMongoClient,\n\tObjectId,\n\ttype OptionalUnlessRequiredId,\n\ttype SortDirection,\n\ttype WithId,\n} from 'mongodb'\n\nimport { EquippedError } from '../../errors'\nimport { Instance } from '../../instance'\nimport * as core from '../base/core'\nimport { Db } from '../base/db'\nimport type { DbConfig } from '../base/types'\nimport type { MongoDbConfig, QueryParams } from '../pipes'\nimport { MongoDbChange } from './changes'\nimport { parseMongodbQueryParams } from './query'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nconst sessionStore = new AsyncLocalStorage<ClientSession | undefined>(undefined)\n\nexport class MongoDb extends Db<{ _id: string }> {\n\tclient: MongoClient\n\t#cols: { db: string; col: string }[] = []\n\n\tconstructor(\n\t\tprivate mongoConfig: MongoDbConfig,\n\t\tdbConfig: DbConfig,\n\t) {\n\t\tsuper(dbConfig)\n\t\tthis.client = new MongoClient(mongoConfig.uri, { ignoreUndefined: true })\n\t\tInstance.on(\n\t\t\t'start',\n\t\t\tasync () => {\n\t\t\t\tawait this.client.connect()\n\n\t\t\t\tconst grouped = this.#cols.reduce<Record<string, string[]>>((acc, cur) => {\n\t\t\t\t\tif (!acc[cur.db]) acc[cur.db] = []\n\t\t\t\t\tacc[cur.db].push(cur.col)\n\t\t\t\t\treturn acc\n\t\t\t\t}, {})\n\n\t\t\t\tconst options = {\n\t\t\t\t\tchangeStreamPreAndPostImages: { enabled: true },\n\t\t\t\t}\n\t\t\t\tawait Promise.all(\n\t\t\t\t\tObject.entries(grouped).map(async ([dbName, colNames]) => {\n\t\t\t\t\t\tconst db = this.client.db(dbName)\n\t\t\t\t\t\tconst collections = await db.listCollections<CollectionInfo>().toArray()\n\t\t\t\t\t\treturn colNames.map(async (colName) => {\n\t\t\t\t\t\t\tconst existing = collections.find((collection) => collection.name === colName)\n\t\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\texisting.options?.changeStreamPreAndPostImages?.enabled !== options.changeStreamPreAndPostImages.enabled\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\tawait db.command({ collMod: colName, ...options })\n\t\t\t\t\t\t\t} else await db.createCollection(colName, options)\n\t\t\t\t\t\t})\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t},\n\t\t\t3,\n\t\t)\n\t\tInstance.on('close', async () => this.client.close(), 1)\n\t}\n\n\tasync session<T>(callback: () => Promise<T>) {\n\t\tif (sessionStore.getStore()) return callback()\n\t\tconst session = await this.client.startSession()\n\t\treturn session.withTransaction(async () => sessionStore.run(session, callback))\n\t}\n\n\tid() {\n\t\treturn new ObjectId()\n\t}\n\n\tuse<Model extends core.Model<{ _id: string }>, Entity extends core.Entity>(config: core.Config<Model, Entity>) {\n\t\tconst db = this.getScopedDb(config.db)\n\t\tthis.#cols.push({ db, col: config.col })\n\t\treturn this.#getTable(config, this.client.db(db).collection<Model>(config.col))\n\t}\n\n\t#getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t\tcollection: Collection<Model>,\n\t) {\n\t\ttype WI = Model | WithId<Model>\n\t\tasync function transform(doc: WI): Promise<Entity>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI[]): Promise<Entity[]>\n\t\t// eslint-disable-next-line no-redeclare\n\t\tasync function transform(doc: WI | WI[]) {\n\t\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\t\tconst mapped = docs.map((d) => config.mapper(d as Model))\n\t\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t\t}\n\n\t\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\t\tconst base: core.Model<IdType> = {\n\t\t\t\t[idKey]: id,\n\t\t\t\t...(config.options?.skipAudit\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t\t}),\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t...base,\n\t\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t\t}\n\n\t\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date, upsert = false) {\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t$set: {\n\t\t\t\t\t...value.$set,\n\t\t\t\t\t...(upsert || (Object.keys(value).length > 0 && !config.options?.skipAudit) ? { updatedAt: now.getTime() } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tconst dbThis = this\n\n\t\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\t\tconfig,\n\t\t\textras: { collection },\n\n\t\t\tquery: async (params: QueryParams) => {\n\t\t\t\tconst results = await parseMongodbQueryParams(collection, params)\n\t\t\t\treturn {\n\t\t\t\t\t...results,\n\t\t\t\t\tresults: (await transform(results.results as any)) as any,\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tfindMany: async (filter, options = {}) => {\n\t\t\t\tconst sortArray = Array.isArray(options.sort) ? options.sort : options.sort ? [options.sort] : []\n\t\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\t\tconst docs = await collection\n\t\t\t\t\t.find(filter, {\n\t\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t\t\tlimit: options.limit,\n\t\t\t\t\t\tsort,\n\t\t\t\t\t})\n\t\t\t\t\t.toArray()\n\t\t\t\treturn transform(docs)\n\t\t\t},\n\n\t\t\tfindOne: async (filter) => {\n\t\t\t\tconst result = await table.findMany(filter, { limit: 1 })\n\t\t\t\treturn result.at(0) ?? null\n\t\t\t},\n\n\t\t\tfindById: async (id) => {\n\t\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tinsertMany: async (values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\tawait collection.insertMany(payload, { session: sessionStore.getStore() })\n\n\t\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any)))\n\t\t\t\treturn insertedData.filter((value) => !!value)\n\t\t\t},\n\n\t\t\tinsertOne: async (values, options = {}) => {\n\t\t\t\tconst result = await table.insertMany([values], options)\n\t\t\t\treturn result[0]\n\t\t\t},\n\n\t\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst session = sessionStore.getStore()\n\t\t\t\tconst data = await collection.find(filter, { session, projection: { [idKey]: 1 } }).toArray()\n\t\t\t\tconst ids = data.map((doc) => doc[idKey])\n\t\t\t\tconst filterUpd = { [idKey]: { $in: ids } } as core.Filter<Model>\n\t\t\t\tawait collection.updateMany(filterUpd, prepUpdateValue(values, now), { session })\n\t\t\t\treturn table.findMany(filterUpd)\n\t\t\t},\n\n\t\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\t\treturnDocument: 'after',\n\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t})\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tupdateById: async (id, values, options = {}) => {\n\t\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\t\tfilter,\n\t\t\t\t\t{\n\t\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now, true),\n\t\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t\t},\n\t\t\t\t\t{ returnDocument: 'after', session: sessionStore.getStore(), upsert: true },\n\t\t\t\t)\n\n\t\t\t\treturn transform(doc)\n\t\t\t},\n\n\t\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\t\tawait collection.deleteMany(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn docs\n\t\t\t},\n\n\t\t\tdeleteOne: async (filter) => {\n\t\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn doc ? transform(doc) : null\n\t\t\t},\n\n\t\t\tdeleteById: async (id) => {\n\t\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\t\tif (!operations.length) return\n\t\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: sessionStore.getStore() })\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\toperations.forEach((operation, i) => {\n\t\t\t\t\tswitch (operation.op) {\n\t\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'update':\n\t\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t\t.update({\n\t\t\t\t\t\t\t\t\t...prepUpdateValue('update' in operation ? operation.update : {}, now, true),\n\t\t\t\t\t\t\t\t\t$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tawait bulk.execute({ session: sessionStore.getStore() })\n\t\t\t},\n\n\t\t\twatch(callbacks) {\n\t\t\t\tif (!dbThis.config.changes)\n\t\t\t\t\tInstance.crash(new EquippedError('Db changes are not enabled in the configuration.', { config }))\n\t\t\t\treturn new MongoDbChange<Model, Entity>(dbThis.mongoConfig, dbThis.config.changes, collection, callbacks, config.mapper)\n\t\t\t},\n\t\t}\n\n\t\treturn table\n\t}\n}\n"],"mappings":"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","names":["AsyncLocalStorage","MongoClient","ObjectId","EquippedError","Instance","Db","MongoDbChange","parseMongodbQueryParams","idKey","sessionStore","MongoDb","mongoConfig","dbConfig","grouped","#cols","acc","cur","options","dbName","colNames","db","collections","colName","existing","collection","callback","session","config","#getTable","transform","doc","mapped","d","prepInsertValue","value","id","now","skipUpdate","base","prepUpdateValue","upsert","dbThis","table","params","results","filter","sort","p","docs","values","payload","i","data","ids","filterUpd","operations","bulk","operation","callbacks"]}