@decaf-ts/for-typeorm 0.0.6
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/LICENSE.md +21 -0
- package/README.md +93 -0
- package/dist/for-typeorm.cjs +2553 -0
- package/dist/for-typeorm.esm.cjs +2538 -0
- package/lib/TypeORMAdapter.cjs +1129 -0
- package/lib/TypeORMAdapter.d.ts +221 -0
- package/lib/TypeORMDispatch.cjs +134 -0
- package/lib/TypeORMDispatch.d.ts +87 -0
- package/lib/TypeORMEventSubscriber.cjs +96 -0
- package/lib/TypeORMEventSubscriber.d.ts +56 -0
- package/lib/TypeORMRepository.cjs +209 -0
- package/lib/TypeORMRepository.d.ts +125 -0
- package/lib/constants.cjs +43 -0
- package/lib/constants.d.ts +39 -0
- package/lib/errors.cjs +28 -0
- package/lib/errors.d.ts +21 -0
- package/lib/esm/TypeORMAdapter.d.ts +221 -0
- package/lib/esm/TypeORMAdapter.js +1124 -0
- package/lib/esm/TypeORMDispatch.d.ts +87 -0
- package/lib/esm/TypeORMDispatch.js +130 -0
- package/lib/esm/TypeORMEventSubscriber.d.ts +56 -0
- package/lib/esm/TypeORMEventSubscriber.js +93 -0
- package/lib/esm/TypeORMRepository.d.ts +125 -0
- package/lib/esm/TypeORMRepository.js +206 -0
- package/lib/esm/constants.d.ts +39 -0
- package/lib/esm/constants.js +40 -0
- package/lib/esm/errors.d.ts +21 -0
- package/lib/esm/errors.js +24 -0
- package/lib/esm/index.d.ts +22 -0
- package/lib/esm/index.js +25 -0
- package/lib/esm/indexes/generator.d.ts +50 -0
- package/lib/esm/indexes/generator.js +95 -0
- package/lib/esm/indexes/index.d.ts +1 -0
- package/lib/esm/indexes/index.js +2 -0
- package/lib/esm/overrides/Column.d.ts +74 -0
- package/lib/esm/overrides/Column.js +70 -0
- package/lib/esm/overrides/CreateDateColumn.d.ts +2 -0
- package/lib/esm/overrides/CreateDateColumn.js +9 -0
- package/lib/esm/overrides/Entity.d.ts +11 -0
- package/lib/esm/overrides/Entity.js +28 -0
- package/lib/esm/overrides/PrimaryColumn.d.ts +20 -0
- package/lib/esm/overrides/PrimaryColumn.js +53 -0
- package/lib/esm/overrides/PrimaryGeneratedColumn.d.ts +24 -0
- package/lib/esm/overrides/PrimaryGeneratedColumn.js +51 -0
- package/lib/esm/overrides/UpdateDateColumn.d.ts +2 -0
- package/lib/esm/overrides/UpdateDateColumn.js +9 -0
- package/lib/esm/overrides/utils.d.ts +2 -0
- package/lib/esm/overrides/utils.js +29 -0
- package/lib/esm/query/Paginator.d.ts +86 -0
- package/lib/esm/query/Paginator.js +124 -0
- package/lib/esm/query/Statement.d.ts +131 -0
- package/lib/esm/query/Statement.js +242 -0
- package/lib/esm/query/constants.d.ts +52 -0
- package/lib/esm/query/constants.js +74 -0
- package/lib/esm/query/index.d.ts +4 -0
- package/lib/esm/query/index.js +5 -0
- package/lib/esm/query/translate.d.ts +34 -0
- package/lib/esm/query/translate.js +42 -0
- package/lib/esm/raw/postgres.d.ts +36 -0
- package/lib/esm/raw/postgres.js +2 -0
- package/lib/esm/sequences/Sequence.d.ts +67 -0
- package/lib/esm/sequences/Sequence.js +117 -0
- package/lib/esm/sequences/index.d.ts +1 -0
- package/lib/esm/sequences/index.js +2 -0
- package/lib/esm/types.d.ts +67 -0
- package/lib/esm/types.js +28 -0
- package/lib/esm/utils.d.ts +16 -0
- package/lib/esm/utils.js +29 -0
- package/lib/index.cjs +42 -0
- package/lib/index.d.ts +22 -0
- package/lib/indexes/generator.cjs +98 -0
- package/lib/indexes/generator.d.ts +50 -0
- package/lib/indexes/index.cjs +18 -0
- package/lib/indexes/index.d.ts +1 -0
- package/lib/overrides/Column.cjs +73 -0
- package/lib/overrides/Column.d.ts +74 -0
- package/lib/overrides/CreateDateColumn.cjs +12 -0
- package/lib/overrides/CreateDateColumn.d.ts +2 -0
- package/lib/overrides/Entity.cjs +31 -0
- package/lib/overrides/Entity.d.ts +11 -0
- package/lib/overrides/PrimaryColumn.cjs +56 -0
- package/lib/overrides/PrimaryColumn.d.ts +20 -0
- package/lib/overrides/PrimaryGeneratedColumn.cjs +54 -0
- package/lib/overrides/PrimaryGeneratedColumn.d.ts +24 -0
- package/lib/overrides/UpdateDateColumn.cjs +12 -0
- package/lib/overrides/UpdateDateColumn.d.ts +2 -0
- package/lib/overrides/utils.cjs +32 -0
- package/lib/overrides/utils.d.ts +2 -0
- package/lib/query/Paginator.cjs +128 -0
- package/lib/query/Paginator.d.ts +86 -0
- package/lib/query/Statement.cjs +246 -0
- package/lib/query/Statement.d.ts +131 -0
- package/lib/query/constants.cjs +77 -0
- package/lib/query/constants.d.ts +52 -0
- package/lib/query/index.cjs +21 -0
- package/lib/query/index.d.ts +4 -0
- package/lib/query/translate.cjs +45 -0
- package/lib/query/translate.d.ts +34 -0
- package/lib/raw/postgres.cjs +3 -0
- package/lib/raw/postgres.d.ts +36 -0
- package/lib/sequences/Sequence.cjs +121 -0
- package/lib/sequences/Sequence.d.ts +67 -0
- package/lib/sequences/index.cjs +18 -0
- package/lib/sequences/index.d.ts +1 -0
- package/lib/types.cjs +31 -0
- package/lib/types.d.ts +67 -0
- package/lib/utils.cjs +32 -0
- package/lib/utils.d.ts +16 -0
- package/package.json +128 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Dispatch, EventIds } from "@decaf-ts/core";
|
|
2
|
+
import { OperationKeys } from "@decaf-ts/db-decorators";
|
|
3
|
+
import { DataSourceOptions } from "typeorm/data-source/DataSourceOptions";
|
|
4
|
+
/**
|
|
5
|
+
* @description Dispatcher for TypeORM-driven change events.
|
|
6
|
+
* @summary Subscribes a TypeORM DataSource with a custom EntitySubscriber to notify observers when records are created, updated, or deleted.
|
|
7
|
+
* @param {number} [timeout=5000] Timeout in milliseconds for initialization retries.
|
|
8
|
+
* @class TypeORMDispatch
|
|
9
|
+
* @example
|
|
10
|
+
* // Create a dispatcher for a TypeORM DataSource
|
|
11
|
+
* const dispatch = new TypeORMDispatch();
|
|
12
|
+
* await dispatch.observe(adapter, adapter.dataSource.options);
|
|
13
|
+
*
|
|
14
|
+
* // The dispatcher registers a TypeORMEventSubscriber and notifies observers when entities change.
|
|
15
|
+
* @mermaid
|
|
16
|
+
* classDiagram
|
|
17
|
+
* class Dispatch {
|
|
18
|
+
* +initialize()
|
|
19
|
+
* +updateObservers()
|
|
20
|
+
* }
|
|
21
|
+
* class TypeORMDispatch {
|
|
22
|
+
* -observerLastUpdate?: string
|
|
23
|
+
* -attemptCounter: number
|
|
24
|
+
* -timeout: number
|
|
25
|
+
* +constructor(timeout)
|
|
26
|
+
* #notificationHandler()
|
|
27
|
+
* #initialize()
|
|
28
|
+
* }
|
|
29
|
+
* Dispatch <|-- TypeORMDispatch
|
|
30
|
+
*/
|
|
31
|
+
export declare class TypeORMDispatch extends Dispatch<DataSourceOptions> {
|
|
32
|
+
private timeout;
|
|
33
|
+
private observerLastUpdate?;
|
|
34
|
+
private attemptCounter;
|
|
35
|
+
constructor(timeout?: number);
|
|
36
|
+
/**
|
|
37
|
+
* @description Processes TypeORM notification events.
|
|
38
|
+
* @summary Handles change notifications (translated from TypeORM events) and notifies observers about record changes.
|
|
39
|
+
* @param {string} table The notification payload.
|
|
40
|
+
* @param {OperationKeys} operation The notification payload.
|
|
41
|
+
* @param {EventIds} ids The notification payload.
|
|
42
|
+
* @return {Promise<void>} A promise that resolves when all notifications have been processed.
|
|
43
|
+
* @mermaid
|
|
44
|
+
* sequenceDiagram
|
|
45
|
+
* participant D as PostgreSQLDispatch
|
|
46
|
+
* participant L as Logger
|
|
47
|
+
* participant O as Observers
|
|
48
|
+
* Note over D: Receive notification from PostgreSQL
|
|
49
|
+
* D->>D: Parse notification payload
|
|
50
|
+
* D->>D: Extract table, operation, and ids
|
|
51
|
+
* D->>O: updateObservers(table, operation, ids)
|
|
52
|
+
* D->>D: Update observerLastUpdate
|
|
53
|
+
* D->>L: Log successful dispatch
|
|
54
|
+
*/
|
|
55
|
+
protected notificationHandler(table: string, operation: OperationKeys, ids: EventIds): Promise<void>;
|
|
56
|
+
/**
|
|
57
|
+
* @description Initializes the dispatcher and subscribes to TypeORM notifications.
|
|
58
|
+
* @summary Registers the TypeORMEventSubscriber on the DataSource and logs the subscription lifecycle.
|
|
59
|
+
* @return {Promise<void>} A promise that resolves when the subscription is established.
|
|
60
|
+
* @mermaid
|
|
61
|
+
* sequenceDiagram
|
|
62
|
+
* participant D as TypeORMDispatch
|
|
63
|
+
* participant S as subscribeToTypeORM
|
|
64
|
+
* participant DS as TypeORM DataSource
|
|
65
|
+
* participant L as Logger
|
|
66
|
+
* D->>S: Call subscribeToTypeORM
|
|
67
|
+
* S->>S: Check adapter and native
|
|
68
|
+
* alt No adapter or native
|
|
69
|
+
* S-->>S: throw InternalError
|
|
70
|
+
* end
|
|
71
|
+
* S->>DS: initialize()
|
|
72
|
+
* S->>DS: subscribers.push(TypeORMEventSubscriber)
|
|
73
|
+
* alt Success
|
|
74
|
+
* DS-->>S: Subscription established
|
|
75
|
+
* S-->>D: Promise resolves
|
|
76
|
+
* D->>L: Log successful subscription
|
|
77
|
+
* else Error
|
|
78
|
+
* DS-->>S: Error
|
|
79
|
+
* S-->>D: Promise rejects
|
|
80
|
+
* end
|
|
81
|
+
*/
|
|
82
|
+
protected initialize(): Promise<void>;
|
|
83
|
+
/**
|
|
84
|
+
* Cleanup method to release resources when the dispatcher is no longer needed
|
|
85
|
+
*/
|
|
86
|
+
cleanup(): void;
|
|
87
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { Dispatch } from "@decaf-ts/core";
|
|
2
|
+
import { InternalError } from "@decaf-ts/db-decorators";
|
|
3
|
+
import { TypeORMEventSubscriber } from "./TypeORMEventSubscriber.js";
|
|
4
|
+
/**
|
|
5
|
+
* @description Dispatcher for TypeORM-driven change events.
|
|
6
|
+
* @summary Subscribes a TypeORM DataSource with a custom EntitySubscriber to notify observers when records are created, updated, or deleted.
|
|
7
|
+
* @param {number} [timeout=5000] Timeout in milliseconds for initialization retries.
|
|
8
|
+
* @class TypeORMDispatch
|
|
9
|
+
* @example
|
|
10
|
+
* // Create a dispatcher for a TypeORM DataSource
|
|
11
|
+
* const dispatch = new TypeORMDispatch();
|
|
12
|
+
* await dispatch.observe(adapter, adapter.dataSource.options);
|
|
13
|
+
*
|
|
14
|
+
* // The dispatcher registers a TypeORMEventSubscriber and notifies observers when entities change.
|
|
15
|
+
* @mermaid
|
|
16
|
+
* classDiagram
|
|
17
|
+
* class Dispatch {
|
|
18
|
+
* +initialize()
|
|
19
|
+
* +updateObservers()
|
|
20
|
+
* }
|
|
21
|
+
* class TypeORMDispatch {
|
|
22
|
+
* -observerLastUpdate?: string
|
|
23
|
+
* -attemptCounter: number
|
|
24
|
+
* -timeout: number
|
|
25
|
+
* +constructor(timeout)
|
|
26
|
+
* #notificationHandler()
|
|
27
|
+
* #initialize()
|
|
28
|
+
* }
|
|
29
|
+
* Dispatch <|-- TypeORMDispatch
|
|
30
|
+
*/
|
|
31
|
+
export class TypeORMDispatch extends Dispatch {
|
|
32
|
+
constructor(timeout = 5000) {
|
|
33
|
+
super();
|
|
34
|
+
this.timeout = timeout;
|
|
35
|
+
this.attemptCounter = 0;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* @description Processes TypeORM notification events.
|
|
39
|
+
* @summary Handles change notifications (translated from TypeORM events) and notifies observers about record changes.
|
|
40
|
+
* @param {string} table The notification payload.
|
|
41
|
+
* @param {OperationKeys} operation The notification payload.
|
|
42
|
+
* @param {EventIds} ids The notification payload.
|
|
43
|
+
* @return {Promise<void>} A promise that resolves when all notifications have been processed.
|
|
44
|
+
* @mermaid
|
|
45
|
+
* sequenceDiagram
|
|
46
|
+
* participant D as PostgreSQLDispatch
|
|
47
|
+
* participant L as Logger
|
|
48
|
+
* participant O as Observers
|
|
49
|
+
* Note over D: Receive notification from PostgreSQL
|
|
50
|
+
* D->>D: Parse notification payload
|
|
51
|
+
* D->>D: Extract table, operation, and ids
|
|
52
|
+
* D->>O: updateObservers(table, operation, ids)
|
|
53
|
+
* D->>D: Update observerLastUpdate
|
|
54
|
+
* D->>L: Log successful dispatch
|
|
55
|
+
*/
|
|
56
|
+
async notificationHandler(table, operation, ids) {
|
|
57
|
+
const log = this.log.for(this.notificationHandler);
|
|
58
|
+
try {
|
|
59
|
+
// Notify observers
|
|
60
|
+
await this.updateObservers(table, operation, ids);
|
|
61
|
+
this.observerLastUpdate = new Date().toISOString();
|
|
62
|
+
log.verbose(`Observer refresh dispatched by ${operation} for ${table}`);
|
|
63
|
+
log.debug(`pks: ${ids}`);
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
log.error(`Failed to process notification: ${e}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* @description Initializes the dispatcher and subscribes to TypeORM notifications.
|
|
71
|
+
* @summary Registers the TypeORMEventSubscriber on the DataSource and logs the subscription lifecycle.
|
|
72
|
+
* @return {Promise<void>} A promise that resolves when the subscription is established.
|
|
73
|
+
* @mermaid
|
|
74
|
+
* sequenceDiagram
|
|
75
|
+
* participant D as TypeORMDispatch
|
|
76
|
+
* participant S as subscribeToTypeORM
|
|
77
|
+
* participant DS as TypeORM DataSource
|
|
78
|
+
* participant L as Logger
|
|
79
|
+
* D->>S: Call subscribeToTypeORM
|
|
80
|
+
* S->>S: Check adapter and native
|
|
81
|
+
* alt No adapter or native
|
|
82
|
+
* S-->>S: throw InternalError
|
|
83
|
+
* end
|
|
84
|
+
* S->>DS: initialize()
|
|
85
|
+
* S->>DS: subscribers.push(TypeORMEventSubscriber)
|
|
86
|
+
* alt Success
|
|
87
|
+
* DS-->>S: Subscription established
|
|
88
|
+
* S-->>D: Promise resolves
|
|
89
|
+
* D->>L: Log successful subscription
|
|
90
|
+
* else Error
|
|
91
|
+
* DS-->>S: Error
|
|
92
|
+
* S-->>D: Promise rejects
|
|
93
|
+
* end
|
|
94
|
+
*/
|
|
95
|
+
async initialize() {
|
|
96
|
+
async function subscribeToTypeORM() {
|
|
97
|
+
if (!this.adapter || !this.native) {
|
|
98
|
+
throw new InternalError(`No adapter/native observed for dispatch`);
|
|
99
|
+
}
|
|
100
|
+
const adapter = this.adapter;
|
|
101
|
+
try {
|
|
102
|
+
if (!adapter.dataSource.isInitialized)
|
|
103
|
+
await adapter.dataSource.initialize();
|
|
104
|
+
adapter.dataSource.subscribers.push(new TypeORMEventSubscriber(this.notificationHandler.bind(this)));
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
throw new InternalError(e);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
subscribeToTypeORM
|
|
111
|
+
.call(this)
|
|
112
|
+
.then(() => {
|
|
113
|
+
this.log.info(`Subscribed to TypeORM notifications`);
|
|
114
|
+
})
|
|
115
|
+
.catch((e) => {
|
|
116
|
+
throw new InternalError(`Failed to subscribe to TypeORM notifications: ${e}`);
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Cleanup method to release resources when the dispatcher is no longer needed
|
|
121
|
+
*/
|
|
122
|
+
cleanup() {
|
|
123
|
+
// if (this.adapter) {
|
|
124
|
+
//
|
|
125
|
+
// const adapter = this.adapter as TypeORMAdapter;
|
|
126
|
+
// await adapter.dataSource.destroy();
|
|
127
|
+
// }
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHlwZU9STURpc3BhdGNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL1R5cGVPUk1EaXNwYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFZLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBaUIsTUFBTSx5QkFBeUIsQ0FBQztBQUd2RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0NBQWlDO0FBRWxFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILE1BQU0sT0FBTyxlQUFnQixTQUFRLFFBQTJCO0lBSTlELFlBQW9CLFVBQVUsSUFBSTtRQUNoQyxLQUFLLEVBQUUsQ0FBQztRQURVLFlBQU8sR0FBUCxPQUFPLENBQU87UUFGMUIsbUJBQWMsR0FBVyxDQUFDLENBQUM7SUFJbkMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FrQkc7SUFDTyxLQUFLLENBQUMsbUJBQW1CLENBQ2pDLEtBQWEsRUFDYixTQUF3QixFQUN4QixHQUFhO1FBRWIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDO1lBQ0gsbUJBQW1CO1lBQ25CLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25ELEdBQUcsQ0FBQyxPQUFPLENBQUMsa0NBQWtDLFNBQVMsUUFBUSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ3hFLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFBQyxPQUFPLENBQVUsRUFBRSxDQUFDO1lBQ3BCLEdBQUcsQ0FBQyxLQUFLLENBQUMsbUNBQW1DLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXlCRztJQUNnQixLQUFLLENBQUMsVUFBVTtRQUNqQyxLQUFLLFVBQVUsa0JBQWtCO1lBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNsQyxNQUFNLElBQUksYUFBYSxDQUFDLHlDQUF5QyxDQUFDLENBQUM7WUFDckUsQ0FBQztZQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUF5QixDQUFDO1lBRS9DLElBQUksQ0FBQztnQkFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxhQUFhO29CQUNuQyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBRXhDLE9BQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDakMsSUFBSSxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQ2hFLENBQUM7WUFDSixDQUFDO1lBQUMsT0FBTyxDQUFVLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxJQUFJLGFBQWEsQ0FBQyxDQUFVLENBQUMsQ0FBQztZQUN0QyxDQUFDO1FBQ0gsQ0FBQztRQUVELGtCQUFrQjthQUNmLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDVixJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ1QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUM7YUFDRCxLQUFLLENBQUMsQ0FBQyxDQUFVLEVBQUUsRUFBRTtZQUNwQixNQUFNLElBQUksYUFBYSxDQUNyQixpREFBaUQsQ0FBQyxFQUFFLENBQ3JELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU87UUFDWixzQkFBc0I7UUFDdEIsRUFBRTtRQUNGLG9EQUFvRDtRQUNwRCx3Q0FBd0M7UUFDeEMsSUFBSTtJQUNOLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpc3BhdGNoLCBFdmVudElkcyB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciwgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgRGF0YVNvdXJjZU9wdGlvbnMgfSBmcm9tIFwidHlwZW9ybS9kYXRhLXNvdXJjZS9EYXRhU291cmNlT3B0aW9uc1wiO1xuaW1wb3J0IHsgVHlwZU9STUFkYXB0ZXIgfSBmcm9tIFwiLi9UeXBlT1JNQWRhcHRlclwiO1xuaW1wb3J0IHsgVHlwZU9STUV2ZW50U3Vic2NyaWJlciB9IGZyb20gXCIuL1R5cGVPUk1FdmVudFN1YnNjcmliZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGlzcGF0Y2hlciBmb3IgVHlwZU9STS1kcml2ZW4gY2hhbmdlIGV2ZW50cy5cbiAqIEBzdW1tYXJ5IFN1YnNjcmliZXMgYSBUeXBlT1JNIERhdGFTb3VyY2Ugd2l0aCBhIGN1c3RvbSBFbnRpdHlTdWJzY3JpYmVyIHRvIG5vdGlmeSBvYnNlcnZlcnMgd2hlbiByZWNvcmRzIGFyZSBjcmVhdGVkLCB1cGRhdGVkLCBvciBkZWxldGVkLlxuICogQHBhcmFtIHtudW1iZXJ9IFt0aW1lb3V0PTUwMDBdIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBpbml0aWFsaXphdGlvbiByZXRyaWVzLlxuICogQGNsYXNzIFR5cGVPUk1EaXNwYXRjaFxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIGRpc3BhdGNoZXIgZm9yIGEgVHlwZU9STSBEYXRhU291cmNlXG4gKiBjb25zdCBkaXNwYXRjaCA9IG5ldyBUeXBlT1JNRGlzcGF0Y2goKTtcbiAqIGF3YWl0IGRpc3BhdGNoLm9ic2VydmUoYWRhcHRlciwgYWRhcHRlci5kYXRhU291cmNlLm9wdGlvbnMpO1xuICpcbiAqIC8vIFRoZSBkaXNwYXRjaGVyIHJlZ2lzdGVycyBhIFR5cGVPUk1FdmVudFN1YnNjcmliZXIgYW5kIG5vdGlmaWVzIG9ic2VydmVycyB3aGVuIGVudGl0aWVzIGNoYW5nZS5cbiAqIEBtZXJtYWlkXG4gKiBjbGFzc0RpYWdyYW1cbiAqICAgY2xhc3MgRGlzcGF0Y2gge1xuICogICAgICtpbml0aWFsaXplKClcbiAqICAgICArdXBkYXRlT2JzZXJ2ZXJzKClcbiAqICAgfVxuICogICBjbGFzcyBUeXBlT1JNRGlzcGF0Y2gge1xuICogICAgIC1vYnNlcnZlckxhc3RVcGRhdGU/OiBzdHJpbmdcbiAqICAgICAtYXR0ZW1wdENvdW50ZXI6IG51bWJlclxuICogICAgIC10aW1lb3V0OiBudW1iZXJcbiAqICAgICArY29uc3RydWN0b3IodGltZW91dClcbiAqICAgICAjbm90aWZpY2F0aW9uSGFuZGxlcigpXG4gKiAgICAgI2luaXRpYWxpemUoKVxuICogICB9XG4gKiAgIERpc3BhdGNoIDx8LS0gVHlwZU9STURpc3BhdGNoXG4gKi9cbmV4cG9ydCBjbGFzcyBUeXBlT1JNRGlzcGF0Y2ggZXh0ZW5kcyBEaXNwYXRjaDxEYXRhU291cmNlT3B0aW9ucz4ge1xuICBwcml2YXRlIG9ic2VydmVyTGFzdFVwZGF0ZT86IHN0cmluZztcbiAgcHJpdmF0ZSBhdHRlbXB0Q291bnRlcjogbnVtYmVyID0gMDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRpbWVvdXQgPSA1MDAwKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIFR5cGVPUk0gbm90aWZpY2F0aW9uIGV2ZW50cy5cbiAgICogQHN1bW1hcnkgSGFuZGxlcyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyAodHJhbnNsYXRlZCBmcm9tIFR5cGVPUk0gZXZlbnRzKSBhbmQgbm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IHJlY29yZCBjaGFuZ2VzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGUgVGhlIG5vdGlmaWNhdGlvbiBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge09wZXJhdGlvbktleXN9IG9wZXJhdGlvbiBUaGUgbm90aWZpY2F0aW9uIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7RXZlbnRJZHN9IGlkcyBUaGUgbm90aWZpY2F0aW9uIHBheWxvYWQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG5vdGlmaWNhdGlvbnMgaGF2ZSBiZWVuIHByb2Nlc3NlZC5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBQb3N0Z3JlU1FMRGlzcGF0Y2hcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExvZ2dlclxuICAgKiAgIHBhcnRpY2lwYW50IE8gYXMgT2JzZXJ2ZXJzXG4gICAqICAgTm90ZSBvdmVyIEQ6IFJlY2VpdmUgbm90aWZpY2F0aW9uIGZyb20gUG9zdGdyZVNRTFxuICAgKiAgIEQtPj5EOiBQYXJzZSBub3RpZmljYXRpb24gcGF5bG9hZFxuICAgKiAgIEQtPj5EOiBFeHRyYWN0IHRhYmxlLCBvcGVyYXRpb24sIGFuZCBpZHNcbiAgICogICBELT4+TzogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBvcGVyYXRpb24sIGlkcylcbiAgICogICBELT4+RDogVXBkYXRlIG9ic2VydmVyTGFzdFVwZGF0ZVxuICAgKiAgIEQtPj5MOiBMb2cgc3VjY2Vzc2Z1bCBkaXNwYXRjaFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIG5vdGlmaWNhdGlvbkhhbmRsZXIoXG4gICAgdGFibGU6IHN0cmluZyxcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgaWRzOiBFdmVudElkc1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5ub3RpZmljYXRpb25IYW5kbGVyKTtcbiAgICB0cnkge1xuICAgICAgLy8gTm90aWZ5IG9ic2VydmVyc1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVPYnNlcnZlcnModGFibGUsIG9wZXJhdGlvbiwgaWRzKTtcbiAgICAgIHRoaXMub2JzZXJ2ZXJMYXN0VXBkYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgbG9nLnZlcmJvc2UoYE9ic2VydmVyIHJlZnJlc2ggZGlzcGF0Y2hlZCBieSAke29wZXJhdGlvbn0gZm9yICR7dGFibGV9YCk7XG4gICAgICBsb2cuZGVidWcoYHBrczogJHtpZHN9YCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyBub3RpZmljYXRpb246ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSBkaXNwYXRjaGVyIGFuZCBzdWJzY3JpYmVzIHRvIFR5cGVPUk0gbm90aWZpY2F0aW9ucy5cbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIHRoZSBUeXBlT1JNRXZlbnRTdWJzY3JpYmVyIG9uIHRoZSBEYXRhU291cmNlIGFuZCBsb2dzIHRoZSBzdWJzY3JpcHRpb24gbGlmZWN5Y2xlLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBzdWJzY3JpcHRpb24gaXMgZXN0YWJsaXNoZWQuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgVHlwZU9STURpc3BhdGNoXG4gICAqICAgcGFydGljaXBhbnQgUyBhcyBzdWJzY3JpYmVUb1R5cGVPUk1cbiAgICogICBwYXJ0aWNpcGFudCBEUyBhcyBUeXBlT1JNIERhdGFTb3VyY2VcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExvZ2dlclxuICAgKiAgIEQtPj5TOiBDYWxsIHN1YnNjcmliZVRvVHlwZU9STVxuICAgKiAgIFMtPj5TOiBDaGVjayBhZGFwdGVyIGFuZCBuYXRpdmVcbiAgICogICBhbHQgTm8gYWRhcHRlciBvciBuYXRpdmVcbiAgICogICAgIFMtLT4+UzogdGhyb3cgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFMtPj5EUzogaW5pdGlhbGl6ZSgpXG4gICAqICAgUy0+PkRTOiBzdWJzY3JpYmVycy5wdXNoKFR5cGVPUk1FdmVudFN1YnNjcmliZXIpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIERTLS0+PlM6IFN1YnNjcmlwdGlvbiBlc3RhYmxpc2hlZFxuICAgKiAgICAgUy0tPj5EOiBQcm9taXNlIHJlc29sdmVzXG4gICAqICAgICBELT4+TDogTG9nIHN1Y2Nlc3NmdWwgc3Vic2NyaXB0aW9uXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgRFMtLT4+UzogRXJyb3JcbiAgICogICAgIFMtLT4+RDogUHJvbWlzZSByZWplY3RzXG4gICAqICAgZW5kXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3luYyBmdW5jdGlvbiBzdWJzY3JpYmVUb1R5cGVPUk0odGhpczogVHlwZU9STURpc3BhdGNoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBpZiAoIXRoaXMuYWRhcHRlciB8fCAhdGhpcy5uYXRpdmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYE5vIGFkYXB0ZXIvbmF0aXZlIG9ic2VydmVkIGZvciBkaXNwYXRjaGApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyO1xuXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWFkYXB0ZXIuZGF0YVNvdXJjZS5pc0luaXRpYWxpemVkKVxuICAgICAgICAgIGF3YWl0IGFkYXB0ZXIuZGF0YVNvdXJjZS5pbml0aWFsaXplKCk7XG5cbiAgICAgICAgYWRhcHRlci5kYXRhU291cmNlLnN1YnNjcmliZXJzLnB1c2goXG4gICAgICAgICAgbmV3IFR5cGVPUk1FdmVudFN1YnNjcmliZXIodGhpcy5ub3RpZmljYXRpb25IYW5kbGVyLmJpbmQodGhpcykpXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGUgYXMgRXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN1YnNjcmliZVRvVHlwZU9STVxuICAgICAgLmNhbGwodGhpcylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3Vic2NyaWJlZCB0byBUeXBlT1JNIG5vdGlmaWNhdGlvbnNgKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGU6IHVua25vd24pID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBzdWJzY3JpYmUgdG8gVHlwZU9STSBub3RpZmljYXRpb25zOiAke2V9YFxuICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW51cCBtZXRob2QgdG8gcmVsZWFzZSByZXNvdXJjZXMgd2hlbiB0aGUgZGlzcGF0Y2hlciBpcyBubyBsb25nZXIgbmVlZGVkXG4gICAqL1xuICBwdWJsaWMgY2xlYW51cCgpOiB2b2lkIHtcbiAgICAvLyBpZiAodGhpcy5hZGFwdGVyKSB7XG4gICAgLy9cbiAgICAvLyAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFkYXB0ZXIgYXMgVHlwZU9STUFkYXB0ZXI7XG4gICAgLy8gICBhd2FpdCBhZGFwdGVyLmRhdGFTb3VyY2UuZGVzdHJveSgpO1xuICAgIC8vIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { EntitySubscriberInterface, InsertEvent, RemoveEvent, UpdateEvent } from "typeorm";
|
|
2
|
+
import { EventIds } from "@decaf-ts/core";
|
|
3
|
+
import { OperationKeys } from "@decaf-ts/db-decorators";
|
|
4
|
+
/**
|
|
5
|
+
* @description TypeORM event subscriber that forwards entity lifecycle events to the adapter.
|
|
6
|
+
* @summary Listens for insert, update, and remove events emitted by TypeORM and notifies the Decaf.ts adapter so that observers can be updated accordingly.
|
|
7
|
+
* @param {TypeORMAdapter} adapter The TypeORM adapter used to propagate events and look up metadata.
|
|
8
|
+
* @class
|
|
9
|
+
* @example
|
|
10
|
+
* // Registering the subscriber when creating a DataSource
|
|
11
|
+
* // dataSourceOptions.subscribers = [new TypeORMEventSubscriber(adapter)];
|
|
12
|
+
*
|
|
13
|
+
* @mermaid
|
|
14
|
+
* sequenceDiagram
|
|
15
|
+
* participant TypeORM
|
|
16
|
+
* participant Subscriber as TypeORMEventSubscriber
|
|
17
|
+
* participant Adapter as TypeORMAdapter
|
|
18
|
+
* participant Observers
|
|
19
|
+
*
|
|
20
|
+
* TypeORM->>Subscriber: afterInsert(entity)
|
|
21
|
+
* Subscriber->>Adapter: updateObservers(table, CREATE, [id])
|
|
22
|
+
* Adapter->>Observers: notify(table, CREATE, [id])
|
|
23
|
+
*
|
|
24
|
+
* TypeORM->>Subscriber: afterUpdate(event)
|
|
25
|
+
* Subscriber->>Adapter: updateObservers(table, UPDATE, [id])
|
|
26
|
+
* Adapter->>Observers: notify(table, UPDATE, [id])
|
|
27
|
+
*
|
|
28
|
+
* TypeORM->>Subscriber: afterRemove(event)
|
|
29
|
+
* Subscriber->>Adapter: updateObservers(table, DELETE, [id])
|
|
30
|
+
* Adapter->>Observers: notify(table, DELETE, [id])
|
|
31
|
+
*/
|
|
32
|
+
export declare class TypeORMEventSubscriber implements EntitySubscriberInterface {
|
|
33
|
+
protected readonly handler: (tableName: string, operation: OperationKeys, ids: EventIds) => void;
|
|
34
|
+
constructor(handler: (tableName: string, operation: OperationKeys, ids: EventIds) => void);
|
|
35
|
+
/**
|
|
36
|
+
* @description Handles post-insert events.
|
|
37
|
+
* @summary Notifies observers about a create operation for the inserted entity.
|
|
38
|
+
* @param {InsertEvent<any>} event The TypeORM insert event.
|
|
39
|
+
* @return {Promise<any>|void} A promise when async or void otherwise.
|
|
40
|
+
*/
|
|
41
|
+
afterInsert(event: InsertEvent<any>): Promise<any> | void;
|
|
42
|
+
/**
|
|
43
|
+
* @description Handles post-remove events.
|
|
44
|
+
* @summary Notifies observers about a delete operation for the removed entity.
|
|
45
|
+
* @param {RemoveEvent<any>} event The TypeORM remove event.
|
|
46
|
+
* @return {Promise<any>|void} A promise when async or void otherwise.
|
|
47
|
+
*/
|
|
48
|
+
afterRemove(event: RemoveEvent<any>): Promise<any> | void;
|
|
49
|
+
/**
|
|
50
|
+
* @description Handles post-update events.
|
|
51
|
+
* @summary Notifies observers about an update operation for the modified entity.
|
|
52
|
+
* @param {UpdateEvent<any>} event The TypeORM update event.
|
|
53
|
+
* @return {Promise<any>|void} A promise when async or void otherwise.
|
|
54
|
+
*/
|
|
55
|
+
afterUpdate(event: UpdateEvent<any>): Promise<any> | void;
|
|
56
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { EventSubscriber, } from "typeorm";
|
|
11
|
+
import { Repository } from "@decaf-ts/core";
|
|
12
|
+
import { InternalError, OperationKeys } from "@decaf-ts/db-decorators";
|
|
13
|
+
import { Model } from "@decaf-ts/decorator-validation";
|
|
14
|
+
/**
|
|
15
|
+
* @description TypeORM event subscriber that forwards entity lifecycle events to the adapter.
|
|
16
|
+
* @summary Listens for insert, update, and remove events emitted by TypeORM and notifies the Decaf.ts adapter so that observers can be updated accordingly.
|
|
17
|
+
* @param {TypeORMAdapter} adapter The TypeORM adapter used to propagate events and look up metadata.
|
|
18
|
+
* @class
|
|
19
|
+
* @example
|
|
20
|
+
* // Registering the subscriber when creating a DataSource
|
|
21
|
+
* // dataSourceOptions.subscribers = [new TypeORMEventSubscriber(adapter)];
|
|
22
|
+
*
|
|
23
|
+
* @mermaid
|
|
24
|
+
* sequenceDiagram
|
|
25
|
+
* participant TypeORM
|
|
26
|
+
* participant Subscriber as TypeORMEventSubscriber
|
|
27
|
+
* participant Adapter as TypeORMAdapter
|
|
28
|
+
* participant Observers
|
|
29
|
+
*
|
|
30
|
+
* TypeORM->>Subscriber: afterInsert(entity)
|
|
31
|
+
* Subscriber->>Adapter: updateObservers(table, CREATE, [id])
|
|
32
|
+
* Adapter->>Observers: notify(table, CREATE, [id])
|
|
33
|
+
*
|
|
34
|
+
* TypeORM->>Subscriber: afterUpdate(event)
|
|
35
|
+
* Subscriber->>Adapter: updateObservers(table, UPDATE, [id])
|
|
36
|
+
* Adapter->>Observers: notify(table, UPDATE, [id])
|
|
37
|
+
*
|
|
38
|
+
* TypeORM->>Subscriber: afterRemove(event)
|
|
39
|
+
* Subscriber->>Adapter: updateObservers(table, DELETE, [id])
|
|
40
|
+
* Adapter->>Observers: notify(table, DELETE, [id])
|
|
41
|
+
*/
|
|
42
|
+
let TypeORMEventSubscriber = class TypeORMEventSubscriber {
|
|
43
|
+
constructor(handler) {
|
|
44
|
+
this.handler = handler;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* @description Handles post-insert events.
|
|
48
|
+
* @summary Notifies observers about a create operation for the inserted entity.
|
|
49
|
+
* @param {InsertEvent<any>} event The TypeORM insert event.
|
|
50
|
+
* @return {Promise<any>|void} A promise when async or void otherwise.
|
|
51
|
+
*/
|
|
52
|
+
afterInsert(event) {
|
|
53
|
+
const constructor = Model.get(event.entity.constructor.name);
|
|
54
|
+
if (!constructor)
|
|
55
|
+
throw new InternalError(`No registered model found for ${event.entity.constructor.name}`);
|
|
56
|
+
const tableName = Repository.table(constructor);
|
|
57
|
+
this.handler(tableName, OperationKeys.CREATE, [event.entityId]);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* @description Handles post-remove events.
|
|
61
|
+
* @summary Notifies observers about a delete operation for the removed entity.
|
|
62
|
+
* @param {RemoveEvent<any>} event The TypeORM remove event.
|
|
63
|
+
* @return {Promise<any>|void} A promise when async or void otherwise.
|
|
64
|
+
*/
|
|
65
|
+
afterRemove(event) {
|
|
66
|
+
const constructor = Model.get(event.entity.constructor.name);
|
|
67
|
+
if (!constructor)
|
|
68
|
+
throw new InternalError(`No registered model found for ${event.entity.constructor.name}`);
|
|
69
|
+
const tableName = Repository.table(constructor);
|
|
70
|
+
this.handler(tableName, OperationKeys.DELETE, [event.entityId]);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* @description Handles post-update events.
|
|
74
|
+
* @summary Notifies observers about an update operation for the modified entity.
|
|
75
|
+
* @param {UpdateEvent<any>} event The TypeORM update event.
|
|
76
|
+
* @return {Promise<any>|void} A promise when async or void otherwise.
|
|
77
|
+
*/
|
|
78
|
+
afterUpdate(event) {
|
|
79
|
+
const constructor = Model.get(event.databaseEntity.constructor.name);
|
|
80
|
+
if (!constructor)
|
|
81
|
+
throw new InternalError(`No registered model found for ${event.databaseEntity.constructor.name}`);
|
|
82
|
+
const tableName = Repository.table(constructor);
|
|
83
|
+
return this.handler(tableName, OperationKeys.UPDATE, [
|
|
84
|
+
event.entity["id"],
|
|
85
|
+
]);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
TypeORMEventSubscriber = __decorate([
|
|
89
|
+
EventSubscriber(),
|
|
90
|
+
__metadata("design:paramtypes", [Function])
|
|
91
|
+
], TypeORMEventSubscriber);
|
|
92
|
+
export { TypeORMEventSubscriber };
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHlwZU9STUV2ZW50U3Vic2NyaWJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9UeXBlT1JNRXZlbnRTdWJzY3JpYmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFFTCxlQUFlLEdBSWhCLE1BQU0sU0FBUyxDQUFDO0FBQ2pCLE9BQU8sRUFBWSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV2RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBRUksSUFBTSxzQkFBc0IsR0FBNUIsTUFBTSxzQkFBc0I7SUFDakMsWUFDcUIsT0FJVjtRQUpVLFlBQU8sR0FBUCxPQUFPLENBSWpCO0lBQ1IsQ0FBQztJQUVKOzs7OztPQUtHO0lBQ0gsV0FBVyxDQUFDLEtBQXVCO1FBQ2pDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLFdBQVc7WUFDZCxNQUFNLElBQUksYUFBYSxDQUNyQixpQ0FBaUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQ2pFLENBQUM7UUFDSixNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWhELElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBZSxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxXQUFXLENBQUMsS0FBdUI7UUFDakMsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsV0FBVztZQUNkLE1BQU0sSUFBSSxhQUFhLENBQ3JCLGlDQUFpQyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FDakUsQ0FBQztRQUNKLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFaEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFdBQVcsQ0FBQyxLQUF1QjtRQUNqQyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxXQUFXO1lBQ2QsTUFBTSxJQUFJLGFBQWEsQ0FDckIsaUNBQWlDLEtBQUssQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUN6RSxDQUFDO1FBQ0osTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVoRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxNQUFNLEVBQUU7WUFDbEQsS0FBSyxDQUFDLE1BQWMsQ0FBQyxJQUFJLENBQVE7U0FDbkMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGLENBQUE7QUE3RFksc0JBQXNCO0lBRGxDLGVBQWUsRUFBRTs7R0FDTCxzQkFBc0IsQ0E2RGxDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRW50aXR5U3Vic2NyaWJlckludGVyZmFjZSxcbiAgRXZlbnRTdWJzY3JpYmVyLFxuICBJbnNlcnRFdmVudCxcbiAgUmVtb3ZlRXZlbnQsXG4gIFVwZGF0ZUV2ZW50LFxufSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHsgRXZlbnRJZHMsIFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlT1JNIGV2ZW50IHN1YnNjcmliZXIgdGhhdCBmb3J3YXJkcyBlbnRpdHkgbGlmZWN5Y2xlIGV2ZW50cyB0byB0aGUgYWRhcHRlci5cbiAqIEBzdW1tYXJ5IExpc3RlbnMgZm9yIGluc2VydCwgdXBkYXRlLCBhbmQgcmVtb3ZlIGV2ZW50cyBlbWl0dGVkIGJ5IFR5cGVPUk0gYW5kIG5vdGlmaWVzIHRoZSBEZWNhZi50cyBhZGFwdGVyIHNvIHRoYXQgb2JzZXJ2ZXJzIGNhbiBiZSB1cGRhdGVkIGFjY29yZGluZ2x5LlxuICogQHBhcmFtIHtUeXBlT1JNQWRhcHRlcn0gYWRhcHRlciBUaGUgVHlwZU9STSBhZGFwdGVyIHVzZWQgdG8gcHJvcGFnYXRlIGV2ZW50cyBhbmQgbG9vayB1cCBtZXRhZGF0YS5cbiAqIEBjbGFzc1xuICogQGV4YW1wbGVcbiAqIC8vIFJlZ2lzdGVyaW5nIHRoZSBzdWJzY3JpYmVyIHdoZW4gY3JlYXRpbmcgYSBEYXRhU291cmNlXG4gKiAvLyBkYXRhU291cmNlT3B0aW9ucy5zdWJzY3JpYmVycyA9IFtuZXcgVHlwZU9STUV2ZW50U3Vic2NyaWJlcihhZGFwdGVyKV07XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBUeXBlT1JNXG4gKiAgIHBhcnRpY2lwYW50IFN1YnNjcmliZXIgYXMgVHlwZU9STUV2ZW50U3Vic2NyaWJlclxuICogICBwYXJ0aWNpcGFudCBBZGFwdGVyIGFzIFR5cGVPUk1BZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IE9ic2VydmVyc1xuICpcbiAqICAgVHlwZU9STS0+PlN1YnNjcmliZXI6IGFmdGVySW5zZXJ0KGVudGl0eSlcbiAqICAgU3Vic2NyaWJlci0+PkFkYXB0ZXI6IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgQ1JFQVRFLCBbaWRdKVxuICogICBBZGFwdGVyLT4+T2JzZXJ2ZXJzOiBub3RpZnkodGFibGUsIENSRUFURSwgW2lkXSlcbiAqXG4gKiAgIFR5cGVPUk0tPj5TdWJzY3JpYmVyOiBhZnRlclVwZGF0ZShldmVudClcbiAqICAgU3Vic2NyaWJlci0+PkFkYXB0ZXI6IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgVVBEQVRFLCBbaWRdKVxuICogICBBZGFwdGVyLT4+T2JzZXJ2ZXJzOiBub3RpZnkodGFibGUsIFVQREFURSwgW2lkXSlcbiAqXG4gKiAgIFR5cGVPUk0tPj5TdWJzY3JpYmVyOiBhZnRlclJlbW92ZShldmVudClcbiAqICAgU3Vic2NyaWJlci0+PkFkYXB0ZXI6IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgREVMRVRFLCBbaWRdKVxuICogICBBZGFwdGVyLT4+T2JzZXJ2ZXJzOiBub3RpZnkodGFibGUsIERFTEVURSwgW2lkXSlcbiAqL1xuQEV2ZW50U3Vic2NyaWJlcigpXG5leHBvcnQgY2xhc3MgVHlwZU9STUV2ZW50U3Vic2NyaWJlciBpbXBsZW1lbnRzIEVudGl0eVN1YnNjcmliZXJJbnRlcmZhY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGFuZGxlcjogKFxuICAgICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXMsXG4gICAgICBpZHM6IEV2ZW50SWRzXG4gICAgKSA9PiB2b2lkXG4gICkge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcG9zdC1pbnNlcnQgZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYSBjcmVhdGUgb3BlcmF0aW9uIGZvciB0aGUgaW5zZXJ0ZWQgZW50aXR5LlxuICAgKiBAcGFyYW0ge0luc2VydEV2ZW50PGFueT59IGV2ZW50IFRoZSBUeXBlT1JNIGluc2VydCBldmVudC5cbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fHZvaWR9IEEgcHJvbWlzZSB3aGVuIGFzeW5jIG9yIHZvaWQgb3RoZXJ3aXNlLlxuICAgKi9cbiAgYWZ0ZXJJbnNlcnQoZXZlbnQ6IEluc2VydEV2ZW50PGFueT4pOiBQcm9taXNlPGFueT4gfCB2b2lkIHtcbiAgICBjb25zdCBjb25zdHJ1Y3RvciA9IE1vZGVsLmdldChldmVudC5lbnRpdHkuY29uc3RydWN0b3IubmFtZSk7XG4gICAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gcmVnaXN0ZXJlZCBtb2RlbCBmb3VuZCBmb3IgJHtldmVudC5lbnRpdHkuY29uc3RydWN0b3IubmFtZX1gXG4gICAgICApO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUoY29uc3RydWN0b3IpO1xuXG4gICAgdGhpcy5oYW5kbGVyKHRhYmxlTmFtZSwgT3BlcmF0aW9uS2V5cy5DUkVBVEUsIFtldmVudC5lbnRpdHlJZCBhcyBhbnldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBwb3N0LXJlbW92ZSBldmVudHMuXG4gICAqIEBzdW1tYXJ5IE5vdGlmaWVzIG9ic2VydmVycyBhYm91dCBhIGRlbGV0ZSBvcGVyYXRpb24gZm9yIHRoZSByZW1vdmVkIGVudGl0eS5cbiAgICogQHBhcmFtIHtSZW1vdmVFdmVudDxhbnk+fSBldmVudCBUaGUgVHlwZU9STSByZW1vdmUgZXZlbnQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pnx2b2lkfSBBIHByb21pc2Ugd2hlbiBhc3luYyBvciB2b2lkIG90aGVyd2lzZS5cbiAgICovXG4gIGFmdGVyUmVtb3ZlKGV2ZW50OiBSZW1vdmVFdmVudDxhbnk+KTogUHJvbWlzZTxhbnk+IHwgdm9pZCB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBNb2RlbC5nZXQoZXZlbnQuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIGlmICghY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYE5vIHJlZ2lzdGVyZWQgbW9kZWwgZm91bmQgZm9yICR7ZXZlbnQuZW50aXR5LmNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgKTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBSZXBvc2l0b3J5LnRhYmxlKGNvbnN0cnVjdG9yKTtcblxuICAgIHRoaXMuaGFuZGxlcih0YWJsZU5hbWUsIE9wZXJhdGlvbktleXMuREVMRVRFLCBbZXZlbnQuZW50aXR5SWQgYXMgYW55XSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgcG9zdC11cGRhdGUgZXZlbnRzLlxuICAgKiBAc3VtbWFyeSBOb3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgYW4gdXBkYXRlIG9wZXJhdGlvbiBmb3IgdGhlIG1vZGlmaWVkIGVudGl0eS5cbiAgICogQHBhcmFtIHtVcGRhdGVFdmVudDxhbnk+fSBldmVudCBUaGUgVHlwZU9STSB1cGRhdGUgZXZlbnQuXG4gICAqIEByZXR1cm4ge1Byb21pc2U8YW55Pnx2b2lkfSBBIHByb21pc2Ugd2hlbiBhc3luYyBvciB2b2lkIG90aGVyd2lzZS5cbiAgICovXG4gIGFmdGVyVXBkYXRlKGV2ZW50OiBVcGRhdGVFdmVudDxhbnk+KTogUHJvbWlzZTxhbnk+IHwgdm9pZCB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPSBNb2RlbC5nZXQoZXZlbnQuZGF0YWJhc2VFbnRpdHkuY29uc3RydWN0b3IubmFtZSk7XG4gICAgaWYgKCFjb25zdHJ1Y3RvcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgTm8gcmVnaXN0ZXJlZCBtb2RlbCBmb3VuZCBmb3IgJHtldmVudC5kYXRhYmFzZUVudGl0eS5jb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICk7XG4gICAgY29uc3QgdGFibGVOYW1lID0gUmVwb3NpdG9yeS50YWJsZShjb25zdHJ1Y3Rvcik7XG5cbiAgICByZXR1cm4gdGhpcy5oYW5kbGVyKHRhYmxlTmFtZSwgT3BlcmF0aW9uS2V5cy5VUERBVEUsIFtcbiAgICAgIChldmVudC5lbnRpdHkgYXMgYW55KVtcImlkXCJdIGFzIGFueSxcbiAgICBdKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { type Constructor, Model } from "@decaf-ts/decorator-validation";
|
|
2
|
+
import { Repository } from "@decaf-ts/core";
|
|
3
|
+
import { Context } from "@decaf-ts/db-decorators";
|
|
4
|
+
import { TypeORMFlags, TypeORMQuery } from "./types";
|
|
5
|
+
import { TypeORMAdapter } from "./TypeORMAdapter";
|
|
6
|
+
/**
|
|
7
|
+
* @description Repository implementation backed by TypeORM.
|
|
8
|
+
* @summary Provides CRUD operations for a given Model using the {@link TypeORMAdapter}, including bulk operations and query builder access while preserving Decaf.ts repository semantics.
|
|
9
|
+
* @template M Type extending Model that this repository will manage.
|
|
10
|
+
* @param {TypeORMAdapter} adapter The adapter used to execute persistence operations.
|
|
11
|
+
* @param {Constructor<M>} model The Model constructor associated with this repository.
|
|
12
|
+
* @param {...any[]} args Optional arguments forwarded to the base Repository.
|
|
13
|
+
* @class TypeORMRepository
|
|
14
|
+
* @example
|
|
15
|
+
* // Creating a repository
|
|
16
|
+
* const repo = new TypeORMRepository<User>(adapter, User);
|
|
17
|
+
* const created = await repo.create(new User({ name: "Alice" }));
|
|
18
|
+
* const read = await repo.read(created.id);
|
|
19
|
+
*
|
|
20
|
+
* // Bulk create
|
|
21
|
+
* await repo.createAll([new User({ name: "A" }), new User({ name: "B" })]);
|
|
22
|
+
*
|
|
23
|
+
* // Using the query builder
|
|
24
|
+
* const qb = repo.queryBuilder();
|
|
25
|
+
* const rows = await qb.where("name = :name", { name: "Alice" }).getMany();
|
|
26
|
+
*
|
|
27
|
+
* @mermaid
|
|
28
|
+
* sequenceDiagram
|
|
29
|
+
* participant App
|
|
30
|
+
* participant Repo as TypeORMRepository
|
|
31
|
+
* participant Adapter as TypeORMAdapter
|
|
32
|
+
* participant DB as TypeORM/DataSource
|
|
33
|
+
*
|
|
34
|
+
* App->>Repo: create(model)
|
|
35
|
+
* Repo->>Adapter: prepare(model, pk)
|
|
36
|
+
* Adapter-->>Repo: { record, id, transient }
|
|
37
|
+
* Repo->>Adapter: create(table, id, model, ...args)
|
|
38
|
+
* Adapter->>DB: INSERT ...
|
|
39
|
+
* DB-->>Adapter: row
|
|
40
|
+
* Adapter-->>Repo: row
|
|
41
|
+
* Repo->>Adapter: revert(row, clazz, pk, id)
|
|
42
|
+
* Adapter-->>Repo: model
|
|
43
|
+
* Repo-->>App: model
|
|
44
|
+
*/
|
|
45
|
+
export declare class TypeORMRepository<M extends Model> extends Repository<M, TypeORMQuery<M, any>, TypeORMAdapter, TypeORMFlags, Context<TypeORMFlags>> {
|
|
46
|
+
constructor(adapter: TypeORMAdapter, model: Constructor<M>, ...args: any[]);
|
|
47
|
+
/**
|
|
48
|
+
* @description Creates a TypeORM query builder for the repository entity.
|
|
49
|
+
* @summary Returns a SelectQueryBuilder bound to this repository's entity for advanced querying.
|
|
50
|
+
* @return {import("typeorm").SelectQueryBuilder<any>} A TypeORM SelectQueryBuilder instance.
|
|
51
|
+
*/
|
|
52
|
+
queryBuilder(): import("typeorm").SelectQueryBuilder<import("typeorm").ObjectLiteral>;
|
|
53
|
+
/**
|
|
54
|
+
* @description Creates and persists a model instance.
|
|
55
|
+
* @summary Prepares the model, delegates insertion to the adapter, and rehydrates the persisted state back into a Model instance.
|
|
56
|
+
* @param {M} model The model to create.
|
|
57
|
+
* @param {...any[]} args Optional arguments/context.
|
|
58
|
+
* @return {Promise<M>} The created model instance.
|
|
59
|
+
*/
|
|
60
|
+
create(model: M, ...args: any[]): Promise<M>;
|
|
61
|
+
/**
|
|
62
|
+
* @description Reads a model from the database by ID.
|
|
63
|
+
* @summary Retrieves a model instance from the database using its primary key.
|
|
64
|
+
* @param {string|number|bigint} id - The primary key of the model to read.
|
|
65
|
+
* @param {...any[]} args - Additional arguments.
|
|
66
|
+
* @return {Promise<M>} The retrieved model instance.
|
|
67
|
+
*/
|
|
68
|
+
read(id: string | number | bigint, ...args: any[]): Promise<M>;
|
|
69
|
+
/**
|
|
70
|
+
* @description Updates and persists a model instance.
|
|
71
|
+
* @summary Prepares the model, delegates update to the adapter, and rehydrates the persisted state back into a Model instance.
|
|
72
|
+
* @param {M} model The model to update.
|
|
73
|
+
* @param {...any[]} args Optional arguments/context.
|
|
74
|
+
* @return {Promise<M>} The updated model instance.
|
|
75
|
+
*/
|
|
76
|
+
update(model: M, ...args: any[]): Promise<M>;
|
|
77
|
+
/**
|
|
78
|
+
* @description Deletes a model from the database by ID.
|
|
79
|
+
* @summary Removes a model instance from the database using its primary key.
|
|
80
|
+
* @param {string|number|bigint} id - The primary key of the model to delete.
|
|
81
|
+
* @param {...any[]} args - Additional arguments.
|
|
82
|
+
* @return {Promise<M>} The deleted model instance.
|
|
83
|
+
*/
|
|
84
|
+
delete(id: string | number | bigint, ...args: any[]): Promise<M>;
|
|
85
|
+
/**
|
|
86
|
+
* @description Validates and prepares models for bulk creation.
|
|
87
|
+
* @summary Applies decorator-based validations and returns transformed models with context args for createAll.
|
|
88
|
+
* @param {M[]} models The models to be created.
|
|
89
|
+
* @param {...any[]} args Optional arguments/context.
|
|
90
|
+
* @return {Promise<[M[], ...any[]]>} The prepared models and forwarded args tuple.
|
|
91
|
+
*/
|
|
92
|
+
protected createAllPrefix(models: M[], ...args: any[]): Promise<any[]>;
|
|
93
|
+
/**
|
|
94
|
+
* @description Creates multiple models at once.
|
|
95
|
+
* @summary Prepares, persists, and rehydrates a batch of models.
|
|
96
|
+
* @param {M[]} models The models to create.
|
|
97
|
+
* @param {...any[]} args Optional arguments/context.
|
|
98
|
+
* @return {Promise<M[]>} The created models.
|
|
99
|
+
*/
|
|
100
|
+
createAll(models: M[], ...args: any[]): Promise<M[]>;
|
|
101
|
+
/**
|
|
102
|
+
* @description Reads multiple models by their primary keys.
|
|
103
|
+
* @summary Retrieves a list of models corresponding to the provided keys.
|
|
104
|
+
* @param {(string[]|number[])} keys The primary keys to read.
|
|
105
|
+
* @param {...any[]} args Optional arguments/context.
|
|
106
|
+
* @return {Promise<M[]>} The retrieved models.
|
|
107
|
+
*/
|
|
108
|
+
readAll(keys: string[] | number[], ...args: any[]): Promise<M[]>;
|
|
109
|
+
/**
|
|
110
|
+
* @description Updates multiple models at once.
|
|
111
|
+
* @summary Persists a batch of model updates and returns their rehydrated instances.
|
|
112
|
+
* @param {M[]} models The models to update.
|
|
113
|
+
* @param {...any[]} args Optional arguments/context.
|
|
114
|
+
* @return {Promise<M[]>} The updated models.
|
|
115
|
+
*/
|
|
116
|
+
updateAll(models: M[], ...args: any[]): Promise<M[]>;
|
|
117
|
+
/**
|
|
118
|
+
* @description Deletes multiple models at once.
|
|
119
|
+
* @summary Removes a list of models by their primary keys and returns their last persisted states.
|
|
120
|
+
* @param {(string[]|number[])} keys The primary keys to delete.
|
|
121
|
+
* @param {...any[]} args Optional arguments/context.
|
|
122
|
+
* @return {Promise<M[]>} The deleted models.
|
|
123
|
+
*/
|
|
124
|
+
deleteAll(keys: string[] | number[], ...args: any[]): Promise<M[]>;
|
|
125
|
+
}
|