1
- import { Collection , ObjectID , DeleteWriteOpResultObject } from 'mongodb' ;
2
- import {
3
- COLLECTION_KEY , CollectionProps , DBSource , FindRequest ,
4
- POST_KEY , PRE_KEY , UpdateByIdRequest , UpdateRequest ,
5
- } from '../interfaces' ;
1
+ import { Collection , DeleteWriteOpResultObject , ObjectID } from 'mongodb' ;
2
+ import { COLLECTION_KEY , CollectionProps , DBSource , FindRequest , POST_KEY , PRE_KEY , UpdateByIdRequest , UpdateRequest } from '../interfaces' ;
3
+ import { DataEvents } from '@juicycleff/nest-multi-tenant/enums' ;
6
4
7
5
// that class only can be extended
8
6
export class BaseRepository < DOC , DTO = DOC > {
@@ -51,7 +49,7 @@ export class BaseRepository <DOC, DTO = DOC> {
51
49
52
50
const results : DOC [ ] = [ ] ;
53
51
for ( const result of found ) {
54
- results . push ( await this . invokeEvents ( POST_KEY , [ 'find ' , 'findMany ' ] , this . toggleId ( result , false ) ) ) ;
52
+ results . push ( await this . invokeEvents ( POST_KEY , [ 'FIND ' , 'FIND_MANY ' ] , this . toggleId ( result , false ) ) ) ;
55
53
}
56
54
57
55
return results ;
@@ -70,7 +68,7 @@ export class BaseRepository <DOC, DTO = DOC> {
70
68
let document = await collection . findOne ( conditions ) ;
71
69
if ( document ) {
72
70
document = this . toggleId ( document , false ) ;
73
- document = await this . invokeEvents ( POST_KEY , [ 'find ' , 'findOne ' ] , document ) ;
71
+ document = await this . invokeEvents ( POST_KEY , [ 'FIND ' , 'FIND_ONE ' ] , document ) ;
74
72
return document ;
75
73
}
76
74
}
@@ -109,7 +107,7 @@ export class BaseRepository <DOC, DTO = DOC> {
109
107
110
108
for ( let document of newDocuments ) {
111
109
document = this . toggleId ( document , false ) ;
112
- document = await this . invokeEvents ( POST_KEY , [ 'find ' , 'findMany ' ] , document ) ;
110
+ document = await this . invokeEvents ( POST_KEY , [ 'FIND ' , 'FIND_MANY ' ] , document ) ;
113
111
results . push ( document ) ;
114
112
}
115
113
@@ -123,15 +121,18 @@ export class BaseRepository <DOC, DTO = DOC> {
123
121
* @returns {Promise<DOC> }
124
122
* @memberof BaseRepository
125
123
*/
126
- async create ( document : DTO ) : Promise < DOC > {
124
+ async create ( document : Partial < DTO > | DTO ) : Promise < DOC > {
127
125
const collection = await this . collection ;
128
- const eventResult : unknown = await this . invokeEvents ( PRE_KEY , [ 'save' , 'create' ] , document ) ;
126
+ const eventResult : unknown = await this . invokeEvents ( PRE_KEY , [ 'SAVE' , 'CREATE' ] , document ) ;
127
+
128
+ console . log ( eventResult ) ;
129
+
129
130
const res = await collection . insertOne ( eventResult as DOC ) ;
130
131
131
132
let newDocument = res . ops [ 0 ] ;
132
133
// @ts -ignore
133
134
newDocument = this . toggleId ( newDocument , false ) ;
134
- newDocument = await this . invokeEvents ( POST_KEY , [ 'save ' , 'create ' ] , newDocument ) ;
135
+ newDocument = await this . invokeEvents ( POST_KEY , [ 'SAVE ' , 'CREATE ' ] , newDocument ) ;
135
136
// @ts -ignore
136
137
return newDocument ;
137
138
}
@@ -149,7 +150,7 @@ export class BaseRepository <DOC, DTO = DOC> {
149
150
// @ts -ignore
150
151
const id = new ObjectID ( document . id ) ; // flip/flop ids
151
152
152
- const updates = await this . invokeEvents ( PRE_KEY , [ 'save ' ] , document ) ;
153
+ const updates = await this . invokeEvents ( PRE_KEY , [ 'SAVE ' ] , document ) ;
153
154
delete updates . id ;
154
155
delete updates . _id ;
155
156
const query = { _id : id } ;
@@ -166,7 +167,7 @@ export class BaseRepository <DOC, DTO = DOC> {
166
167
// @ts -ignore
167
168
delete newDocument . _id ;
168
169
169
- newDocument = await this . invokeEvents ( POST_KEY , [ 'save ' ] , newDocument ) ;
170
+ newDocument = await this . invokeEvents ( POST_KEY , [ 'SAVE ' ] , newDocument ) ;
170
171
return newDocument ;
171
172
}
172
173
@@ -195,7 +196,7 @@ export class BaseRepository <DOC, DTO = DOC> {
195
196
*/
196
197
async findOneAndUpdate ( req : UpdateRequest ) : Promise < DOC > {
197
198
const collection = await this . collection ;
198
- const updates = await this . invokeEvents ( PRE_KEY , [ 'update ' , 'updateOne ' ] , req . updates ) ;
199
+ const updates = await this . invokeEvents ( PRE_KEY , [ 'UPDATE ' , 'UPDATE_ONE ' ] , req . updates ) ;
199
200
200
201
const res = await collection . findOneAndUpdate ( req . conditions , updates , {
201
202
upsert : req . upsert ,
@@ -204,7 +205,7 @@ export class BaseRepository <DOC, DTO = DOC> {
204
205
205
206
let document = res . value ;
206
207
document = this . toggleId ( document , false ) ;
207
- document = await this . invokeEvents ( POST_KEY , [ 'update ' , 'updateOne ' ] , document ) ;
208
+ document = await this . invokeEvents ( POST_KEY , [ 'UPDATE ' , 'UPDATE_ONE ' ] , document ) ;
208
209
return document ;
209
210
}
210
211
@@ -229,9 +230,9 @@ export class BaseRepository <DOC, DTO = DOC> {
229
230
async deleteOne ( conditions : any ) : Promise < DeleteWriteOpResultObject > {
230
231
const collection = await this . collection ;
231
232
232
- await this . invokeEvents ( PRE_KEY , [ 'delete ' , 'deleteOne ' ] , conditions ) ;
233
- const deleteResult = collection . deleteOne ( conditions ) ;
234
- await this . invokeEvents ( POST_KEY , [ 'delete ' , 'deleteOne ' ] , deleteResult ) ;
233
+ await this . invokeEvents ( PRE_KEY , [ 'DELETE ' , 'DELETE_ONE ' ] , conditions ) ;
234
+ const deleteResult = await collection . deleteOne ( conditions ) ;
235
+ await this . invokeEvents ( POST_KEY , [ 'DELETE ' , 'DELETE_ONE ' ] , deleteResult ) ;
235
236
236
237
return deleteResult ;
237
238
}
@@ -246,13 +247,25 @@ export class BaseRepository <DOC, DTO = DOC> {
246
247
async deleteMany ( conditions : any ) : Promise < DeleteWriteOpResultObject > {
247
248
const collection = await this . collection ;
248
249
249
- await this . invokeEvents ( PRE_KEY , [ 'delete ' , 'deleteMany ' ] , conditions ) ;
250
- const deleteResult = collection . deleteMany ( conditions ) ;
251
- await this . invokeEvents ( POST_KEY , [ 'delete ' , 'deleteMany ' ] , deleteResult ) ;
250
+ await this . invokeEvents ( PRE_KEY , [ 'DELETE_ONE ' , 'DELETE_MANY ' ] , conditions ) ;
251
+ const deleteResult = await collection . deleteMany ( conditions ) ;
252
+ await this . invokeEvents ( POST_KEY , [ 'DELETE_ONE ' , 'DELETE_MANY ' ] , deleteResult ) ;
252
253
253
254
return deleteResult ;
254
255
}
255
256
257
+ /**
258
+ * Delete multiple records
259
+ *
260
+ * @param {* } conditions
261
+ * @returns {Promise<any> }
262
+ * @memberof BaseRepository
263
+ */
264
+ async exists ( conditions : any ) : Promise < boolean > {
265
+ const collection = await this . collection ;
266
+ return await collection . find ( conditions ) . count ( ) > 0 ;
267
+ }
268
+
256
269
/**
257
270
* Strip off Mongo's ObjectID and replace with string representation or in reverse
258
271
*
@@ -341,12 +354,14 @@ export class BaseRepository <DOC, DTO = DOC> {
341
354
* @returns {Promise<DOC> }
342
355
* @memberof BaseRepository
343
356
*/
344
- private async invokeEvents ( type : string , fns : string [ ] , document : any ) : Promise < any > {
357
+ private async invokeEvents ( type : string , fns : DataEvents [ ] , document : any ) : Promise < any > {
358
+ const test = Reflect . getMetadata ( 'entity' , this ) || [ ] ;
359
+ console . log ( document , test ) ;
345
360
for ( const fn of fns ) {
346
361
const events = Reflect . getMetadata ( `${ type } _${ fn } ` , this ) || [ ] ;
347
362
for ( const event of events ) {
348
363
document = event . bind ( this ) ( document ) ;
349
- if ( typeof document . then === 'function' ) {
364
+ if ( document !== undefined && typeof document . then === 'function' ) {
350
365
document = await document ;
351
366
}
352
367
}
0 commit comments