@zakodium/adonis-mongodb 0.16.0 → 0.18.0
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/lib/adonis-typings/database.d.ts +9 -2
- package/lib/adonis-typings/decorators.d.ts +12 -0
- package/lib/adonis-typings/odm.d.ts +35 -0
- package/lib/src/Database/Connection.d.ts +2 -2
- package/lib/src/Database/Connection.js +3 -3
- package/lib/src/Database/Database.d.ts +2 -0
- package/lib/src/Database/Database.js +5 -1
- package/lib/src/Model/Model.d.ts +22 -1
- package/lib/src/Model/Model.js +63 -2
- package/lib/src/Model/proxyHandler.js +8 -5
- package/lib/src/Odm/decorators.d.ts +6 -1
- package/lib/src/Odm/decorators.js +15 -2
- package/package.json +1 -1
- package/src/Database/Connection.ts +10 -2
- package/src/Database/Database.ts +10 -0
- package/src/Model/Model.ts +81 -1
- package/src/Model/proxyHandler.ts +10 -3
- package/src/Odm/decorators.ts +16 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
declare module '@ioc:Zakodium/Mongodb/Database' {
|
|
3
3
|
import { EventEmitter } from 'node:events';
|
|
4
|
-
import { MongoClientOptions, Collection, Db, ClientSession, MongoClient, Document } from 'mongodb';
|
|
4
|
+
import { TransactionOptions, MongoClientOptions, Collection, Db, ClientSession, MongoClient, Document } from 'mongodb';
|
|
5
5
|
/**
|
|
6
6
|
* Shape of the configuration in `config/mongodb.ts`.
|
|
7
7
|
*/
|
|
@@ -34,6 +34,13 @@ declare module '@ioc:Zakodium/Mongodb/Database' {
|
|
|
34
34
|
* Connection manager.
|
|
35
35
|
*/
|
|
36
36
|
manager: ConnectionManagerContract;
|
|
37
|
+
/**
|
|
38
|
+
* Shortcut to `Database.connection().transaction()`
|
|
39
|
+
*
|
|
40
|
+
* @param handler
|
|
41
|
+
* @param options
|
|
42
|
+
*/
|
|
43
|
+
transaction<TResult>(handler: (client: ClientSession, db: Db) => Promise<TResult>, options?: TransactionOptions): Promise<TResult>;
|
|
37
44
|
}
|
|
38
45
|
/**
|
|
39
46
|
* Connection manager to manage database connections.
|
|
@@ -110,7 +117,7 @@ declare module '@ioc:Zakodium/Mongodb/Database' {
|
|
|
110
117
|
on(event: 'disconnect:error', callback: (error: Error, connection: ConnectionContract) => void): this;
|
|
111
118
|
database(): Promise<Db>;
|
|
112
119
|
collection<TSchema extends Document>(collectionName: string): Promise<Collection<TSchema>>;
|
|
113
|
-
transaction<TResult>(handler: (client: ClientSession, db: Db) => Promise<TResult
|
|
120
|
+
transaction<TResult>(handler: (client: ClientSession, db: Db) => Promise<TResult>, options?: TransactionOptions): Promise<TResult>;
|
|
114
121
|
}
|
|
115
122
|
const Database: DatabaseContract;
|
|
116
123
|
export default Database;
|
|
@@ -2,6 +2,18 @@ declare module '@ioc:Zakodium/Mongodb/Odm' {
|
|
|
2
2
|
type DecoratorFn = (target: unknown, property: unknown) => void;
|
|
3
3
|
interface FieldOptions {
|
|
4
4
|
}
|
|
5
|
+
/**
|
|
6
|
+
* Represents a computed property on the model
|
|
7
|
+
*/
|
|
8
|
+
interface ComputedOptions {
|
|
9
|
+
/**
|
|
10
|
+
* if null, will not serialize
|
|
11
|
+
* default to getter name
|
|
12
|
+
*/
|
|
13
|
+
serializeAs: string | null;
|
|
14
|
+
meta?: any;
|
|
15
|
+
}
|
|
5
16
|
type FieldDecorator = (options?: FieldOptions) => DecoratorFn;
|
|
17
|
+
type ComputedDecorator = (options?: Partial<ComputedOptions>) => DecoratorFn;
|
|
6
18
|
const field: FieldDecorator;
|
|
7
19
|
}
|
|
@@ -42,6 +42,12 @@ declare module '@ioc:Zakodium/Mongodb/Odm' {
|
|
|
42
42
|
* Returns the field options if it exists.
|
|
43
43
|
*/
|
|
44
44
|
$getField(name: string): FieldOptions | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Managing computed columns
|
|
47
|
+
*/
|
|
48
|
+
$addComputed(name: string, options: Partial<ComputedOptions>): ComputedOptions;
|
|
49
|
+
$hasComputed(name: string): boolean;
|
|
50
|
+
$getComputed(name: string): ComputedOptions | undefined;
|
|
45
51
|
/**
|
|
46
52
|
* Custom database connection to use.
|
|
47
53
|
*/
|
|
@@ -139,6 +145,35 @@ declare module '@ioc:Zakodium/Mongodb/Odm' {
|
|
|
139
145
|
* `true` if the entry has unsaved modifications.
|
|
140
146
|
*/
|
|
141
147
|
readonly $isDirty: boolean;
|
|
148
|
+
/**
|
|
149
|
+
* Return the client session of the transaction
|
|
150
|
+
*/
|
|
151
|
+
readonly $trx: ClientSession | undefined;
|
|
152
|
+
readonly $isTransaction: boolean;
|
|
153
|
+
/**
|
|
154
|
+
* Assign client to model options for transactions use.
|
|
155
|
+
* Will throw an error if model instance already linked to a session
|
|
156
|
+
*
|
|
157
|
+
* It allows to use model init outside a transaction, but save it within a transaction.
|
|
158
|
+
*
|
|
159
|
+
* @param client
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* ```ts
|
|
163
|
+
* const label = await Label.findOrFail(1);
|
|
164
|
+
* // edit some label props
|
|
165
|
+
*
|
|
166
|
+
* Database.transaction((client) => {
|
|
167
|
+
* const documents = await Document.query({ labels: label._id }, { client }).all()
|
|
168
|
+
* // remove label from documents when new label definition is incompatible
|
|
169
|
+
* // call .save() for each changed documents (aware of transaction because is from query with client option)
|
|
170
|
+
*
|
|
171
|
+
* label.useTransaction(client);
|
|
172
|
+
* label.save();
|
|
173
|
+
* })
|
|
174
|
+
* ```
|
|
175
|
+
*/
|
|
176
|
+
useTransaction(client: ClientSession): this;
|
|
142
177
|
/**
|
|
143
178
|
* Returns the Model's current data
|
|
144
179
|
*/
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="@adonisjs/logger/build/adonis-typings/logger" />
|
|
2
2
|
/// <reference types="node" />
|
|
3
3
|
import { EventEmitter } from 'node:events';
|
|
4
|
-
import { MongoClient, Db, Collection, ClientSession, Document } from 'mongodb';
|
|
4
|
+
import { MongoClient, Db, Collection, ClientSession, Document, TransactionOptions } from 'mongodb';
|
|
5
5
|
import { LoggerContract } from '@ioc:Adonis/Core/Logger';
|
|
6
6
|
import type { MongodbConnectionConfig, ConnectionContract } from '@ioc:Zakodium/Mongodb/Database';
|
|
7
7
|
export declare interface Connection {
|
|
@@ -25,5 +25,5 @@ export declare class Connection extends EventEmitter implements ConnectionContra
|
|
|
25
25
|
disconnect(): Promise<void>;
|
|
26
26
|
database(): Promise<Db>;
|
|
27
27
|
collection<TSchema extends Document>(collectionName: string): Promise<Collection<TSchema>>;
|
|
28
|
-
transaction<TResult>(handler: (session: ClientSession, db: Db) => Promise<TResult
|
|
28
|
+
transaction<TResult>(handler: (session: ClientSession, db: Db) => Promise<TResult>, options?: TransactionOptions): Promise<TResult>;
|
|
29
29
|
}
|
|
@@ -69,17 +69,17 @@ class Connection extends node_events_1.EventEmitter {
|
|
|
69
69
|
const db = await this._ensureDb();
|
|
70
70
|
return db.collection(collectionName);
|
|
71
71
|
}
|
|
72
|
-
async transaction(handler) {
|
|
72
|
+
async transaction(handler, options) {
|
|
73
73
|
const db = await this._ensureDb();
|
|
74
74
|
let result;
|
|
75
75
|
await this.client.withSession(async (session) => {
|
|
76
76
|
return session.withTransaction(async (session) => {
|
|
77
77
|
result = await handler(session, db);
|
|
78
|
-
});
|
|
78
|
+
}, options);
|
|
79
79
|
});
|
|
80
80
|
// @ts-expect-error The `await` ensures `result` has a value.
|
|
81
81
|
return result;
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
exports.Connection = Connection;
|
|
85
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29ubmVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9EYXRhYmFzZS9Db25uZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUEyQztBQUUzQywyQ0FBNEM7QUFDNUMscUNBT2lCO0FBUWpCLElBQUssZ0JBR0o7QUFIRCxXQUFLLGdCQUFnQjtJQUNuQiwyQ0FBdUIsQ0FBQTtJQUN2QixpREFBNkIsQ0FBQTtBQUMvQixDQUFDLEVBSEksZ0JBQWdCLEtBQWhCLGdCQUFnQixRQUdwQjtBQTBCRCx5R0FBeUc7QUFDekcsTUFBYSxVQUFXLFNBQVEsMEJBQVk7SUFVMUMsWUFDRSxJQUFZLEVBQ1osTUFBK0IsRUFDL0IsTUFBc0I7UUFFdEIsS0FBSyxFQUFFLENBQUM7UUFFUixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLGdCQUFnQixDQUFDLFlBQVksQ0FBQztRQUM1QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUkscUJBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUM3QyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYTtTQUM3QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztJQUM3QixDQUFDO0lBRU8sS0FBSyxDQUFDLFNBQVM7UUFDckIsS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDeEIsTUFBTSxJQUFJLGlCQUFTLENBQ2pCLHFDQUFxQyxFQUNyQyxHQUFHLEVBQ0gsc0JBQXNCLENBQ3ZCLENBQUM7U0FDSDtRQUNELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJ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
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/// <reference types="@adonisjs/logger/build/adonis-typings/logger" />
|
|
2
|
+
import { ClientSession, Db, TransactionOptions } from 'mongodb';
|
|
2
3
|
import { LoggerContract } from '@ioc:Adonis/Core/Logger';
|
|
3
4
|
import type { ConnectionContract, ConnectionManagerContract, DatabaseContract, MongodbConfig } from '@ioc:Zakodium/Mongodb/Database';
|
|
4
5
|
export declare class Database implements DatabaseContract {
|
|
@@ -9,4 +10,5 @@ export declare class Database implements DatabaseContract {
|
|
|
9
10
|
constructor(config: MongodbConfig, logger: LoggerContract);
|
|
10
11
|
private registerConnections;
|
|
11
12
|
connection(connectionName?: string): ConnectionContract;
|
|
13
|
+
transaction<TResult>(handler: (client: ClientSession, db: Db) => Promise<TResult>, options?: TransactionOptions): Promise<TResult>;
|
|
12
14
|
}
|
|
@@ -28,6 +28,10 @@ class Database {
|
|
|
28
28
|
connection(connectionName = this.primaryConnectionName) {
|
|
29
29
|
return this.manager.get(connectionName).connection;
|
|
30
30
|
}
|
|
31
|
+
transaction(handler, options) {
|
|
32
|
+
const client = this.connection();
|
|
33
|
+
return client.transaction(handler, options);
|
|
34
|
+
}
|
|
31
35
|
}
|
|
32
36
|
exports.Database = Database;
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvRGF0YWJhc2UvRGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBVUEsMkRBQXdEO0FBRXhELE1BQWEsUUFBUTtJQUluQixZQUNVLE1BQXFCLEVBQ3JCLE1BQXNCO1FBRHRCLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFFOUIsSUFBSSxPQUFPLE1BQU0sQ0FBQyxVQUFVLEtBQUssUUFBUSxFQUFFO1lBQ3pDLE1BQU0sSUFBSSxTQUFTLENBQUMsb0NBQW9DLENBQUMsQ0FBQztTQUMzRDtRQUNELElBQUksT0FBTyxNQUFNLENBQUMsV0FBVyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsV0FBVyxLQUFLLElBQUksRUFBRTtZQUN6RSxNQUFNLElBQUksU0FBUyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7U0FDN0Q7UUFFRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQztRQUMvQyxJQUFJLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxRQUFRLEVBQUU7WUFDdEUsTUFBTSxJQUFJLFNBQVMsQ0FDakIsMkVBQTJFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxDQUN6RyxDQUFDO1NBQ0g7UUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUkscUNBQWlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTyxtQkFBbUI7UUFDekIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDdkMsS0FBSyxNQUFNLENBQUMsY0FBYyxFQUFFLGdCQUFnQixDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN2RSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztTQUNwRDtJQUNILENBQUM7SUFFTSxVQUFVLENBQ2YsY0FBYyxHQUFHLElBQUksQ0FBQyxxQkFBcUI7UUFFM0MsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDckQsQ0FBQztJQUVNLFdBQVcsQ0FDaEIsT0FBNEQsRUFDNUQsT0FBNEI7UUFFNUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUMsQ0FBQztDQUNGO0FBOUNELDRCQThDQyJ9
|
package/lib/src/Model/Model.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { BulkWriteOptions, ClientSession, Collection, CountDocumentsOptions, DeleteOptions, Document, ExplainVerbosityLike, Filter, FindOptions, InsertOneOptions, SortDirection } from 'mongodb';
|
|
2
2
|
import { DatabaseContract } from '@ioc:Zakodium/Mongodb/Database';
|
|
3
|
-
import { MongodbDocument, QueryContract, NoExtraProperties, ModelAttributes, ModelAdapterOptions, ModelDocumentOptions, FieldOptions, QuerySortObject, ForbiddenQueryOptions } from '@ioc:Zakodium/Mongodb/Odm';
|
|
3
|
+
import { MongodbDocument, QueryContract, NoExtraProperties, ModelAttributes, ModelAdapterOptions, ModelDocumentOptions, FieldOptions, QuerySortObject, ForbiddenQueryOptions, ComputedOptions } from '@ioc:Zakodium/Mongodb/Odm';
|
|
4
4
|
declare class Query<ModelType extends typeof BaseModel> implements QueryContract<InstanceType<ModelType>> {
|
|
5
5
|
private filter;
|
|
6
6
|
private options;
|
|
@@ -35,6 +35,12 @@ export declare class BaseModel {
|
|
|
35
35
|
static readonly collectionName: string;
|
|
36
36
|
static booted: boolean;
|
|
37
37
|
static readonly $fieldsDefinitions: Map<string, FieldOptions>;
|
|
38
|
+
/**
|
|
39
|
+
* A set of properties marked as computed. Computed properties are included in
|
|
40
|
+
* the `toJSON` result, else they behave the same way as any other instance
|
|
41
|
+
* property.
|
|
42
|
+
*/
|
|
43
|
+
static $computedDefinitions: Map<string, ComputedOptions>;
|
|
38
44
|
readonly _id: unknown;
|
|
39
45
|
readonly createdAt: Date;
|
|
40
46
|
readonly updatedAt: Date;
|
|
@@ -51,6 +57,18 @@ export declare class BaseModel {
|
|
|
51
57
|
static $addField(name: string, options?: Partial<FieldOptions>): FieldOptions;
|
|
52
58
|
static $hasField(name: string): boolean;
|
|
53
59
|
static $getField(name: string): FieldOptions | undefined;
|
|
60
|
+
/**
|
|
61
|
+
* Adds a computed node
|
|
62
|
+
*/
|
|
63
|
+
static $addComputed(name: string, options: Partial<ComputedOptions>): ComputedOptions;
|
|
64
|
+
/**
|
|
65
|
+
* Find if some property is marked as computed
|
|
66
|
+
*/
|
|
67
|
+
static $hasComputed(name: string): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Get computed node
|
|
70
|
+
*/
|
|
71
|
+
static $getComputed(name: string): ComputedOptions | undefined;
|
|
54
72
|
static boot(): void;
|
|
55
73
|
static count<ModelType extends typeof BaseModel>(this: ModelType, filter: Filter<ModelAttributes<InstanceType<ModelType>>>, options?: ModelAdapterOptions<CountDocumentsOptions>): Promise<number>;
|
|
56
74
|
static create<ModelType extends typeof BaseModel>(this: ModelType, value: Partial<ModelAttributes<InstanceType<ModelType>>>, options?: ModelAdapterOptions<InsertOneOptions>): Promise<InstanceType<ModelType>>;
|
|
@@ -75,6 +93,9 @@ export declare class BaseModel {
|
|
|
75
93
|
delete(options?: ModelDocumentOptions<DeleteOptions>): Promise<boolean>;
|
|
76
94
|
merge<T extends Partial<Omit<ModelAttributes<this>, '_id'>>>(values: NoExtraProperties<Partial<Omit<ModelAttributes<this>, '_id'>>, T>): this;
|
|
77
95
|
fill<T extends Partial<Omit<ModelAttributes<this>, '_id'>>>(values: NoExtraProperties<Partial<Omit<ModelAttributes<this>, '_id'>>, T>): this;
|
|
96
|
+
get $trx(): ClientSession | undefined;
|
|
97
|
+
get $isTransaction(): boolean;
|
|
98
|
+
useTransaction(client: ClientSession): this;
|
|
78
99
|
}
|
|
79
100
|
export declare class BaseAutoIncrementModel extends BaseModel {
|
|
80
101
|
readonly _id: number;
|
package/lib/src/Model/Model.js
CHANGED
|
@@ -192,6 +192,29 @@ class BaseModel {
|
|
|
192
192
|
static $getField(name) {
|
|
193
193
|
return this.$fieldsDefinitions.get(name);
|
|
194
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* Adds a computed node
|
|
197
|
+
*/
|
|
198
|
+
static $addComputed(name, options) {
|
|
199
|
+
const computed = {
|
|
200
|
+
serializeAs: options.serializeAs === null ? null : options.serializeAs || name,
|
|
201
|
+
meta: options.meta,
|
|
202
|
+
};
|
|
203
|
+
this.$computedDefinitions.set(name, computed);
|
|
204
|
+
return computed;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Find if some property is marked as computed
|
|
208
|
+
*/
|
|
209
|
+
static $hasComputed(name) {
|
|
210
|
+
return this.$computedDefinitions.has(name);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Get computed node
|
|
214
|
+
*/
|
|
215
|
+
static $getComputed(name) {
|
|
216
|
+
return this.$computedDefinitions.get(name);
|
|
217
|
+
}
|
|
195
218
|
static boot() {
|
|
196
219
|
/**
|
|
197
220
|
* Define the property when not defined on self. This makes sure that all
|
|
@@ -217,6 +240,14 @@ class BaseModel {
|
|
|
217
240
|
defaultValue: new Map(),
|
|
218
241
|
strategy: 'inherit',
|
|
219
242
|
});
|
|
243
|
+
/**
|
|
244
|
+
* Define computed properties
|
|
245
|
+
*/
|
|
246
|
+
(0, utils_1.defineStaticProperty)(this, BaseModel, {
|
|
247
|
+
propertyName: '$computedDefinitions',
|
|
248
|
+
defaultValue: new Map(),
|
|
249
|
+
strategy: 'inherit',
|
|
250
|
+
});
|
|
220
251
|
}
|
|
221
252
|
static async count(filter, options) {
|
|
222
253
|
const collection = await this.getCollection();
|
|
@@ -330,6 +361,7 @@ class BaseModel {
|
|
|
330
361
|
$isDeleted: this.$isDeleted,
|
|
331
362
|
$dirty: this.$dirty,
|
|
332
363
|
$isDirty: this.$isDirty,
|
|
364
|
+
$isTransaction: this.$isTransaction,
|
|
333
365
|
};
|
|
334
366
|
}
|
|
335
367
|
get $isNew() {
|
|
@@ -384,7 +416,18 @@ class BaseModel {
|
|
|
384
416
|
return Object.keys(this.$dirty).length > 0;
|
|
385
417
|
}
|
|
386
418
|
toJSON() {
|
|
387
|
-
|
|
419
|
+
const Model = this.constructor;
|
|
420
|
+
const computed = {};
|
|
421
|
+
for (const [key, def] of Model.$computedDefinitions.entries()) {
|
|
422
|
+
if (def.serializeAs === null)
|
|
423
|
+
continue;
|
|
424
|
+
// @ts-expect-error polymorphic getter
|
|
425
|
+
computed[def.serializeAs] = this[key];
|
|
426
|
+
}
|
|
427
|
+
return {
|
|
428
|
+
...this.$attributes,
|
|
429
|
+
...computed,
|
|
430
|
+
};
|
|
388
431
|
}
|
|
389
432
|
async save(options) {
|
|
390
433
|
this.$ensureNotDeleted();
|
|
@@ -439,6 +482,24 @@ class BaseModel {
|
|
|
439
482
|
this.$attributes.createdAt = createdAt;
|
|
440
483
|
return this.merge(values);
|
|
441
484
|
}
|
|
485
|
+
get $trx() {
|
|
486
|
+
return this.$options.session;
|
|
487
|
+
}
|
|
488
|
+
get $isTransaction() {
|
|
489
|
+
return Boolean(this.$trx);
|
|
490
|
+
}
|
|
491
|
+
useTransaction(client) {
|
|
492
|
+
if (this.$isTransaction) {
|
|
493
|
+
const model = this.constructor.name;
|
|
494
|
+
const id = String(this.id);
|
|
495
|
+
const message = this.$isNew
|
|
496
|
+
? `This new instance ${model} is already linked to a transaction`
|
|
497
|
+
: `This instance ${id} ${model} is already linked to a transaction`;
|
|
498
|
+
throw new Error(message);
|
|
499
|
+
}
|
|
500
|
+
this.$options.session = client;
|
|
501
|
+
return this;
|
|
502
|
+
}
|
|
442
503
|
}
|
|
443
504
|
exports.BaseModel = BaseModel;
|
|
444
505
|
class BaseAutoIncrementModel extends BaseModel {
|
|
@@ -475,4 +536,4 @@ class BaseAutoIncrementModel extends BaseModel {
|
|
|
475
536
|
}
|
|
476
537
|
}
|
|
477
538
|
exports.BaseAutoIncrementModel = BaseAutoIncrementModel;
|
|
478
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvTW9kZWwvTW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsOERBQWlDO0FBRWpDLDJDQUFrRTtBQUNsRSxtQ0FBK0Q7QUFnQi9ELDBEQUFrQztBQWVsQyxpREFBOEM7QUFFOUMsU0FBUyxrQkFBa0IsQ0FFekIsT0FBK0M7SUFDL0MsSUFBSSxDQUFDLE9BQU87UUFBRSxPQUFPLEVBQXNCLENBQUM7SUFDNUMsT0FBTztRQUNMLEdBQUcsT0FBTyxDQUFDLGFBQWE7UUFDeEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxNQUFNO0tBQ0osQ0FBQztBQUN4QixDQUFDO0FBUUQsTUFBTSxxQkFBcUIsR0FBNEI7SUFDckQsTUFBTTtJQUNOLE1BQU07SUFDTixPQUFPO0lBQ1AsU0FBUztDQUNWLENBQUM7QUFFRixNQUFNLEtBQUs7SUFVRCxnQkFBZ0I7UUFHdEIsT0FBTyxFQUFFLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxZQUNVLE1BQXdELEVBQ3hELE9BT0s7SUFDYixnRUFBZ0U7SUFDeEQsZ0JBQTJCO1FBVjNCLFdBQU0sR0FBTixNQUFNLENBQWtEO1FBQ3hELFlBQU8sR0FBUCxPQUFPLENBT0Y7UUFFTCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQVc7UUF4QjdCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLGlCQUFZLEdBQXNCO1lBQ3hDLElBQUksRUFBRTtnQkFDSixHQUFHLEVBQUUsWUFBWTthQUNsQjtTQUNGLENBQUM7UUFxQkEsSUFBSSxPQUFPLEVBQUUsYUFBYSxFQUFFO1lBQzFCLEtBQUssTUFBTSxHQUFHLElBQUkscUJBQXFCLEVBQUU7Z0JBQ3ZDLElBQUksR0FBRyxJQUFJLE9BQU8sQ0FBQyxhQUFhLEVBQUU7b0JBQ2hDLE1BQU0s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
|
|
539
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvTW9kZWwvTW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsOERBQWlDO0FBRWpDLDJDQUFrRTtBQUNsRSxtQ0FBK0Q7QUFnQi9ELDBEQUFrQztBQWdCbEMsaURBQThDO0FBRTlDLFNBQVMsa0JBQWtCLENBRXpCLE9BQStDO0lBQy9DLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTyxFQUFzQixDQUFDO0lBQzVDLE9BQU87UUFDTCxHQUFHLE9BQU8sQ0FBQyxhQUFhO1FBQ3hCLE9BQU8sRUFBRSxPQUFPLENBQUMsTUFBTTtLQUNKLENBQUM7QUFDeEIsQ0FBQztBQVFELE1BQU0scUJBQXFCLEdBQTRCO0lBQ3JELE1BQU07SUFDTixNQUFNO0lBQ04sT0FBTztJQUNQLFNBQVM7Q0FDVixDQUFDO0FBRUYsTUFBTSxLQUFLO0lBVUQsZ0JBQWdCO1FBR3RCLE9BQU8sRUFBRSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN2RSxDQUFDO0lBRUQsWUFDVSxNQUF3RCxFQUN4RCxPQU9LO0lBQ2IsZ0VBQWdFO0lBQ3hELGdCQUEyQjtRQVYzQixXQUFNLEdBQU4sTUFBTSxDQUFrRDtRQUN4RCxZQUFPLEdBQVAsT0FBTyxDQU9GO1FBRUwscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFXO1FBeEI3QixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixpQkFBWSxHQUFzQjtZQUN4QyxJQUFJLEVBQUU7Z0JBQ0osR0FBRyxFQUFFLFlBQVk7YUFDbEI7U0FDRixDQUFDO1FBcUJBLElBQUksT0FBTyxFQUFFLGFBQWEsRUFBRTtZQUMxQixLQUFLLE1BQU0sR0FBRyxJQUFJLHFCQUFxQixFQUFFO2dCQUN2QyxJQUFJLEdBQUcsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFO29CQUNoQyxNQUFN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
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
3
|
exports.proxyHandler = void 0;
|
|
5
4
|
exports.proxyHandler = {
|
|
6
|
-
get(target, prop) {
|
|
5
|
+
get(target, prop, receiver) {
|
|
6
|
+
const Model = target.constructor;
|
|
7
|
+
if (Model.$hasComputed(prop)) {
|
|
8
|
+
return Reflect.get(target, prop, receiver);
|
|
9
|
+
}
|
|
7
10
|
if (target[prop] !== undefined) {
|
|
8
|
-
return Reflect.get(target, prop);
|
|
11
|
+
return Reflect.get(target, prop, receiver);
|
|
9
12
|
}
|
|
10
|
-
return Reflect.get(target.$attributes, prop);
|
|
13
|
+
return Reflect.get(target.$attributes, prop, receiver);
|
|
11
14
|
},
|
|
12
15
|
set(target, prop, value) {
|
|
13
16
|
if (target[prop] !== undefined) {
|
|
@@ -19,4 +22,4 @@ exports.proxyHandler = {
|
|
|
19
22
|
throw new Error('Getting model keys is disallowed. If you want to use object spread on the current data, do { ...model.$attributes }');
|
|
20
23
|
},
|
|
21
24
|
};
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHlIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL01vZGVsL3Byb3h5SGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHYSxRQUFBLFlBQVksR0FBc0I7SUFDN0MsR0FBRyxDQUFDLE1BQVcsRUFBRSxJQUFxQixFQUFFLFFBQWE7UUFDbkQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFdBQStCLENBQUM7UUFDckQsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLElBQWMsQ0FBQyxFQUFFO1lBQ3RDLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQzlCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFDRCxHQUFHLENBQUMsTUFBVyxFQUFFLElBQXFCLEVBQUUsS0FBVTtRQUNoRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDOUIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDekM7UUFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELE9BQU87UUFDTCxNQUFNLElBQUksS0FBSyxDQUNiLHFIQUFxSCxDQUN0SCxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMifQ==
|
|
@@ -1,2 +1,7 @@
|
|
|
1
|
-
import { FieldDecorator } from '@ioc:Zakodium/Mongodb/Odm';
|
|
1
|
+
import { ComputedDecorator, FieldDecorator } from '@ioc:Zakodium/Mongodb/Odm';
|
|
2
2
|
export declare const field: FieldDecorator;
|
|
3
|
+
/**
|
|
4
|
+
* Define computed property on a model. The decorator needs a
|
|
5
|
+
* proper model class inheriting the base model
|
|
6
|
+
*/
|
|
7
|
+
export declare const computed: ComputedDecorator;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.field = void 0;
|
|
3
|
+
exports.computed = exports.field = void 0;
|
|
4
4
|
const field = (options) => {
|
|
5
5
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
6
6
|
return function decorateField(target, property) {
|
|
@@ -10,4 +10,17 @@ const field = (options) => {
|
|
|
10
10
|
};
|
|
11
11
|
};
|
|
12
12
|
exports.field = field;
|
|
13
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Define computed property on a model. The decorator needs a
|
|
15
|
+
* proper model class inheriting the base model
|
|
16
|
+
*/
|
|
17
|
+
const computed = (options) => {
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
19
|
+
return function decorateAsComputed(target, property) {
|
|
20
|
+
const Model = target.constructor;
|
|
21
|
+
Model.boot();
|
|
22
|
+
Model.$addComputed(property, options ?? {});
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
exports.computed = computed;
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9PZG0vZGVjb3JhdG9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFRTyxNQUFNLEtBQUssR0FBbUIsQ0FBQyxPQUFzQixFQUFFLEVBQUU7SUFDOUQsOERBQThEO0lBQzlELE9BQU8sU0FBUyxhQUFhLENBQUMsTUFBVyxFQUFFLFFBQWdCO1FBQ3pELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxXQUFvQyxDQUFDO1FBQzFELEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNiLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQVBXLFFBQUEsS0FBSyxTQU9oQjtBQUVGOzs7R0FHRztBQUNJLE1BQU0sUUFBUSxHQUFzQixDQUFDLE9BQXlCLEVBQUUsRUFBRTtJQUN2RSw4REFBOEQ7SUFDOUQsT0FBTyxTQUFTLGtCQUFrQixDQUFDLE1BQVcsRUFBRSxRQUFnQjtRQUM5RCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsV0FBb0MsQ0FBQztRQUUxRCxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDYixLQUFLLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBUlcsUUFBQSxRQUFRLFlBUW5CIn0=
|
package/package.json
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import { EventEmitter } from 'node:events';
|
|
2
2
|
|
|
3
3
|
import { Exception } from '@poppinss/utils';
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
MongoClient,
|
|
6
|
+
Db,
|
|
7
|
+
Collection,
|
|
8
|
+
ClientSession,
|
|
9
|
+
Document,
|
|
10
|
+
TransactionOptions,
|
|
11
|
+
} from 'mongodb';
|
|
5
12
|
|
|
6
13
|
import { LoggerContract } from '@ioc:Adonis/Core/Logger';
|
|
7
14
|
import type {
|
|
@@ -125,13 +132,14 @@ export class Connection extends EventEmitter implements ConnectionContract {
|
|
|
125
132
|
|
|
126
133
|
public async transaction<TResult>(
|
|
127
134
|
handler: (session: ClientSession, db: Db) => Promise<TResult>,
|
|
135
|
+
options?: TransactionOptions,
|
|
128
136
|
): Promise<TResult> {
|
|
129
137
|
const db = await this._ensureDb();
|
|
130
138
|
let result: TResult;
|
|
131
139
|
await this.client.withSession(async (session) => {
|
|
132
140
|
return session.withTransaction(async (session) => {
|
|
133
141
|
result = await handler(session, db);
|
|
134
|
-
});
|
|
142
|
+
}, options);
|
|
135
143
|
});
|
|
136
144
|
// @ts-expect-error The `await` ensures `result` has a value.
|
|
137
145
|
return result;
|
package/src/Database/Database.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { ClientSession, Db, TransactionOptions } from 'mongodb';
|
|
2
|
+
|
|
1
3
|
import { LoggerContract } from '@ioc:Adonis/Core/Logger';
|
|
2
4
|
import type {
|
|
3
5
|
ConnectionContract,
|
|
@@ -46,4 +48,12 @@ export class Database implements DatabaseContract {
|
|
|
46
48
|
): ConnectionContract {
|
|
47
49
|
return this.manager.get(connectionName).connection;
|
|
48
50
|
}
|
|
51
|
+
|
|
52
|
+
public transaction<TResult>(
|
|
53
|
+
handler: (client: ClientSession, db: Db) => Promise<TResult>,
|
|
54
|
+
options?: TransactionOptions,
|
|
55
|
+
): Promise<TResult> {
|
|
56
|
+
const client = this.connection();
|
|
57
|
+
return client.transaction(handler, options);
|
|
58
|
+
}
|
|
49
59
|
}
|
package/src/Model/Model.ts
CHANGED
|
@@ -30,6 +30,7 @@ import {
|
|
|
30
30
|
FieldOptions,
|
|
31
31
|
QuerySortObject,
|
|
32
32
|
ForbiddenQueryOptions,
|
|
33
|
+
ComputedOptions,
|
|
33
34
|
} from '@ioc:Zakodium/Mongodb/Odm';
|
|
34
35
|
|
|
35
36
|
import { proxyHandler } from './proxyHandler';
|
|
@@ -254,6 +255,13 @@ export class BaseModel {
|
|
|
254
255
|
public static booted: boolean;
|
|
255
256
|
public static readonly $fieldsDefinitions: Map<string, FieldOptions>;
|
|
256
257
|
|
|
258
|
+
/**
|
|
259
|
+
* A set of properties marked as computed. Computed properties are included in
|
|
260
|
+
* the `toJSON` result, else they behave the same way as any other instance
|
|
261
|
+
* property.
|
|
262
|
+
*/
|
|
263
|
+
public static $computedDefinitions: Map<string, ComputedOptions>;
|
|
264
|
+
|
|
257
265
|
public readonly _id: unknown;
|
|
258
266
|
public readonly createdAt: Date;
|
|
259
267
|
public readonly updatedAt: Date;
|
|
@@ -318,6 +326,33 @@ export class BaseModel {
|
|
|
318
326
|
return this.$fieldsDefinitions.get(name);
|
|
319
327
|
}
|
|
320
328
|
|
|
329
|
+
/**
|
|
330
|
+
* Adds a computed node
|
|
331
|
+
*/
|
|
332
|
+
public static $addComputed(name: string, options: Partial<ComputedOptions>) {
|
|
333
|
+
const computed: ComputedOptions = {
|
|
334
|
+
serializeAs:
|
|
335
|
+
options.serializeAs === null ? null : options.serializeAs || name,
|
|
336
|
+
meta: options.meta,
|
|
337
|
+
};
|
|
338
|
+
this.$computedDefinitions.set(name, computed);
|
|
339
|
+
return computed;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Find if some property is marked as computed
|
|
344
|
+
*/
|
|
345
|
+
public static $hasComputed(name: string): boolean {
|
|
346
|
+
return this.$computedDefinitions.has(name);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Get computed node
|
|
351
|
+
*/
|
|
352
|
+
public static $getComputed(name: string): ComputedOptions | undefined {
|
|
353
|
+
return this.$computedDefinitions.get(name);
|
|
354
|
+
}
|
|
355
|
+
|
|
321
356
|
public static boot(): void {
|
|
322
357
|
/**
|
|
323
358
|
* Define the property when not defined on self. This makes sure that all
|
|
@@ -347,6 +382,15 @@ export class BaseModel {
|
|
|
347
382
|
defaultValue: new Map(),
|
|
348
383
|
strategy: 'inherit',
|
|
349
384
|
});
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Define computed properties
|
|
388
|
+
*/
|
|
389
|
+
defineStaticProperty(this, BaseModel, {
|
|
390
|
+
propertyName: '$computedDefinitions',
|
|
391
|
+
defaultValue: new Map(),
|
|
392
|
+
strategy: 'inherit',
|
|
393
|
+
});
|
|
350
394
|
}
|
|
351
395
|
|
|
352
396
|
public static async count<ModelType extends typeof BaseModel>(
|
|
@@ -550,6 +594,7 @@ export class BaseModel {
|
|
|
550
594
|
$isDeleted: this.$isDeleted,
|
|
551
595
|
$dirty: this.$dirty,
|
|
552
596
|
$isDirty: this.$isDirty,
|
|
597
|
+
$isTransaction: this.$isTransaction,
|
|
553
598
|
};
|
|
554
599
|
}
|
|
555
600
|
|
|
@@ -621,7 +666,19 @@ export class BaseModel {
|
|
|
621
666
|
}
|
|
622
667
|
|
|
623
668
|
public toJSON(): unknown {
|
|
624
|
-
|
|
669
|
+
const Model = this.constructor as typeof BaseModel;
|
|
670
|
+
|
|
671
|
+
const computed: Record<string, unknown> = {};
|
|
672
|
+
for (const [key, def] of Model.$computedDefinitions.entries()) {
|
|
673
|
+
if (def.serializeAs === null) continue;
|
|
674
|
+
// @ts-expect-error polymorphic getter
|
|
675
|
+
computed[def.serializeAs] = this[key];
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
return {
|
|
679
|
+
...this.$attributes,
|
|
680
|
+
...computed,
|
|
681
|
+
};
|
|
625
682
|
}
|
|
626
683
|
|
|
627
684
|
public async save(
|
|
@@ -692,6 +749,29 @@ export class BaseModel {
|
|
|
692
749
|
if (createdAt) this.$attributes.createdAt = createdAt;
|
|
693
750
|
return this.merge(values);
|
|
694
751
|
}
|
|
752
|
+
|
|
753
|
+
public get $trx(): ClientSession | undefined {
|
|
754
|
+
return this.$options.session;
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
public get $isTransaction(): boolean {
|
|
758
|
+
return Boolean(this.$trx);
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
public useTransaction(client: ClientSession): this {
|
|
762
|
+
if (this.$isTransaction) {
|
|
763
|
+
const model = this.constructor.name;
|
|
764
|
+
const id = String(this.id);
|
|
765
|
+
const message = this.$isNew
|
|
766
|
+
? `This new instance ${model} is already linked to a transaction`
|
|
767
|
+
: `This instance ${id} ${model} is already linked to a transaction`;
|
|
768
|
+
throw new Error(message);
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
this.$options.session = client;
|
|
772
|
+
|
|
773
|
+
return this;
|
|
774
|
+
}
|
|
695
775
|
}
|
|
696
776
|
|
|
697
777
|
export class BaseAutoIncrementModel extends BaseModel {
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { BaseModel } from './Model';
|
|
2
3
|
|
|
3
4
|
export const proxyHandler: ProxyHandler<any> = {
|
|
4
|
-
get(target: any, prop: string | symbol) {
|
|
5
|
+
get(target: any, prop: string | symbol, receiver: any) {
|
|
6
|
+
const Model = target.constructor as typeof BaseModel;
|
|
7
|
+
if (Model.$hasComputed(prop as string)) {
|
|
8
|
+
return Reflect.get(target, prop, receiver);
|
|
9
|
+
}
|
|
10
|
+
|
|
5
11
|
if (target[prop] !== undefined) {
|
|
6
|
-
return Reflect.get(target, prop);
|
|
12
|
+
return Reflect.get(target, prop, receiver);
|
|
7
13
|
}
|
|
8
|
-
|
|
14
|
+
|
|
15
|
+
return Reflect.get(target.$attributes, prop, receiver);
|
|
9
16
|
},
|
|
10
17
|
set(target: any, prop: string | symbol, value: any) {
|
|
11
18
|
if (target[prop] !== undefined) {
|
package/src/Odm/decorators.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
|
+
ComputedDecorator,
|
|
3
|
+
ComputedOptions,
|
|
2
4
|
FieldDecorator,
|
|
3
5
|
FieldOptions,
|
|
4
6
|
MongodbModel,
|
|
@@ -12,3 +14,17 @@ export const field: FieldDecorator = (options?: FieldOptions) => {
|
|
|
12
14
|
Model.$addField(property, options);
|
|
13
15
|
};
|
|
14
16
|
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Define computed property on a model. The decorator needs a
|
|
20
|
+
* proper model class inheriting the base model
|
|
21
|
+
*/
|
|
22
|
+
export const computed: ComputedDecorator = (options?: ComputedOptions) => {
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
24
|
+
return function decorateAsComputed(target: any, property: string) {
|
|
25
|
+
const Model = target.constructor as MongodbModel<unknown>;
|
|
26
|
+
|
|
27
|
+
Model.boot();
|
|
28
|
+
Model.$addComputed(property, options ?? {});
|
|
29
|
+
};
|
|
30
|
+
};
|