{"version":3,"file":"with-hooks.mjs","names":[],"sources":["../../src/db/with-hooks.ts"],"sourcesContent":["import type { BetterAuthOptions } from \"@better-auth/core\";\nimport {\n\tgetCurrentAdapter,\n\tgetCurrentAuthContext,\n\tqueueAfterTransactionHook,\n} from \"@better-auth/core/context\";\nimport type { BaseModelNames } from \"@better-auth/core/db\";\nimport type { DBAdapter, Where } from \"@better-auth/core/db/adapter\";\nimport {\n\tATTR_CONTEXT,\n\tATTR_DB_COLLECTION_NAME,\n\tATTR_HOOK_TYPE,\n\twithSpan,\n} from \"@better-auth/core/instrumentation\";\n\nexport type DatabaseHooksEntry = {\n\tsource: string;\n\thooks: Exclude<BetterAuthOptions[\"databaseHooks\"], undefined>;\n};\n\nexport function getWithHooks(\n\tadapter: DBAdapter<BetterAuthOptions>,\n\tctx: {\n\t\toptions: BetterAuthOptions;\n\t\thooks: DatabaseHooksEntry[];\n\t},\n) {\n\tconst hooksEntries = ctx.hooks;\n\tasync function createWithHooks<T extends Record<string, any>>(\n\t\tdata: T,\n\t\tmodel: BaseModelNames,\n\t\tcustomCreateFn?:\n\t\t\t| {\n\t\t\t\t\tfn: (data: Record<string, any>) => void | Promise<any>;\n\t\t\t\t\texecuteMainFn?: boolean;\n\t\t\t  }\n\t\t\t| undefined,\n\t) {\n\t\tconst context = await getCurrentAuthContext().catch(() => null);\n\t\tlet actualData = data;\n\t\tfor (const { source, hooks } of hooksEntries) {\n\t\t\tconst toRun = hooks[model]?.create?.before;\n\t\t\tif (toRun) {\n\t\t\t\tconst result = await withSpan(\n\t\t\t\t\t`db create.before ${model}`,\n\t\t\t\t\t{\n\t\t\t\t\t\t[ATTR_HOOK_TYPE]: \"create.before\",\n\t\t\t\t\t\t[ATTR_DB_COLLECTION_NAME]: model,\n\t\t\t\t\t\t[ATTR_CONTEXT]: source,\n\t\t\t\t\t},\n\t\t\t\t\t() =>\n\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\ttoRun(actualData as any, context),\n\t\t\t\t);\n\t\t\t\tif (result === false) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst isObject = typeof result === \"object\" && \"data\" in result;\n\t\t\t\tif (isObject) {\n\t\t\t\t\tactualData = {\n\t\t\t\t\t\t...actualData,\n\t\t\t\t\t\t...result.data,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet created: any = null;\n\t\tif (!customCreateFn || customCreateFn.executeMainFn) {\n\t\t\tcreated = await (await getCurrentAdapter(adapter)).create<T>({\n\t\t\t\tmodel,\n\t\t\t\tdata: actualData as any,\n\t\t\t\tforceAllowId: true,\n\t\t\t});\n\t\t}\n\t\tif (customCreateFn?.fn) {\n\t\t\tcreated = await customCreateFn.fn(created ?? actualData);\n\t\t}\n\n\t\tfor (const { source, hooks } of hooksEntries) {\n\t\t\tconst toRun = hooks[model]?.create?.after;\n\t\t\tif (toRun) {\n\t\t\t\tawait queueAfterTransactionHook(async () => {\n\t\t\t\t\tawait withSpan(\n\t\t\t\t\t\t`db create.after ${model}`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t[ATTR_HOOK_TYPE]: \"create.after\",\n\t\t\t\t\t\t\t[ATTR_DB_COLLECTION_NAME]: model,\n\t\t\t\t\t\t\t[ATTR_CONTEXT]: source,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\t\ttoRun(created as any, context),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn created;\n\t}\n\n\tasync function updateWithHooks<T extends Record<string, any>>(\n\t\tdata: any,\n\t\twhere: Where[],\n\t\tmodel: BaseModelNames,\n\t\tcustomUpdateFn?:\n\t\t\t| {\n\t\t\t\t\tfn: (data: Record<string, any>) => void | Promise<any>;\n\t\t\t\t\texecuteMainFn?: boolean;\n\t\t\t  }\n\t\t\t| undefined,\n\t) {\n\t\tconst context = await getCurrentAuthContext().catch(() => null);\n\t\tlet actualData = data;\n\n\t\tfor (const { source, hooks } of hooksEntries) {\n\t\t\tconst toRun = hooks[model]?.update?.before;\n\t\t\tif (toRun) {\n\t\t\t\tconst result = await withSpan(\n\t\t\t\t\t`db update.before ${model}`,\n\t\t\t\t\t{\n\t\t\t\t\t\t[ATTR_HOOK_TYPE]: \"update.before\",\n\t\t\t\t\t\t[ATTR_DB_COLLECTION_NAME]: model,\n\t\t\t\t\t\t[ATTR_CONTEXT]: source,\n\t\t\t\t\t},\n\t\t\t\t\t() =>\n\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\ttoRun(data as any, context),\n\t\t\t\t);\n\t\t\t\tif (result === false) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst isObject = typeof result === \"object\" && \"data\" in result;\n\t\t\t\tif (isObject) {\n\t\t\t\t\tactualData = {\n\t\t\t\t\t\t...actualData,\n\t\t\t\t\t\t...result.data,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst customUpdated = customUpdateFn\n\t\t\t? await customUpdateFn.fn(actualData)\n\t\t\t: null;\n\n\t\tconst updated =\n\t\t\t!customUpdateFn || customUpdateFn.executeMainFn\n\t\t\t\t? await (await getCurrentAdapter(adapter)).update<T>({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tupdate: actualData,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t})\n\t\t\t\t: customUpdated;\n\n\t\tfor (const { source, hooks } of hooksEntries) {\n\t\t\tconst toRun = hooks[model]?.update?.after;\n\t\t\tif (toRun) {\n\t\t\t\tawait queueAfterTransactionHook(async () => {\n\t\t\t\t\tawait withSpan(\n\t\t\t\t\t\t`db update.after ${model}`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t[ATTR_HOOK_TYPE]: \"update.after\",\n\t\t\t\t\t\t\t[ATTR_DB_COLLECTION_NAME]: model,\n\t\t\t\t\t\t\t[ATTR_CONTEXT]: source,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\t\ttoRun(updated as any, context),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn updated;\n\t}\n\n\tasync function updateManyWithHooks<_T extends Record<string, any>>(\n\t\tdata: any,\n\t\twhere: Where[],\n\t\tmodel: BaseModelNames,\n\t\tcustomUpdateFn?:\n\t\t\t| {\n\t\t\t\t\tfn: (data: Record<string, any>) => void | Promise<any>;\n\t\t\t\t\texecuteMainFn?: boolean;\n\t\t\t  }\n\t\t\t| undefined,\n\t) {\n\t\tconst context = await getCurrentAuthContext().catch(() => null);\n\t\tlet actualData = data;\n\n\t\tfor (const { source, hooks } of hooksEntries) {\n\t\t\tconst toRun = hooks[model]?.update?.before;\n\t\t\tif (toRun) {\n\t\t\t\tconst result = await withSpan(\n\t\t\t\t\t`db updateMany.before ${model}`,\n\t\t\t\t\t{\n\t\t\t\t\t\t[ATTR_HOOK_TYPE]: \"updateMany.before\",\n\t\t\t\t\t\t[ATTR_DB_COLLECTION_NAME]: model,\n\t\t\t\t\t\t[ATTR_CONTEXT]: source,\n\t\t\t\t\t},\n\t\t\t\t\t() =>\n\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\ttoRun(data as any, context),\n\t\t\t\t);\n\t\t\t\tif (result === false) {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tconst isObject = typeof result === \"object\" && \"data\" in result;\n\t\t\t\tif (isObject) {\n\t\t\t\t\tactualData = {\n\t\t\t\t\t\t...actualData,\n\t\t\t\t\t\t...result.data,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst customUpdated = customUpdateFn\n\t\t\t? await customUpdateFn.fn(actualData)\n\t\t\t: null;\n\n\t\tconst updated =\n\t\t\t!customUpdateFn || customUpdateFn.executeMainFn\n\t\t\t\t? await (await getCurrentAdapter(adapter)).updateMany({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tupdate: actualData,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t})\n\t\t\t\t: customUpdated;\n\n\t\tfor (const { source, hooks } of hooksEntries) {\n\t\t\tconst toRun = hooks[model]?.update?.after;\n\t\t\tif (toRun) {\n\t\t\t\tawait queueAfterTransactionHook(async () => {\n\t\t\t\t\tawait withSpan(\n\t\t\t\t\t\t`db updateMany.after ${model}`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t[ATTR_HOOK_TYPE]: \"updateMany.after\",\n\t\t\t\t\t\t\t[ATTR_DB_COLLECTION_NAME]: model,\n\t\t\t\t\t\t\t[ATTR_CONTEXT]: source,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\t\ttoRun(updated as any, context),\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn updated;\n\t}\n\n\tasync function deleteWithHooks<T extends Record<string, any>>(\n\t\twhere: Where[],\n\t\tmodel: BaseModelNames,\n\t\tcustomDeleteFn?:\n\t\t\t| {\n\t\t\t\t\tfn: (where: Where[]) => void | Promise<any>;\n\t\t\t\t\texecuteMainFn?: boolean;\n\t\t\t  }\n\t\t\t| undefined,\n\t) {\n\t\tconst context = await getCurrentAuthContext().catch(() => null);\n\t\tlet entityToDelete: T | null = null;\n\n\t\ttry {\n\t\t\tconst entities = await (await getCurrentAdapter(adapter)).findMany<T>({\n\t\t\t\tmodel,\n\t\t\t\twhere,\n\t\t\t\tlimit: 1,\n\t\t\t});\n\t\t\tentityToDelete = entities[0] || null;\n\t\t} catch {\n\t\t\t// If we can't find the entity, we'll still proceed with deletion\n\t\t}\n\n\t\tif (entityToDelete) {\n\t\t\tfor (const { source, hooks } of hooksEntries) {\n\t\t\t\tconst toRun = hooks[model]?.delete?.before;\n\t\t\t\tif (toRun) {\n\t\t\t\t\tconst result = await withSpan(\n\t\t\t\t\t\t`db delete.before ${model}`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t[ATTR_HOOK_TYPE]: \"delete.before\",\n\t\t\t\t\t\t\t[ATTR_DB_COLLECTION_NAME]: model,\n\t\t\t\t\t\t\t[ATTR_CONTEXT]: source,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\t\ttoRun(entityToDelete as any, context),\n\t\t\t\t\t);\n\t\t\t\t\tif (result === false) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst customDeleted = customDeleteFn\n\t\t\t? await customDeleteFn.fn(where)\n\t\t\t: null;\n\n\t\tconst shouldRunAdapterDelete =\n\t\t\t!customDeleteFn || customDeleteFn.executeMainFn;\n\t\tconst deleted =\n\t\t\tshouldRunAdapterDelete && entityToDelete\n\t\t\t\t? await (await getCurrentAdapter(adapter)).delete({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t})\n\t\t\t\t: customDeleted;\n\n\t\tif (entityToDelete) {\n\t\t\tfor (const { source, hooks } of hooksEntries) {\n\t\t\t\tconst toRun = hooks[model]?.delete?.after;\n\t\t\t\tif (toRun) {\n\t\t\t\t\tawait queueAfterTransactionHook(async () => {\n\t\t\t\t\t\tawait withSpan(\n\t\t\t\t\t\t\t`db delete.after ${model}`,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t[ATTR_HOOK_TYPE]: \"delete.after\",\n\t\t\t\t\t\t\t\t[ATTR_DB_COLLECTION_NAME]: model,\n\t\t\t\t\t\t\t\t[ATTR_CONTEXT]: source,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\t\t\ttoRun(entityToDelete as any, context),\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}\n\n\t\treturn deleted;\n\t}\n\n\tasync function deleteManyWithHooks<T extends Record<string, any>>(\n\t\twhere: Where[],\n\t\tmodel: BaseModelNames,\n\t\tcustomDeleteFn?:\n\t\t\t| {\n\t\t\t\t\tfn: (where: Where[]) => void | Promise<any>;\n\t\t\t\t\texecuteMainFn?: boolean;\n\t\t\t  }\n\t\t\t| undefined,\n\t) {\n\t\tconst context = await getCurrentAuthContext().catch(() => null);\n\t\tlet entitiesToDelete: T[] = [];\n\n\t\ttry {\n\t\t\tentitiesToDelete = await (await getCurrentAdapter(adapter)).findMany<T>({\n\t\t\t\tmodel,\n\t\t\t\twhere,\n\t\t\t});\n\t\t} catch {\n\t\t\t// If we can't find the entities, we'll still proceed with deletion\n\t\t}\n\n\t\tfor (const entity of entitiesToDelete) {\n\t\t\tfor (const { source, hooks } of hooksEntries) {\n\t\t\t\tconst toRun = hooks[model]?.delete?.before;\n\t\t\t\tif (toRun) {\n\t\t\t\t\tconst result = await withSpan(\n\t\t\t\t\t\t`db delete.before ${model}`,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t[ATTR_HOOK_TYPE]: \"delete.before\",\n\t\t\t\t\t\t\t[ATTR_DB_COLLECTION_NAME]: model,\n\t\t\t\t\t\t\t[ATTR_CONTEXT]: source,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\t\ttoRun(entity as any, context),\n\t\t\t\t\t);\n\t\t\t\t\tif (result === false) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst customDeleted = customDeleteFn\n\t\t\t? await customDeleteFn.fn(where)\n\t\t\t: null;\n\n\t\tconst deleted =\n\t\t\t!customDeleteFn || customDeleteFn.executeMainFn\n\t\t\t\t? await (await getCurrentAdapter(adapter)).deleteMany({\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\twhere,\n\t\t\t\t\t})\n\t\t\t\t: customDeleted;\n\n\t\tfor (const entity of entitiesToDelete) {\n\t\t\tfor (const { source, hooks } of hooksEntries) {\n\t\t\t\tconst toRun = hooks[model]?.delete?.after;\n\t\t\t\tif (toRun) {\n\t\t\t\t\t// Queue after hooks to run post-transaction\n\t\t\t\t\tawait queueAfterTransactionHook(async () => {\n\t\t\t\t\t\tawait withSpan(\n\t\t\t\t\t\t\t`db delete.after ${model}`,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t[ATTR_HOOK_TYPE]: \"delete.after\",\n\t\t\t\t\t\t\t\t[ATTR_DB_COLLECTION_NAME]: model,\n\t\t\t\t\t\t\t\t[ATTR_CONTEXT]: source,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t() =>\n\t\t\t\t\t\t\t\t// @ts-expect-error context type mismatch\n\t\t\t\t\t\t\t\ttoRun(entity as any, context),\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}\n\n\t\treturn deleted;\n\t}\n\n\treturn {\n\t\tcreateWithHooks,\n\t\tupdateWithHooks,\n\t\tupdateManyWithHooks,\n\t\tdeleteWithHooks,\n\t\tdeleteManyWithHooks,\n\t};\n}\n"],"mappings":"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"}