@lenne.tech/nest-server 10.8.9 → 10.8.11
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/core/common/args/filter.args.js +2 -2
- package/dist/core/common/args/filter.args.js.map +1 -1
- package/dist/core/common/args/pagination.args.js +5 -5
- package/dist/core/common/args/pagination.args.js.map +1 -1
- package/dist/core/common/helpers/config.helper.d.ts +1 -1
- package/dist/core/common/helpers/config.helper.js +8 -8
- package/dist/core/common/helpers/config.helper.js.map +1 -1
- package/dist/core/common/helpers/db.helper.d.ts +11 -11
- package/dist/core/common/helpers/db.helper.js +100 -100
- package/dist/core/common/helpers/db.helper.js.map +1 -1
- package/dist/core/common/helpers/file.helper.d.ts +1 -1
- package/dist/core/common/helpers/file.helper.js +10 -10
- package/dist/core/common/helpers/file.helper.js.map +1 -1
- package/dist/core/common/helpers/filter.helper.d.ts +12 -12
- package/dist/core/common/helpers/filter.helper.js +19 -19
- package/dist/core/common/helpers/filter.helper.js.map +1 -1
- package/dist/core/common/helpers/graphql.helper.d.ts +8 -8
- package/dist/core/common/helpers/graphql.helper.js +75 -75
- package/dist/core/common/helpers/graphql.helper.js.map +1 -1
- package/dist/core/common/helpers/input.helper.d.ts +7 -7
- package/dist/core/common/helpers/input.helper.js +60 -60
- package/dist/core/common/helpers/input.helper.js.map +1 -1
- package/dist/core/common/helpers/model.helper.d.ts +8 -8
- package/dist/core/common/helpers/model.helper.js +38 -38
- package/dist/core/common/helpers/model.helper.js.map +1 -1
- package/dist/core/common/helpers/service.helper.d.ts +2 -2
- package/dist/core/common/helpers/table.helper.d.ts +1 -1
- package/dist/core/common/inputs/combined-filter.input.js +6 -6
- package/dist/core/common/inputs/combined-filter.input.js.map +1 -1
- package/dist/core/common/inputs/filter.input.js +6 -6
- package/dist/core/common/inputs/filter.input.js.map +1 -1
- package/dist/core/common/inputs/single-filter.input.js +10 -10
- package/dist/core/common/inputs/single-filter.input.js.map +1 -1
- package/dist/core/common/inputs/sort.input.js +4 -4
- package/dist/core/common/inputs/sort.input.js.map +1 -1
- package/dist/core/common/interfaces/server-options.interface.d.ts +8 -8
- package/dist/core/common/models/core-persistence.model.js +8 -8
- package/dist/core/common/models/core-persistence.model.js.map +1 -1
- package/dist/core/common/plugins/mongoose-id.plugin.d.ts +1 -1
- package/dist/core/common/plugins/mongoose-id.plugin.js +2 -2
- package/dist/core/common/plugins/mongoose-id.plugin.js.map +1 -1
- package/dist/core/common/scalars/any.scalar.js +8 -8
- package/dist/core/common/scalars/any.scalar.js.map +1 -1
- package/dist/core/common/scalars/date-timestamp.scalar.js +1 -1
- package/dist/core/common/scalars/date-timestamp.scalar.js.map +1 -1
- package/dist/core/common/scalars/date.scalar.js +1 -1
- package/dist/core/common/scalars/date.scalar.js.map +1 -1
- package/dist/core/common/scalars/json.scalar.js +8 -8
- package/dist/core/common/scalars/json.scalar.js.map +1 -1
- package/dist/core/common/services/config.service.d.ts +26 -26
- package/dist/core/common/services/crud.service.d.ts +32 -32
- package/dist/core/common/services/mailjet.service.js +1 -1
- package/dist/core/common/services/mailjet.service.js.map +1 -1
- package/dist/core/common/services/module.service.d.ts +1 -1
- package/dist/core/common/services/module.service.js.map +1 -1
- package/dist/core/common/types/falsy.type.d.ts +1 -1
- package/dist/core/common/types/id.type.d.ts +4 -4
- package/dist/core/common/types/require-only-one.type.d.ts +2 -2
- package/dist/core/common/types/required-at-least-one.type.d.ts +2 -2
- package/dist/core/common/types/string-or-object-id.type.d.ts +1 -1
- package/dist/core/modules/auth/core-auth.controller.js +6 -6
- package/dist/core/modules/auth/core-auth.controller.js.map +1 -1
- package/dist/core/modules/auth/core-auth.model.js +2 -2
- package/dist/core/modules/auth/core-auth.model.js.map +1 -1
- package/dist/core/modules/auth/core-auth.module.d.ts +4 -4
- package/dist/core/modules/auth/core-auth.module.js +2 -2
- package/dist/core/modules/auth/core-auth.module.js.map +1 -1
- package/dist/core/modules/auth/core-auth.resolver.js +6 -6
- package/dist/core/modules/auth/core-auth.resolver.js.map +1 -1
- package/dist/core/modules/auth/guards/auth.guard.d.ts +2 -2
- package/dist/core/modules/auth/inputs/core-auth-sign-in.input.js +2 -2
- package/dist/core/modules/auth/inputs/core-auth-sign-in.input.js.map +1 -1
- package/dist/core/modules/auth/inputs/core-auth-sign-up.input.js +2 -2
- package/dist/core/modules/auth/inputs/core-auth-sign-up.input.js.map +1 -1
- package/dist/core/modules/auth/services/core-auth.service.d.ts +2 -2
- package/dist/core/modules/file/core-file-info.model.js +8 -8
- package/dist/core/modules/file/core-file-info.model.js.map +1 -1
- package/dist/core/modules/file/core-file.controller.js +2 -2
- package/dist/core/modules/file/core-file.controller.js.map +1 -1
- package/dist/core/modules/file/core-file.resolver.js +6 -6
- package/dist/core/modules/file/core-file.resolver.js.map +1 -1
- package/dist/core/modules/file/core-file.service.d.ts +6 -6
- package/dist/core/modules/health-check/core-health-check-result.model.js +9 -9
- package/dist/core/modules/health-check/core-health-check-result.model.js.map +1 -1
- package/dist/core/modules/health-check/core-health-check.controller.js +2 -2
- package/dist/core/modules/health-check/core-health-check.controller.js.map +1 -1
- package/dist/core/modules/health-check/core-health-check.resolver.js +2 -2
- package/dist/core/modules/health-check/core-health-check.resolver.js.map +1 -1
- package/dist/core/modules/user/core-user.model.js +11 -11
- package/dist/core/modules/user/core-user.model.js.map +1 -1
- package/dist/core/modules/user/core-user.service.d.ts +2 -2
- package/dist/core/modules/user/inputs/core-user-create.input.js +3 -3
- package/dist/core/modules/user/inputs/core-user-create.input.js.map +1 -1
- package/dist/core/modules/user/inputs/core-user.input.js +10 -10
- package/dist/core/modules/user/inputs/core-user.input.js.map +1 -1
- package/dist/index.d.ts +8 -8
- package/dist/index.js +8 -8
- package/dist/index.js.map +1 -1
- package/dist/server/common/models/persistence.model.d.ts +2 -2
- package/dist/server/common/models/persistence.model.js +6 -6
- package/dist/server/common/models/persistence.model.js.map +1 -1
- package/dist/server/modules/auth/auth.controller.js +1 -1
- package/dist/server/modules/auth/auth.controller.js.map +1 -1
- package/dist/server/modules/auth/auth.model.js +3 -3
- package/dist/server/modules/auth/auth.model.js.map +1 -1
- package/dist/server/modules/auth/auth.resolver.js +3 -3
- package/dist/server/modules/auth/auth.resolver.js.map +1 -1
- package/dist/server/modules/auth/inputs/auth-sign-in.input.js +2 -2
- package/dist/server/modules/auth/inputs/auth-sign-in.input.js.map +1 -1
- package/dist/server/modules/auth/inputs/auth-sign-up.input.js +4 -4
- package/dist/server/modules/auth/inputs/auth-sign-up.input.js.map +1 -1
- package/dist/server/modules/file/file-info.model.js +2 -2
- package/dist/server/modules/file/file-info.model.js.map +1 -1
- package/dist/server/modules/file/file.controller.js +5 -5
- package/dist/server/modules/file/file.controller.js.map +1 -1
- package/dist/server/modules/file/file.resolver.js +5 -5
- package/dist/server/modules/file/file.resolver.js.map +1 -1
- package/dist/server/modules/user/avatar.controller.js +2 -2
- package/dist/server/modules/user/avatar.controller.js.map +1 -1
- package/dist/server/modules/user/inputs/user-create.input.js +2 -2
- package/dist/server/modules/user/inputs/user-create.input.js.map +1 -1
- package/dist/server/modules/user/inputs/user.input.js +2 -2
- package/dist/server/modules/user/inputs/user.input.js.map +1 -1
- package/dist/server/modules/user/outputs/find-and-count-users-result.output.js +4 -4
- package/dist/server/modules/user/outputs/find-and-count-users-result.output.js.map +1 -1
- package/dist/server/modules/user/user.model.js +8 -8
- package/dist/server/modules/user/user.model.js.map +1 -1
- package/dist/server/modules/user/user.resolver.d.ts +1 -1
- package/dist/server/modules/user/user.resolver.js +11 -11
- package/dist/server/modules/user/user.resolver.js.map +1 -1
- package/dist/server/modules/user/user.service.d.ts +1 -1
- package/dist/server/server.controller.js +2 -2
- package/dist/server/server.controller.js.map +1 -1
- package/dist/test/test.helper.d.ts +14 -14
- package/dist/test/test.helper.js +13 -3
- package/dist/test/test.helper.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +22 -19
- package/src/core/common/args/filter.args.ts +2 -2
- package/src/core/common/args/pagination.args.ts +5 -5
- package/src/core/common/decorators/graphql-service-options.decorator.ts +1 -1
- package/src/core/common/decorators/graphql-user.decorator.ts +1 -1
- package/src/core/common/decorators/rest-user.decorator.ts +1 -1
- package/src/core/common/helpers/config.helper.ts +22 -21
- package/src/core/common/helpers/db.helper.ts +164 -164
- package/src/core/common/helpers/file.helper.ts +18 -18
- package/src/core/common/helpers/filter.helper.ts +35 -35
- package/src/core/common/helpers/graphql.helper.ts +100 -100
- package/src/core/common/helpers/input.helper.ts +89 -89
- package/src/core/common/helpers/model.helper.ts +70 -70
- package/src/core/common/helpers/service.helper.ts +3 -3
- package/src/core/common/helpers/table.helper.ts +1 -1
- package/src/core/common/inputs/combined-filter.input.ts +5 -5
- package/src/core/common/inputs/filter.input.ts +5 -5
- package/src/core/common/inputs/single-filter.input.ts +9 -9
- package/src/core/common/inputs/sort.input.ts +3 -3
- package/src/core/common/interfaces/server-options.interface.ts +9 -9
- package/src/core/common/models/core-persistence.model.ts +8 -8
- package/src/core/common/plugins/mongoose-id.plugin.js +2 -2
- package/src/core/common/scalars/any.scalar.ts +8 -8
- package/src/core/common/scalars/date-timestamp.scalar.ts +1 -1
- package/src/core/common/scalars/date.scalar.ts +1 -1
- package/src/core/common/scalars/json.scalar.ts +8 -8
- package/src/core/common/services/config.service.ts +7 -7
- package/src/core/common/services/crud.service.ts +19 -19
- package/src/core/common/services/mailjet.service.ts +1 -1
- package/src/core/common/services/module.service.ts +4 -4
- package/src/core/common/types/falsy.type.ts +1 -1
- package/src/core/common/types/id.type.ts +1 -1
- package/src/core/common/types/require-only-one.type.ts +3 -3
- package/src/core/common/types/required-at-least-one.type.ts +3 -3
- package/src/core/common/types/string-or-object-id.type.ts +1 -1
- package/src/core/modules/auth/core-auth.controller.ts +6 -6
- package/src/core/modules/auth/core-auth.model.ts +1 -1
- package/src/core/modules/auth/core-auth.module.ts +4 -4
- package/src/core/modules/auth/core-auth.resolver.ts +6 -6
- package/src/core/modules/auth/guards/auth.guard.ts +3 -3
- package/src/core/modules/auth/inputs/core-auth-sign-in.input.ts +1 -1
- package/src/core/modules/auth/inputs/core-auth-sign-up.input.ts +1 -1
- package/src/core/modules/auth/services/core-auth.service.ts +1 -1
- package/src/core/modules/auth/tokens.decorator.ts +2 -2
- package/src/core/modules/file/core-file-info.model.ts +7 -7
- package/src/core/modules/file/core-file.controller.ts +2 -2
- package/src/core/modules/file/core-file.resolver.ts +6 -6
- package/src/core/modules/file/core-file.service.ts +6 -6
- package/src/core/modules/health-check/core-health-check-result.model.ts +8 -8
- package/src/core/modules/health-check/core-health-check.controller.ts +2 -2
- package/src/core/modules/health-check/core-health-check.resolver.ts +2 -2
- package/src/core/modules/user/core-user.model.ts +11 -11
- package/src/core/modules/user/core-user.service.ts +2 -2
- package/src/core/modules/user/inputs/core-user-create.input.ts +2 -2
- package/src/core/modules/user/inputs/core-user.input.ts +9 -9
- package/src/index.ts +9 -9
- package/src/server/common/models/persistence.model.ts +8 -8
- package/src/server/modules/auth/auth.controller.ts +1 -1
- package/src/server/modules/auth/auth.model.ts +2 -2
- package/src/server/modules/auth/auth.resolver.ts +3 -3
- package/src/server/modules/auth/inputs/auth-sign-in.input.ts +1 -1
- package/src/server/modules/auth/inputs/auth-sign-up.input.ts +3 -3
- package/src/server/modules/file/file-info.model.ts +2 -2
- package/src/server/modules/file/file.controller.ts +5 -5
- package/src/server/modules/file/file.module.ts +1 -1
- package/src/server/modules/file/file.resolver.ts +5 -5
- package/src/server/modules/user/avatar.controller.ts +2 -2
- package/src/server/modules/user/inputs/user-create.input.ts +1 -1
- package/src/server/modules/user/inputs/user.input.ts +1 -1
- package/src/server/modules/user/outputs/find-and-count-users-result.output.ts +3 -3
- package/src/server/modules/user/user.model.ts +8 -8
- package/src/server/modules/user/user.resolver.ts +11 -11
- package/src/server/modules/user/user.service.ts +1 -1
- package/src/server/server.controller.ts +2 -2
- package/src/test/test.helper.ts +31 -17
|
@@ -32,7 +32,7 @@ export abstract class CrudService<
|
|
|
32
32
|
*/
|
|
33
33
|
async aggregate<T = any>(
|
|
34
34
|
pipeline: PipelineStage[],
|
|
35
|
-
serviceOptions?: { aggregateOptions?: AggregateOptions }
|
|
35
|
+
serviceOptions?: ServiceOptions & { aggregateOptions?: AggregateOptions },
|
|
36
36
|
): Promise<T> {
|
|
37
37
|
return this.process(
|
|
38
38
|
async () => {
|
|
@@ -147,7 +147,7 @@ export abstract class CrudService<
|
|
|
147
147
|
* Get items via filter
|
|
148
148
|
*/
|
|
149
149
|
async find(
|
|
150
|
-
filter?: { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number }
|
|
150
|
+
filter?: FilterArgs | { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number },
|
|
151
151
|
serviceOptions?: ServiceOptions,
|
|
152
152
|
): Promise<Model[]> {
|
|
153
153
|
// If filter is not instance of FilterArgs a simple form with filterQuery and queryOptions is set
|
|
@@ -191,7 +191,7 @@ export abstract class CrudService<
|
|
|
191
191
|
* Warning: Disables the handling of rights and restrictions!
|
|
192
192
|
*/
|
|
193
193
|
async findForce(
|
|
194
|
-
filter?: { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number }
|
|
194
|
+
filter?: FilterArgs | { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number },
|
|
195
195
|
serviceOptions: ServiceOptions = {},
|
|
196
196
|
): Promise<Model[]> {
|
|
197
197
|
serviceOptions = serviceOptions || {};
|
|
@@ -204,7 +204,7 @@ export abstract class CrudService<
|
|
|
204
204
|
* Warning: Disables the handling of rights and restrictions! The raw data may contain secrets (such as passwords).
|
|
205
205
|
*/
|
|
206
206
|
async findRaw(
|
|
207
|
-
filter?: { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number }
|
|
207
|
+
filter?: FilterArgs | { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number },
|
|
208
208
|
serviceOptions: ServiceOptions = {},
|
|
209
209
|
): Promise<Model[]> {
|
|
210
210
|
serviceOptions = serviceOptions || {};
|
|
@@ -216,7 +216,7 @@ export abstract class CrudService<
|
|
|
216
216
|
* Get items and total count via filter
|
|
217
217
|
*/
|
|
218
218
|
async findAndCount(
|
|
219
|
-
filter?: { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number }
|
|
219
|
+
filter?: FilterArgs | { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number },
|
|
220
220
|
serviceOptions?: ServiceOptions,
|
|
221
221
|
): Promise<{ items: Model[]; totalCount: number }> {
|
|
222
222
|
// If filter is not instance of FilterArgs a simple form with filterQuery and queryOptions is set
|
|
@@ -295,7 +295,7 @@ export abstract class CrudService<
|
|
|
295
295
|
* Warning: Disables the handling of rights and restrictions!
|
|
296
296
|
*/
|
|
297
297
|
async findAndCountForce(
|
|
298
|
-
filter?: { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number }
|
|
298
|
+
filter?: FilterArgs | { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number },
|
|
299
299
|
serviceOptions: ServiceOptions = {},
|
|
300
300
|
): Promise<{ items: Model[]; totalCount: number }> {
|
|
301
301
|
serviceOptions.raw = true;
|
|
@@ -307,7 +307,7 @@ export abstract class CrudService<
|
|
|
307
307
|
* Warning: Disables the handling of rights and restrictions! The raw data may contain secrets (such as passwords).
|
|
308
308
|
*/
|
|
309
309
|
async findAndCountRaw(
|
|
310
|
-
filter?: { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number }
|
|
310
|
+
filter?: FilterArgs | { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number },
|
|
311
311
|
serviceOptions: ServiceOptions = {},
|
|
312
312
|
): Promise<{ items: Model[]; totalCount: number }> {
|
|
313
313
|
serviceOptions = serviceOptions || {};
|
|
@@ -319,7 +319,7 @@ export abstract class CrudService<
|
|
|
319
319
|
* Find and update
|
|
320
320
|
*/
|
|
321
321
|
async findAndUpdate(
|
|
322
|
-
filter: { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number }
|
|
322
|
+
filter: FilterArgs | { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number },
|
|
323
323
|
update: PlainObject<UpdateInput>,
|
|
324
324
|
serviceOptions?: ServiceOptions,
|
|
325
325
|
): Promise<Model[]> {
|
|
@@ -348,7 +348,7 @@ export abstract class CrudService<
|
|
|
348
348
|
* Warning: Disables the handling of rights and restrictions!
|
|
349
349
|
*/
|
|
350
350
|
async findAndUpdateForce(
|
|
351
|
-
filter: { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number }
|
|
351
|
+
filter: FilterArgs | { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number },
|
|
352
352
|
update: PlainObject<UpdateInput>,
|
|
353
353
|
serviceOptions: ServiceOptions = {},
|
|
354
354
|
): Promise<Model[]> {
|
|
@@ -362,7 +362,7 @@ export abstract class CrudService<
|
|
|
362
362
|
* Warning: Disables the handling of rights and restrictions! The raw data may contain secrets (such as passwords).
|
|
363
363
|
*/
|
|
364
364
|
async findAndUpdateRaw(
|
|
365
|
-
filter: { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number }
|
|
365
|
+
filter: FilterArgs | { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number },
|
|
366
366
|
update: PlainObject<UpdateInput>,
|
|
367
367
|
serviceOptions: ServiceOptions = {},
|
|
368
368
|
): Promise<Model[]> {
|
|
@@ -375,7 +375,7 @@ export abstract class CrudService<
|
|
|
375
375
|
* Find one item via filter
|
|
376
376
|
*/
|
|
377
377
|
async findOne(
|
|
378
|
-
filter?: { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions }
|
|
378
|
+
filter?: FilterArgs | { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions },
|
|
379
379
|
serviceOptions?: ServiceOptions,
|
|
380
380
|
): Promise<Model> {
|
|
381
381
|
// If filter is not instance of FilterArgs a simple form with filterQuery and queryOptions is set
|
|
@@ -414,7 +414,7 @@ export abstract class CrudService<
|
|
|
414
414
|
* Warning: Disables the handling of rights and restrictions!
|
|
415
415
|
*/
|
|
416
416
|
async findOneForce(
|
|
417
|
-
filter?: { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number }
|
|
417
|
+
filter?: FilterArgs | { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number },
|
|
418
418
|
serviceOptions: ServiceOptions = {},
|
|
419
419
|
): Promise<Model> {
|
|
420
420
|
serviceOptions = serviceOptions || {};
|
|
@@ -427,7 +427,7 @@ export abstract class CrudService<
|
|
|
427
427
|
* Warning: Disables the handling of rights and restrictions! The raw data may contain secrets (such as passwords).
|
|
428
428
|
*/
|
|
429
429
|
async findOneRaw(
|
|
430
|
-
filter?: { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number }
|
|
430
|
+
filter?: FilterArgs | { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions; samples?: number },
|
|
431
431
|
serviceOptions: ServiceOptions = {},
|
|
432
432
|
): Promise<Model> {
|
|
433
433
|
serviceOptions = serviceOptions || {};
|
|
@@ -452,7 +452,7 @@ export abstract class CrudService<
|
|
|
452
452
|
* CRUD alias for find
|
|
453
453
|
*/
|
|
454
454
|
async read(
|
|
455
|
-
filter: { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions }
|
|
455
|
+
filter: FilterArgs | { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions },
|
|
456
456
|
serviceOptions?: ServiceOptions,
|
|
457
457
|
): Promise<Model[]>;
|
|
458
458
|
|
|
@@ -460,7 +460,7 @@ export abstract class CrudService<
|
|
|
460
460
|
* CRUD alias for get or find
|
|
461
461
|
*/
|
|
462
462
|
async read(
|
|
463
|
-
input: { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions }
|
|
463
|
+
input: FilterArgs | string | { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions },
|
|
464
464
|
serviceOptions?: ServiceOptions,
|
|
465
465
|
): Promise<Model | Model[]> {
|
|
466
466
|
if (typeof input === 'string') {
|
|
@@ -481,7 +481,7 @@ export abstract class CrudService<
|
|
|
481
481
|
* Warning: Disables the handling of rights and restrictions!
|
|
482
482
|
*/
|
|
483
483
|
async readForce(
|
|
484
|
-
filter: { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions }
|
|
484
|
+
filter: FilterArgs | { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions },
|
|
485
485
|
serviceOptions?: ServiceOptions,
|
|
486
486
|
): Promise<Model[]>;
|
|
487
487
|
|
|
@@ -490,7 +490,7 @@ export abstract class CrudService<
|
|
|
490
490
|
* Warning: Disables the handling of rights and restrictions!
|
|
491
491
|
*/
|
|
492
492
|
async readForce(
|
|
493
|
-
input: { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions }
|
|
493
|
+
input: FilterArgs | string | { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions },
|
|
494
494
|
serviceOptions?: ServiceOptions,
|
|
495
495
|
): Promise<Model | Model[]> {
|
|
496
496
|
if (typeof input === 'string') {
|
|
@@ -511,7 +511,7 @@ export abstract class CrudService<
|
|
|
511
511
|
* Warning: Disables the handling of rights and restrictions! The raw data may contain secrets (such as passwords).
|
|
512
512
|
*/
|
|
513
513
|
async readRaw(
|
|
514
|
-
filter: { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions }
|
|
514
|
+
filter: FilterArgs | { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions },
|
|
515
515
|
serviceOptions?: ServiceOptions,
|
|
516
516
|
): Promise<Model[]>;
|
|
517
517
|
|
|
@@ -520,7 +520,7 @@ export abstract class CrudService<
|
|
|
520
520
|
* Warning: Disables the handling of rights and restrictions! The raw data may contain secrets (such as passwords).
|
|
521
521
|
*/
|
|
522
522
|
async readRaw(
|
|
523
|
-
input: { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions }
|
|
523
|
+
input: FilterArgs | string | { filterQuery?: FilterQuery<any>; queryOptions?: QueryOptions },
|
|
524
524
|
serviceOptions?: ServiceOptions,
|
|
525
525
|
): Promise<Model | Model[]> {
|
|
526
526
|
if (typeof input === 'string') {
|
|
@@ -75,18 +75,18 @@ export abstract class ModuleService<T extends CoreModel = any> {
|
|
|
75
75
|
serviceFunc: (options?: { [key: string]: any; input?: any; serviceOptions?: ServiceOptions }) => any,
|
|
76
76
|
options?: {
|
|
77
77
|
[key: string]: any;
|
|
78
|
-
dbObject?:
|
|
78
|
+
dbObject?: any | string | Types.ObjectId;
|
|
79
79
|
input?: any;
|
|
80
80
|
outputPath?: string | string[];
|
|
81
81
|
serviceOptions?: ServiceOptions;
|
|
82
82
|
},
|
|
83
83
|
) {
|
|
84
84
|
// Configuration with default values
|
|
85
|
-
const config: {
|
|
86
|
-
dbObject:
|
|
85
|
+
const config: ServiceOptions & {
|
|
86
|
+
dbObject: any | string | Types.ObjectId;
|
|
87
87
|
input: any;
|
|
88
88
|
outputPath: string | string[];
|
|
89
|
-
}
|
|
89
|
+
} = {
|
|
90
90
|
checkRights: true,
|
|
91
91
|
dbObject: options?.dbObject,
|
|
92
92
|
force: false,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Require only one of the optional properties
|
|
3
3
|
* See https://stackoverflow.com/a/49725198
|
|
4
4
|
*/
|
|
5
|
-
export type RequireOnlyOne<T, Keys extends keyof T = keyof T> =
|
|
5
|
+
export type RequireOnlyOne<T, Keys extends keyof T = keyof T> = Pick<T, Exclude<keyof T, Keys>> &
|
|
6
|
+
{
|
|
6
7
|
[K in Keys]-?: Partial<Record<Exclude<Keys, K>, undefined>> & Required<Pick<T, K>>;
|
|
7
|
-
}[Keys]
|
|
8
|
-
Pick<T, Exclude<keyof T, Keys>>;
|
|
8
|
+
}[Keys];
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Require at least on of optional properties
|
|
3
3
|
* See https://stackoverflow.com/a/49725198
|
|
4
4
|
*/
|
|
5
|
-
export type RequireAtLeastOne<T, Keys extends keyof T = keyof T> =
|
|
5
|
+
export type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Pick<T, Exclude<keyof T, Keys>> &
|
|
6
|
+
{
|
|
6
7
|
[K in Keys]-?: Partial<Pick<T, Exclude<Keys, K>>> & Required<Pick<T, K>>;
|
|
7
|
-
}[Keys]
|
|
8
|
-
Pick<T, Exclude<keyof T, Keys>>;
|
|
8
|
+
}[Keys];
|
|
@@ -3,4 +3,4 @@ import { Types } from 'mongoose';
|
|
|
3
3
|
/**
|
|
4
4
|
* Everything which will be used by getStringIds or getObjectIds (see helpers/db.helper.ts)
|
|
5
5
|
*/
|
|
6
|
-
export type StringOrObjectId<T = any> = T | Types.ObjectId
|
|
6
|
+
export type StringOrObjectId<T = any> = string | T | Types.ObjectId;
|
|
@@ -21,9 +21,9 @@ import { ICoreAuthUser } from './interfaces/core-auth-user.interface';
|
|
|
21
21
|
import { CoreAuthService } from './services/core-auth.service';
|
|
22
22
|
import { Tokens } from './tokens.decorator';
|
|
23
23
|
|
|
24
|
-
@Roles(RoleEnum.ADMIN)
|
|
25
|
-
@Controller('auth')
|
|
26
24
|
@ApiCommonErrorResponses()
|
|
25
|
+
@Controller('auth')
|
|
26
|
+
@Roles(RoleEnum.ADMIN)
|
|
27
27
|
export class CoreAuthController {
|
|
28
28
|
/**
|
|
29
29
|
* Import services
|
|
@@ -36,9 +36,9 @@ export class CoreAuthController {
|
|
|
36
36
|
/**
|
|
37
37
|
* Logout user (from specific device)
|
|
38
38
|
*/
|
|
39
|
+
@ApiOkResponse({ type: Boolean })
|
|
39
40
|
@ApiOperation({ description: 'Logs a user out from a specific device' })
|
|
40
41
|
@ApiQuery({ description: 'If all devices should be logged out,', name: 'allDevices', required: false, type: Boolean })
|
|
41
|
-
@ApiOkResponse({ type: Boolean })
|
|
42
42
|
@Get('logout')
|
|
43
43
|
@Roles(RoleEnum.S_EVERYONE)
|
|
44
44
|
@UseGuards(AuthGuard(AuthGuardStrategy.JWT))
|
|
@@ -55,8 +55,8 @@ export class CoreAuthController {
|
|
|
55
55
|
/**
|
|
56
56
|
* Refresh token (for specific device)
|
|
57
57
|
*/
|
|
58
|
-
@ApiOperation({ description: 'Refresh token (for specific device)' })
|
|
59
58
|
@ApiOkResponse({ type: CoreAuthModel })
|
|
59
|
+
@ApiOperation({ description: 'Refresh token (for specific device)' })
|
|
60
60
|
@Get('refresh-token')
|
|
61
61
|
@Roles(RoleEnum.S_EVERYONE)
|
|
62
62
|
@UseGuards(AuthGuard(AuthGuardStrategy.JWT_REFRESH))
|
|
@@ -72,8 +72,8 @@ export class CoreAuthController {
|
|
|
72
72
|
/**
|
|
73
73
|
* Sign in user via email and password (on specific device)
|
|
74
74
|
*/
|
|
75
|
-
@ApiOperation({ description: 'Sign in via email and password' })
|
|
76
75
|
@ApiCreatedResponse({ description: 'Signed in successfully', type: CoreAuthModel })
|
|
76
|
+
@ApiOperation({ description: 'Sign in via email and password' })
|
|
77
77
|
@Post('signin')
|
|
78
78
|
@Roles(RoleEnum.S_EVERYONE)
|
|
79
79
|
async signIn(@Res({ passthrough: true }) res: ResponseType, @Body() input: CoreAuthSignInInput): Promise<CoreAuthModel> {
|
|
@@ -85,8 +85,8 @@ export class CoreAuthController {
|
|
|
85
85
|
* Register a new user account (on specific device)
|
|
86
86
|
*/
|
|
87
87
|
@ApiBody({ type: CoreAuthSignUpInput })
|
|
88
|
-
@ApiOperation({ description: 'Sign up via email and password' })
|
|
89
88
|
@ApiCreatedResponse({ type: CoreAuthSignUpInput })
|
|
89
|
+
@ApiOperation({ description: 'Sign up via email and password' })
|
|
90
90
|
@Post('signup')
|
|
91
91
|
@Roles(RoleEnum.S_EVERYONE)
|
|
92
92
|
async signUp(@Res({ passthrough: true }) res: ResponseType, @Body() input: CoreAuthSignUpInput): Promise<CoreAuthModel> {
|
|
@@ -9,8 +9,8 @@ import { CoreUserModel } from '../user/core-user.model';
|
|
|
9
9
|
/**
|
|
10
10
|
* CoreAuth model for the response after the sign in
|
|
11
11
|
*/
|
|
12
|
-
@Restricted(RoleEnum.S_EVERYONE)
|
|
13
12
|
@ObjectType({ description: 'CoreAuth', isAbstract: true })
|
|
13
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
14
14
|
export class CoreAuthModel extends CoreModel {
|
|
15
15
|
// ===================================================================================================================
|
|
16
16
|
// Properties
|
|
@@ -6,10 +6,10 @@ import { PubSub } from 'graphql-subscriptions';
|
|
|
6
6
|
|
|
7
7
|
import { AuthGuardStrategy } from './auth-guard-strategy.enum';
|
|
8
8
|
import { RolesGuard } from './guards/roles.guard';
|
|
9
|
-
import { CoreAuthService } from './services/core-auth.service';
|
|
10
9
|
import { CoreAuthUserService } from './services/core-auth-user.service';
|
|
11
|
-
import {
|
|
10
|
+
import { CoreAuthService } from './services/core-auth.service';
|
|
12
11
|
import { JwtRefreshStrategy } from './strategies/jwt-refresh.strategy';
|
|
12
|
+
import { JwtStrategy } from './strategies/jwt.strategy';
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* CoreAuthModule to handle user authentication and enables Roles
|
|
@@ -23,13 +23,13 @@ export class CoreAuthModule {
|
|
|
23
23
|
static forRoot(
|
|
24
24
|
UserModule: Type<any>,
|
|
25
25
|
UserService: Type<CoreAuthUserService>,
|
|
26
|
-
options: {
|
|
26
|
+
options: JwtModuleOptions & {
|
|
27
27
|
authService?: Type<CoreAuthService>;
|
|
28
28
|
imports?: Array<DynamicModule | ForwardReference | Promise<DynamicModule> | Type<any>>;
|
|
29
29
|
jwtRefreshStrategy?: Type<JwtRefreshStrategy>;
|
|
30
30
|
jwtStrategy?: Type<JwtStrategy>;
|
|
31
31
|
providers?: Provider[];
|
|
32
|
-
}
|
|
32
|
+
},
|
|
33
33
|
): DynamicModule {
|
|
34
34
|
// Process imports
|
|
35
35
|
let imports: any[] = [
|
|
@@ -20,8 +20,8 @@ import { Tokens } from './tokens.decorator';
|
|
|
20
20
|
/**
|
|
21
21
|
* Authentication resolver for the sign in
|
|
22
22
|
*/
|
|
23
|
+
@Resolver(() => CoreAuthModel, { isAbstract: true })
|
|
23
24
|
@Roles(RoleEnum.ADMIN)
|
|
24
|
-
@Resolver(of => CoreAuthModel, { isAbstract: true })
|
|
25
25
|
export class CoreAuthResolver {
|
|
26
26
|
/**
|
|
27
27
|
* Import services
|
|
@@ -38,9 +38,9 @@ export class CoreAuthResolver {
|
|
|
38
38
|
/**
|
|
39
39
|
* Logout user (from specific device)
|
|
40
40
|
*/
|
|
41
|
+
@Mutation(() => Boolean, { description: 'Logout user (from specific device)' })
|
|
41
42
|
@Roles(RoleEnum.S_EVERYONE)
|
|
42
43
|
@UseGuards(AuthGuard(AuthGuardStrategy.JWT))
|
|
43
|
-
@Mutation(returns => Boolean, { description: 'Logout user (from specific device)' })
|
|
44
44
|
async logout(
|
|
45
45
|
@CurrentUser() currentUser: ICoreAuthUser,
|
|
46
46
|
@Context() ctx: { res: ResponseType },
|
|
@@ -54,9 +54,9 @@ export class CoreAuthResolver {
|
|
|
54
54
|
/**
|
|
55
55
|
* Refresh token (for specific device)
|
|
56
56
|
*/
|
|
57
|
+
@Mutation(() => CoreAuthModel, { description: 'Refresh tokens (for specific device)' })
|
|
57
58
|
@Roles(RoleEnum.S_EVERYONE)
|
|
58
59
|
@UseGuards(AuthGuard(AuthGuardStrategy.JWT_REFRESH))
|
|
59
|
-
@Mutation(returns => CoreAuthModel, { description: 'Refresh tokens (for specific device)' })
|
|
60
60
|
async refreshToken(
|
|
61
61
|
@CurrentUser() user: ICoreAuthUser,
|
|
62
62
|
@Tokens('refreshToken') refreshToken: string,
|
|
@@ -69,10 +69,10 @@ export class CoreAuthResolver {
|
|
|
69
69
|
/**
|
|
70
70
|
* Sign in user via email and password (on specific device)
|
|
71
71
|
*/
|
|
72
|
-
@
|
|
73
|
-
@Mutation(returns => CoreAuthModel, {
|
|
72
|
+
@Mutation(() => CoreAuthModel, {
|
|
74
73
|
description: 'Sign in user via email and password and get JWT tokens (for specific device)',
|
|
75
74
|
})
|
|
75
|
+
@Roles(RoleEnum.S_EVERYONE)
|
|
76
76
|
async signIn(
|
|
77
77
|
@GraphQLServiceOptions({ gqlPath: 'signIn.user' }) serviceOptions: ServiceOptions,
|
|
78
78
|
@Context() ctx: { res: ResponseType },
|
|
@@ -85,8 +85,8 @@ export class CoreAuthResolver {
|
|
|
85
85
|
/**
|
|
86
86
|
* Register a new user account (on specific device)
|
|
87
87
|
*/
|
|
88
|
+
@Mutation(() => CoreAuthModel, { description: 'Register a new user account (on specific device)' })
|
|
88
89
|
@Roles(RoleEnum.S_EVERYONE)
|
|
89
|
-
@Mutation(returns => CoreAuthModel, { description: 'Register a new user account (on specific device)' })
|
|
90
90
|
async signUp(
|
|
91
91
|
@GraphQLServiceOptions({ gqlPath: 'signUp.user' }) serviceOptions: ServiceOptions,
|
|
92
92
|
@Context() ctx: { res: ResponseType },
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CanActivate, ExecutionContext, Logger,
|
|
1
|
+
import { CanActivate, ExecutionContext, Logger, mixin, Optional } from '@nestjs/common';
|
|
2
2
|
import { GqlExecutionContext } from '@nestjs/graphql';
|
|
3
3
|
import { AuthModuleOptions, Type } from '@nestjs/passport';
|
|
4
4
|
import { defaultOptions } from '@nestjs/passport/dist/options';
|
|
@@ -21,9 +21,9 @@ const NO_STRATEGY_ERROR
|
|
|
21
21
|
/**
|
|
22
22
|
* Interface for auth guard
|
|
23
23
|
*/
|
|
24
|
-
export type IAuthGuard = {
|
|
24
|
+
export type IAuthGuard = CanActivate & {
|
|
25
25
|
handleRequest<TUser = any>(err, user, info, context): TUser;
|
|
26
|
-
}
|
|
26
|
+
};
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
29
|
* Create passport context
|
|
@@ -9,8 +9,8 @@ import { CoreInput } from '../../../common/inputs/core-input.input';
|
|
|
9
9
|
/**
|
|
10
10
|
* SignIn input
|
|
11
11
|
*/
|
|
12
|
-
@Restricted(RoleEnum.S_EVERYONE)
|
|
13
12
|
@InputType({ description: 'Sign-in input' })
|
|
13
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
14
14
|
export class CoreAuthSignInInput extends CoreInput {
|
|
15
15
|
// ===================================================================================================================
|
|
16
16
|
// Properties
|
|
@@ -7,6 +7,6 @@ import { CoreAuthSignInInput } from './core-auth-sign-in.input';
|
|
|
7
7
|
/**
|
|
8
8
|
* SignUp input
|
|
9
9
|
*/
|
|
10
|
-
@Restricted(RoleEnum.S_EVERYONE)
|
|
11
10
|
@InputType({ description: 'Sign-up input' })
|
|
11
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
12
12
|
export class CoreAuthSignUpInput extends CoreAuthSignInInput {}
|
|
@@ -42,7 +42,7 @@ export class CoreAuthService {
|
|
|
42
42
|
*/
|
|
43
43
|
async logout(
|
|
44
44
|
tokenOrRefreshToken: string,
|
|
45
|
-
serviceOptions: { allDevices?: boolean }
|
|
45
|
+
serviceOptions: ServiceOptions & { allDevices?: boolean },
|
|
46
46
|
): Promise<boolean> {
|
|
47
47
|
// Check authentication
|
|
48
48
|
const user = serviceOptions.currentUser;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
|
|
2
2
|
|
|
3
3
|
import { getContextData } from '../../common/helpers/context.helper';
|
|
4
4
|
|
|
@@ -9,7 +9,7 @@ export const Tokens = createParamDecorator(
|
|
|
9
9
|
(
|
|
10
10
|
tokenId: 'refreshToken' | 'token' | undefined,
|
|
11
11
|
ctx: ExecutionContext,
|
|
12
|
-
): { refreshToken: string; token: string }
|
|
12
|
+
): string | { refreshToken: string; token: string } => {
|
|
13
13
|
// Get prepared context (REST or GraphQL)
|
|
14
14
|
const context = getContextData(ctx);
|
|
15
15
|
|
|
@@ -9,8 +9,8 @@ import { CoreModel } from '../../common/models/core-model.model';
|
|
|
9
9
|
/**
|
|
10
10
|
* File info
|
|
11
11
|
*/
|
|
12
|
-
@Restricted(RoleEnum.S_EVERYONE)
|
|
13
12
|
@ObjectType({ description: 'Information about file' })
|
|
13
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
14
14
|
export class CoreFileInfo extends CoreModel {
|
|
15
15
|
// ===========================================================================
|
|
16
16
|
// Getter
|
|
@@ -25,11 +25,10 @@ export class CoreFileInfo extends CoreModel {
|
|
|
25
25
|
// Properties
|
|
26
26
|
// ===========================================================================
|
|
27
27
|
|
|
28
|
-
@Restricted(RoleEnum.S_EVERYONE)
|
|
29
28
|
@Field(() => String, { description: 'ID of the file' })
|
|
29
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
30
30
|
id: string = undefined;
|
|
31
31
|
|
|
32
|
-
@Restricted(RoleEnum.S_EVERYONE)
|
|
33
32
|
@Field(() => Number, {
|
|
34
33
|
description:
|
|
35
34
|
'The size of each chunk in bytes. GridFS divides the document into chunks of size chunkSize, '
|
|
@@ -37,25 +36,26 @@ export class CoreFileInfo extends CoreModel {
|
|
|
37
36
|
nullable: true,
|
|
38
37
|
})
|
|
39
38
|
@Prop({ required: false, type: Number })
|
|
39
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
40
40
|
chunkSize: number = undefined;
|
|
41
41
|
|
|
42
|
-
@Restricted(RoleEnum.S_EVERYONE)
|
|
43
42
|
@Field(() => String, { description: 'Content type', nullable: true })
|
|
44
43
|
@Prop({ required: false, type: String })
|
|
44
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
45
45
|
contentType?: string = undefined;
|
|
46
46
|
|
|
47
|
-
@Restricted(RoleEnum.S_EVERYONE)
|
|
48
47
|
@Field(() => String, { description: 'Name of the file', nullable: true })
|
|
49
48
|
@Prop({ required: false, type: String })
|
|
49
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
50
50
|
filename?: string = undefined;
|
|
51
51
|
|
|
52
|
-
@Restricted(RoleEnum.S_EVERYONE)
|
|
53
52
|
@Field(() => Number, { description: 'The size of the document in bytes', nullable: true })
|
|
54
53
|
@Prop({ required: false, type: Number })
|
|
54
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
55
55
|
length: number = undefined;
|
|
56
56
|
|
|
57
|
-
@Restricted(RoleEnum.S_EVERYONE)
|
|
58
57
|
@Field(() => Date, { description: 'The date the file was first stored', nullable: true })
|
|
59
58
|
@Prop({ required: false, type: Date })
|
|
59
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
60
60
|
uploadDate: Date = undefined;
|
|
61
61
|
}
|
|
@@ -7,8 +7,8 @@ import { CoreFileService } from './core-file.service';
|
|
|
7
7
|
/**
|
|
8
8
|
* File controller
|
|
9
9
|
*/
|
|
10
|
-
@Roles(RoleEnum.ADMIN)
|
|
11
10
|
@Controller('files')
|
|
11
|
+
@Roles(RoleEnum.ADMIN)
|
|
12
12
|
export abstract class CoreFileController {
|
|
13
13
|
/**
|
|
14
14
|
* Include services
|
|
@@ -18,8 +18,8 @@ export abstract class CoreFileController {
|
|
|
18
18
|
/**
|
|
19
19
|
* Download file
|
|
20
20
|
*/
|
|
21
|
-
@Roles(RoleEnum.S_EVERYONE)
|
|
22
21
|
@Get(':filename')
|
|
22
|
+
@Roles(RoleEnum.S_EVERYONE)
|
|
23
23
|
async getFile(@Param('filename') filename: string, @Res() res) {
|
|
24
24
|
if (!filename) {
|
|
25
25
|
throw new BadRequestException('Missing filename for download');
|
|
@@ -3,15 +3,15 @@ import * as GraphQLUpload from 'graphql-upload/GraphQLUpload.js';
|
|
|
3
3
|
|
|
4
4
|
import { Roles } from '../../common/decorators/roles.decorator';
|
|
5
5
|
import { RoleEnum } from '../../common/enums/role.enum';
|
|
6
|
-
import { CoreFileService } from './core-file.service';
|
|
7
6
|
import { CoreFileInfo } from './core-file-info.model';
|
|
7
|
+
import { CoreFileService } from './core-file.service';
|
|
8
8
|
import { FileUpload } from './interfaces/file-upload.interface';
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* File resolver
|
|
12
12
|
*/
|
|
13
|
-
@Roles(RoleEnum.ADMIN)
|
|
14
13
|
@Resolver()
|
|
14
|
+
@Roles(RoleEnum.ADMIN)
|
|
15
15
|
export class CoreFileResolver {
|
|
16
16
|
/**
|
|
17
17
|
* Integrate services
|
|
@@ -25,8 +25,8 @@ export class CoreFileResolver {
|
|
|
25
25
|
/**
|
|
26
26
|
* Get file info
|
|
27
27
|
*/
|
|
28
|
-
@Roles(RoleEnum.S_EVERYONE)
|
|
29
28
|
@Query(() => CoreFileInfo, { nullable: true })
|
|
29
|
+
@Roles(RoleEnum.S_EVERYONE)
|
|
30
30
|
async getFileInfo(@Args({ name: 'filename', type: () => String }) filename: string): Promise<any> {
|
|
31
31
|
return await this.fileService.getFileInfoByName(filename);
|
|
32
32
|
}
|
|
@@ -38,8 +38,8 @@ export class CoreFileResolver {
|
|
|
38
38
|
/**
|
|
39
39
|
* Delete file
|
|
40
40
|
*/
|
|
41
|
-
@Roles(RoleEnum.S_EVERYONE)
|
|
42
41
|
@Mutation(() => CoreFileInfo)
|
|
42
|
+
@Roles(RoleEnum.S_EVERYONE)
|
|
43
43
|
async deleteFile(@Args({ name: 'filename', type: () => String }) filename: string): Promise<any> {
|
|
44
44
|
return await this.fileService.deleteFileByName(filename);
|
|
45
45
|
}
|
|
@@ -47,8 +47,8 @@ export class CoreFileResolver {
|
|
|
47
47
|
/**
|
|
48
48
|
* Upload file
|
|
49
49
|
*/
|
|
50
|
-
@Roles(RoleEnum.S_EVERYONE)
|
|
51
50
|
@Mutation(() => CoreFileInfo)
|
|
51
|
+
@Roles(RoleEnum.S_EVERYONE)
|
|
52
52
|
async uploadFile(@Args({ name: 'file', type: () => GraphQLUpload }) file: FileUpload): Promise<any> {
|
|
53
53
|
return await this.fileService.createFile(file);
|
|
54
54
|
}
|
|
@@ -56,8 +56,8 @@ export class CoreFileResolver {
|
|
|
56
56
|
/**
|
|
57
57
|
* Upload files
|
|
58
58
|
*/
|
|
59
|
-
@Roles(RoleEnum.S_EVERYONE)
|
|
60
59
|
@Mutation(() => [CoreFileInfo])
|
|
60
|
+
@Roles(RoleEnum.S_EVERYONE)
|
|
61
61
|
async uploadFiles(@Args({ name: 'files', type: () => [GraphQLUpload] }) files: FileUpload[]): Promise<any> {
|
|
62
62
|
return await this.fileService.createFiles(files);
|
|
63
63
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MongoGridFSOptions, MongooseGridFS
|
|
1
|
+
import { createBucket, MongoGridFSOptions, MongooseGridFS } from '@lenne.tech/mongoose-gridfs';
|
|
2
2
|
import { NotFoundException } from '@nestjs/common';
|
|
3
3
|
import { GridFSBucket, GridFSBucketReadStream, GridFSBucketReadStreamOptions } from 'mongodb';
|
|
4
4
|
import mongoose, { Connection, Types } from 'mongoose';
|
|
@@ -127,7 +127,7 @@ export abstract class CoreFileService {
|
|
|
127
127
|
/**
|
|
128
128
|
* Get info about file via file ID
|
|
129
129
|
*/
|
|
130
|
-
async getFileInfo(id: Types.ObjectId
|
|
130
|
+
async getFileInfo(id: string | Types.ObjectId, serviceOptions?: FileServiceOptions): Promise<CoreFileInfo> {
|
|
131
131
|
if (!(await this.checkRights(id, { ...serviceOptions, checkInputType: 'id' }))) {
|
|
132
132
|
return null;
|
|
133
133
|
}
|
|
@@ -155,7 +155,7 @@ export abstract class CoreFileService {
|
|
|
155
155
|
/**
|
|
156
156
|
* Get file stream (for big files) via file ID
|
|
157
157
|
*/
|
|
158
|
-
async getFileStream(id: Types.ObjectId
|
|
158
|
+
async getFileStream(id: string | Types.ObjectId, serviceOptions?: FileServiceOptions) {
|
|
159
159
|
if (!(await this.checkRights(id, { ...serviceOptions, checkInputType: 'id' }))) {
|
|
160
160
|
return null;
|
|
161
161
|
}
|
|
@@ -178,7 +178,7 @@ export abstract class CoreFileService {
|
|
|
178
178
|
/**
|
|
179
179
|
* Get file buffer (for small files) via file ID
|
|
180
180
|
*/
|
|
181
|
-
async getBuffer(id: Types.ObjectId
|
|
181
|
+
async getBuffer(id: string | Types.ObjectId, serviceOptions?: FileServiceOptions): Promise<Buffer> {
|
|
182
182
|
if (!(await this.checkRights(id, { ...serviceOptions, checkInputType: 'id' }))) {
|
|
183
183
|
return null;
|
|
184
184
|
}
|
|
@@ -206,7 +206,7 @@ export abstract class CoreFileService {
|
|
|
206
206
|
/**
|
|
207
207
|
* Delete file reference of avatar
|
|
208
208
|
*/
|
|
209
|
-
async deleteFile(id: Types.ObjectId
|
|
209
|
+
async deleteFile(id: string | Types.ObjectId, serviceOptions?: FileServiceOptions): Promise<CoreFileInfo> {
|
|
210
210
|
if (!(await this.checkRights(id, { ...serviceOptions, checkInputType: 'id' }))) {
|
|
211
211
|
return null;
|
|
212
212
|
}
|
|
@@ -241,7 +241,7 @@ export abstract class CoreFileService {
|
|
|
241
241
|
*/
|
|
242
242
|
protected checkRights(
|
|
243
243
|
input: any, // eslint-disable-line unused-imports/no-unused-vars
|
|
244
|
-
options?: { checkInputType: FileInputCheckType }
|
|
244
|
+
options?: FileServiceOptions & { checkInputType: FileInputCheckType }, // eslint-disable-line unused-imports/no-unused-vars
|
|
245
245
|
): MaybePromise<boolean> {
|
|
246
246
|
return true;
|
|
247
247
|
}
|