@ya-accelerators/web-backend-framework 0.0.55 → 0.0.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/trpc/server/index.d.ts +12 -0
- package/dist/app/trpc/server/index.js +31 -19
- package/dist/app/trpc/server/index.js.map +1 -1
- package/dist/audit-context/index.d.ts +15 -0
- package/dist/audit-context/index.js +17 -0
- package/dist/audit-context/index.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/prisma/index.js +8 -1
- package/dist/prisma/index.js.map +1 -1
- package/dist/prisma/lifecycle.d.ts +31 -0
- package/dist/prisma/lifecycle.js +138 -0
- package/dist/prisma/lifecycle.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
import { type AnyTRPCRouter } from '@trpc/server';
|
|
2
|
+
import * as trpcExpress from '@trpc/server/adapters/express';
|
|
2
3
|
import type express from 'express';
|
|
3
4
|
import superjson from 'superjson';
|
|
5
|
+
declare const createRequestContext: (opts: trpcExpress.CreateExpressContextOptions) => {
|
|
6
|
+
requestHeaders: import("node:http").IncomingHttpHeaders;
|
|
7
|
+
ip: string | undefined;
|
|
8
|
+
};
|
|
9
|
+
type RequestContext = ReturnType<typeof createRequestContext>;
|
|
4
10
|
export declare function httpServerGenerator<TContext extends object = EmptyObject>(options?: {
|
|
5
11
|
customRoutes?: (app: express.Express) => void;
|
|
12
|
+
resolveAuditActor?: (ctx: RequestContext & TContext) => Promise<{
|
|
13
|
+
actorUserId: string | null;
|
|
14
|
+
}> | {
|
|
15
|
+
actorUserId: string | null;
|
|
16
|
+
};
|
|
6
17
|
}): Generator<import("@trpc/server").TRPCRootObject<{
|
|
7
18
|
requestHeaders: import("node:http").IncomingHttpHeaders;
|
|
8
19
|
ip: string | undefined;
|
|
@@ -142,3 +153,4 @@ export declare function httpServerGenerator<TContext extends object = EmptyObjec
|
|
|
142
153
|
};
|
|
143
154
|
transformer: true;
|
|
144
155
|
}>, AnyTRPCRouter>;
|
|
156
|
+
export {};
|
|
@@ -2,6 +2,7 @@ import { TRPCClientError } from '@trpc/client';
|
|
|
2
2
|
import { initTRPC } from '@trpc/server';
|
|
3
3
|
import * as trpcExpress from '@trpc/server/adapters/express';
|
|
4
4
|
import superjson from 'superjson';
|
|
5
|
+
import { runWithAuditActor } from "../../../audit-context/index.js";
|
|
5
6
|
import { defaultEnv } from "../../../env.js";
|
|
6
7
|
import { logger } from "../../../logger/index.js";
|
|
7
8
|
import { prisma } from "../../../prisma/index.js";
|
|
@@ -17,7 +18,7 @@ const createRequestContext = (opts) => {
|
|
|
17
18
|
};
|
|
18
19
|
};
|
|
19
20
|
export function* httpServerGenerator(options = {}) {
|
|
20
|
-
const { customRoutes } = options;
|
|
21
|
+
const { customRoutes, resolveAuditActor } = options;
|
|
21
22
|
const tprc = initTRPC.context().create({
|
|
22
23
|
transformer: superjson,
|
|
23
24
|
errorFormatter({ error, type, path, input, shape }) {
|
|
@@ -46,25 +47,36 @@ export function* httpServerGenerator(options = {}) {
|
|
|
46
47
|
};
|
|
47
48
|
},
|
|
48
49
|
});
|
|
49
|
-
const baseProcedure = tprc.procedure.use(async (opts) =>
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
result
|
|
50
|
+
const baseProcedure = tprc.procedure.use(async (opts) => {
|
|
51
|
+
const actor = resolveAuditActor
|
|
52
|
+
? await resolveAuditActor(opts.ctx)
|
|
53
|
+
: { actorUserId: null };
|
|
54
|
+
const rawInput = await opts.getRawInput();
|
|
55
|
+
const reason = rawInput && typeof rawInput === 'object' && 'reason' in rawInput && typeof rawInput.reason === 'string'
|
|
56
|
+
? rawInput.reason
|
|
57
|
+
: null;
|
|
58
|
+
return runWithAuditActor({ actorUserId: actor.actorUserId, reason }, async () => {
|
|
59
|
+
return await runWithRequestPath(opts.path, async () => {
|
|
60
|
+
const startTime = Date.now();
|
|
61
|
+
const contextWithTiming = opts.ctx;
|
|
62
|
+
contextWithTiming.startTime = startTime;
|
|
63
|
+
const result = await opts.next();
|
|
64
|
+
if (typeof result === 'object' && result !== null && 'error' in result && result.error instanceof Error) {
|
|
65
|
+
throw result.error;
|
|
66
|
+
}
|
|
67
|
+
if (logger.enabled('debug')) {
|
|
68
|
+
logger.debug('operation', {
|
|
69
|
+
type: opts.type,
|
|
70
|
+
...contextWithTiming,
|
|
71
|
+
input: rawInput,
|
|
72
|
+
duration: Date.now() - startTime,
|
|
73
|
+
result: 'data' in result ? result.data : result,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return result;
|
|
64
77
|
});
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
}));
|
|
78
|
+
});
|
|
79
|
+
});
|
|
68
80
|
const enhancedTrpc = tprc;
|
|
69
81
|
enhancedTrpc.procedure = baseProcedure;
|
|
70
82
|
const router = yield enhancedTrpc;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/app/trpc/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAsB,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC3D,OAAO,KAAK,WAAW,MAAM,+BAA+B,CAAA;AAE5D,OAAO,SAAS,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEnD,MAAM,oBAAoB,GAAG,CAAC,IAA6C,EAAE,EAAE;IAC7E,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAA;IACvC,OAAO;QACL,cAAc;QACd,EAAE,EAAE,cAAc,CAAC,cAAc,EAAE,iBAAiB,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa;KACvF,CAAA;AACH,CAAC,CAAA;AAGD,MAAM,SAAS,CAAC,CAAC,mBAAmB,CAClC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/app/trpc/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'async_hooks';
|
|
2
|
+
export interface AuditContext {
|
|
3
|
+
actorUserId: string | null;
|
|
4
|
+
reason: string | null;
|
|
5
|
+
suppress: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare const auditContextStorage: AsyncLocalStorage<AuditContext>;
|
|
8
|
+
export declare const getCurrentAuditContext: () => AuditContext | undefined;
|
|
9
|
+
export declare const runWithAuditActor: <T>(args: {
|
|
10
|
+
actorUserId: string | null;
|
|
11
|
+
reason?: string | null;
|
|
12
|
+
}, fn: () => Promise<T>) => Promise<T>;
|
|
13
|
+
export declare const runAsSystemAction: <T>(args: {
|
|
14
|
+
reason?: string;
|
|
15
|
+
}, fn: () => Promise<T>) => Promise<T>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'async_hooks';
|
|
2
|
+
export const auditContextStorage = new AsyncLocalStorage();
|
|
3
|
+
export const getCurrentAuditContext = () => auditContextStorage.getStore();
|
|
4
|
+
export const runWithAuditActor = (args, fn) => {
|
|
5
|
+
const parent = auditContextStorage.getStore();
|
|
6
|
+
return auditContextStorage.run({
|
|
7
|
+
actorUserId: args.actorUserId,
|
|
8
|
+
reason: args.reason ?? null,
|
|
9
|
+
suppress: parent?.suppress ?? false,
|
|
10
|
+
}, fn);
|
|
11
|
+
};
|
|
12
|
+
export const runAsSystemAction = (args, fn) => auditContextStorage.run({
|
|
13
|
+
actorUserId: null,
|
|
14
|
+
reason: args.reason ?? null,
|
|
15
|
+
suppress: true,
|
|
16
|
+
}, fn);
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/audit-context/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAsB/C,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,iBAAiB,EAAgB,CAAA;AAExE,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAA6B,EAAE,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAA;AAEpG,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAA4D,EAC5D,EAAoB,EACR,EAAE;IACd,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,EAAE,CAAA;IAC7C,OAAO,mBAAmB,CAAC,GAAG,CAC5B;QACE,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;QAC3B,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,KAAK;KACpC,EACD,EAAE,CACH,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAI,IAAyB,EAAE,EAAoB,EAAc,EAAE,CAClG,mBAAmB,CAAC,GAAG,CACrB;IACE,WAAW,EAAE,IAAI;IACjB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;IAC3B,QAAQ,EAAE,IAAI;CACf,EACD,EAAE,CACH,CAAA"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,0BAA0B,CAAA;AACxC,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,kBAAkB,CAAA;AAChC,cAAc,eAAe,CAAA;AAC7B,cAAc,qBAAqB,CAAA;AACnC,cAAc,iBAAiB,CAAA"}
|
package/dist/prisma/index.js
CHANGED
|
@@ -4,6 +4,7 @@ import { readReplicas } from '@prisma/extension-read-replicas';
|
|
|
4
4
|
import { AsyncLocalStorage } from 'async_hooks';
|
|
5
5
|
import { defaultEnv } from "../env.js";
|
|
6
6
|
import { logger } from "../logger/index.js";
|
|
7
|
+
import { buildAggregateRegistry, discoverModelNames, lifecycleEmitExtension } from "./lifecycle.js";
|
|
7
8
|
class Singleton {
|
|
8
9
|
static storage = new AsyncLocalStorage();
|
|
9
10
|
static instances = new Map();
|
|
@@ -120,9 +121,15 @@ export const prisma = {
|
|
|
120
121
|
replica.$on('error', (event) => {
|
|
121
122
|
logger.error('rds', event);
|
|
122
123
|
});
|
|
123
|
-
const
|
|
124
|
+
const registry = buildAggregateRegistry(discoverModelNames(primary));
|
|
125
|
+
const withReplicas = primary.$extends(readReplicas({
|
|
124
126
|
replicas: [replica],
|
|
125
127
|
}));
|
|
128
|
+
const instance = withReplicas.$extends(lifecycleEmitExtension({
|
|
129
|
+
registry,
|
|
130
|
+
getCurrentTransactionClient: () => Singleton.getTransaction(),
|
|
131
|
+
getCurrentPrimaryClient: () => Singleton.getInstance(databaseName),
|
|
132
|
+
}));
|
|
126
133
|
instance.health = async () => {
|
|
127
134
|
const primary = Singleton.getPrimaryInstance(databaseName);
|
|
128
135
|
const replica = Singleton.getReplicaInstance(databaseName);
|
package/dist/prisma/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prisma/index.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAA;AAEtB,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prisma/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export type LifecycleEventType = 'created' | 'updated' | 'deleted';
|
|
2
|
+
export declare const discoverModelNames: (instance: unknown) => readonly string[];
|
|
3
|
+
export declare const buildAggregateRegistry: (modelNames: readonly string[]) => Map<string, string>;
|
|
4
|
+
export declare const classifyUpdateEvent: (data: unknown) => LifecycleEventType;
|
|
5
|
+
export interface LifecycleExtensionOptions {
|
|
6
|
+
registry: Map<string, string>;
|
|
7
|
+
getCurrentTransactionClient: () => any | undefined;
|
|
8
|
+
getCurrentPrimaryClient: () => any | undefined;
|
|
9
|
+
}
|
|
10
|
+
export declare const lifecycleEmitExtension: (options: LifecycleExtensionOptions) => {
|
|
11
|
+
name: string;
|
|
12
|
+
query: {
|
|
13
|
+
$allModels: {
|
|
14
|
+
create({ model, args, query }: {
|
|
15
|
+
model: string;
|
|
16
|
+
args: any;
|
|
17
|
+
query: (a: any) => Promise<any>;
|
|
18
|
+
}): Promise<any>;
|
|
19
|
+
update({ model, args, query }: {
|
|
20
|
+
model: string;
|
|
21
|
+
args: any;
|
|
22
|
+
query: (a: any) => Promise<any>;
|
|
23
|
+
}): Promise<any>;
|
|
24
|
+
delete({ model, args, query }: {
|
|
25
|
+
model: string;
|
|
26
|
+
args: any;
|
|
27
|
+
query: (a: any) => Promise<any>;
|
|
28
|
+
}): Promise<any>;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
};
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { getCurrentAuditContext } from "../audit-context/index.js";
|
|
3
|
+
import { logger } from "../logger/index.js";
|
|
4
|
+
// Lifecycle auto-emit for aggregate-root models.
|
|
5
|
+
//
|
|
6
|
+
// Schema convention (`db-schema.md § Events track aggregates, not individual models`):
|
|
7
|
+
// - A model `Foo` is an aggregate root iff the schema also defines `EventFooLifecycle`.
|
|
8
|
+
// - Child models inside the same aggregate do NOT carry their own `Event*Lifecycle`.
|
|
9
|
+
// - The framework relies on this: the existence of `Event<Model>Lifecycle` is the
|
|
10
|
+
// **only** registration signal — no explicit configuration is required.
|
|
11
|
+
//
|
|
12
|
+
// Operation → event type mapping (`db-schema.md § Event mapping for Lifecycle auto-emit`):
|
|
13
|
+
// - `create` (single row) → `created`
|
|
14
|
+
// - `delete` (single row, physical) → `deleted`
|
|
15
|
+
// - `update` setting `deletedAt` to non-null (soft delete) → `deleted`
|
|
16
|
+
// - `update` of other fields → `updated`
|
|
17
|
+
// - `createMany` / `updateMany` / `deleteMany` → not auto-emitted
|
|
18
|
+
const EVENT_PREFIX = 'Event';
|
|
19
|
+
const EVENT_SUFFIX = 'Lifecycle';
|
|
20
|
+
// Auto-discover model names from a Prisma client instance. Prisma adds each model
|
|
21
|
+
// delegate (`.user`, `.eventUserLifecycle`, ...) as an enumerable own property whose
|
|
22
|
+
// value is an object exposing `.create` / `.findFirst` etc. We pick those out and
|
|
23
|
+
// convert the camelCase keys back to PascalCase to match `Prisma.ModelName` values
|
|
24
|
+
// (`user` → `User`, `eventUserLifecycle` → `EventUserLifecycle`).
|
|
25
|
+
export const discoverModelNames = (instance) => {
|
|
26
|
+
if (!instance || typeof instance !== 'object') {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
const names = [];
|
|
30
|
+
for (const key of Object.keys(instance)) {
|
|
31
|
+
if (key.length === 0 || !/^[a-z]/.test(key)) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
const value = instance[key];
|
|
35
|
+
if (value && typeof value === 'object' && typeof value.create === 'function') {
|
|
36
|
+
names.push(key.charAt(0).toUpperCase() + key.slice(1));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return names;
|
|
40
|
+
};
|
|
41
|
+
// Scan a list of model names and return a map of aggregate-root → event-model.
|
|
42
|
+
// `modelNames` typically comes from `discoverModelNames(prismaInstance)`.
|
|
43
|
+
export const buildAggregateRegistry = (modelNames) => {
|
|
44
|
+
const set = new Set(modelNames);
|
|
45
|
+
const registry = new Map();
|
|
46
|
+
for (const model of modelNames) {
|
|
47
|
+
if (model.startsWith(EVENT_PREFIX) && model.endsWith(EVENT_SUFFIX)) {
|
|
48
|
+
// Skip the Event* models themselves; they cannot be roots.
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const eventName = `${EVENT_PREFIX}${model}${EVENT_SUFFIX}`;
|
|
52
|
+
if (set.has(eventName)) {
|
|
53
|
+
registry.set(model, eventName);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return registry;
|
|
57
|
+
};
|
|
58
|
+
// Soft-delete classification for an `update` op: `data.deletedAt = non-null` → `deleted`,
|
|
59
|
+
// otherwise → `updated`. `data.deletedAt = null` (restore) and `deletedAt` absent both
|
|
60
|
+
// resolve to `updated` per the spec.
|
|
61
|
+
export const classifyUpdateEvent = (data) => {
|
|
62
|
+
if (data && typeof data === 'object' && 'deletedAt' in data) {
|
|
63
|
+
const v = data.deletedAt;
|
|
64
|
+
if (v !== null && v !== undefined) {
|
|
65
|
+
return 'deleted';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return 'updated';
|
|
69
|
+
};
|
|
70
|
+
// PascalCase → camelCase first-letter lowercase. Matches Prisma's model-access key
|
|
71
|
+
// derivation (e.g. `User` → `db.user`, `EventUserLifecycle` → `db.eventUserLifecycle`).
|
|
72
|
+
const toCamelCase = (name) => name.charAt(0).toLowerCase() + name.slice(1);
|
|
73
|
+
// Build a Prisma `$extends` extension that intercepts `create` / `update` / `delete`
|
|
74
|
+
// on every model and emits a Lifecycle event row when the model is an aggregate root.
|
|
75
|
+
export const lifecycleEmitExtension = (options) => {
|
|
76
|
+
const { registry, getCurrentTransactionClient, getCurrentPrimaryClient } = options;
|
|
77
|
+
const emit = async (model, eventType, rowId) => {
|
|
78
|
+
const eventModel = registry.get(model);
|
|
79
|
+
if (!eventModel) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const ctx = getCurrentAuditContext();
|
|
83
|
+
if (ctx?.suppress) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (rowId === undefined || rowId === null) {
|
|
87
|
+
// Without a row id we cannot link the event row to its aggregate.
|
|
88
|
+
// This happens when the consumer uses non-id `where` and the op does not return a row;
|
|
89
|
+
// single-row create / update / delete on a model with `id` always returns one.
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const client = getCurrentTransactionClient() ?? getCurrentPrimaryClient();
|
|
93
|
+
if (!client) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const eventAccess = toCamelCase(eventModel);
|
|
97
|
+
const fkColumn = `${toCamelCase(model)}Id`;
|
|
98
|
+
await client[eventAccess].create({
|
|
99
|
+
data: {
|
|
100
|
+
[fkColumn]: rowId,
|
|
101
|
+
eventType,
|
|
102
|
+
actorUserId: ctx?.actorUserId ?? null,
|
|
103
|
+
reason: ctx?.reason ?? null,
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
logger.debug('lifecycle-emitted', {
|
|
107
|
+
model,
|
|
108
|
+
eventType,
|
|
109
|
+
actorUserId: ctx?.actorUserId ?? null,
|
|
110
|
+
});
|
|
111
|
+
};
|
|
112
|
+
return {
|
|
113
|
+
name: 'lifecycleEmit',
|
|
114
|
+
query: {
|
|
115
|
+
$allModels: {
|
|
116
|
+
async create({ model, args, query }) {
|
|
117
|
+
const result = await query(args);
|
|
118
|
+
await emit(model, 'created', result?.id);
|
|
119
|
+
return result;
|
|
120
|
+
},
|
|
121
|
+
async update({ model, args, query }) {
|
|
122
|
+
const result = await query(args);
|
|
123
|
+
const eventType = classifyUpdateEvent(args?.data);
|
|
124
|
+
await emit(model, eventType, result?.id);
|
|
125
|
+
return result;
|
|
126
|
+
},
|
|
127
|
+
async delete({ model, args, query }) {
|
|
128
|
+
const result = await query(args);
|
|
129
|
+
await emit(model, 'deleted', result?.id);
|
|
130
|
+
return result;
|
|
131
|
+
},
|
|
132
|
+
// createMany / updateMany / deleteMany are intentionally NOT intercepted —
|
|
133
|
+
// they bypass auto-emit per spec (Prisma does not return affected row ids).
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/prisma/lifecycle.ts"],"names":[],"mappings":"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"}
|