@lenne.tech/nest-server 10.3.0 → 10.3.2
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/config.env.js +24 -3
- package/dist/config.env.js.map +1 -1
- package/dist/core/common/decorators/restricted.decorator.d.ts +1 -0
- package/dist/core/common/decorators/restricted.decorator.js +5 -2
- package/dist/core/common/decorators/restricted.decorator.js.map +1 -1
- package/dist/core/common/inputs/combined-filter.input.js +5 -0
- package/dist/core/common/inputs/combined-filter.input.js.map +1 -1
- package/dist/core/common/inputs/filter.input.js +5 -0
- package/dist/core/common/inputs/filter.input.js.map +1 -1
- package/dist/core/common/inputs/single-filter.input.js +10 -0
- package/dist/core/common/inputs/single-filter.input.js.map +1 -1
- package/dist/core/common/inputs/sort.input.js +5 -0
- package/dist/core/common/inputs/sort.input.js.map +1 -1
- package/dist/core/common/interceptors/check-response.interceptor.d.ts +11 -0
- package/dist/core/common/interceptors/check-response.interceptor.js +22 -2
- package/dist/core/common/interceptors/check-response.interceptor.js.map +1 -1
- package/dist/core/common/interfaces/server-options.interface.d.ts +8 -1
- package/dist/core/common/models/core-persistence.model.js +13 -0
- package/dist/core/common/models/core-persistence.model.js.map +1 -1
- package/dist/core/modules/auth/core-auth.controller.js +7 -0
- package/dist/core/modules/auth/core-auth.controller.js.map +1 -1
- package/dist/core/modules/auth/core-auth.model.js +6 -0
- package/dist/core/modules/auth/core-auth.model.js.map +1 -1
- package/dist/core/modules/auth/core-auth.resolver.js +7 -0
- package/dist/core/modules/auth/core-auth.resolver.js.map +1 -1
- package/dist/core/modules/auth/inputs/core-auth-sign-in.input.js +7 -0
- 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 +3 -0
- package/dist/core/modules/auth/inputs/core-auth-sign-up.input.js.map +1 -1
- package/dist/core/modules/file/core-file-info.model.js +14 -0
- package/dist/core/modules/file/core-file-info.model.js.map +1 -1
- package/dist/core/modules/file/core-file.controller.js +4 -0
- package/dist/core/modules/file/core-file.controller.js.map +1 -1
- package/dist/core/modules/file/core-file.resolver.js +7 -0
- package/dist/core/modules/file/core-file.resolver.js.map +1 -1
- package/dist/core/modules/health-check/core-health-check-result.model.js +7 -0
- 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 +4 -0
- package/dist/core/modules/health-check/core-health-check.controller.js.map +1 -1
- package/dist/core/modules/user/core-user.model.js +15 -0
- package/dist/core/modules/user/core-user.model.js.map +1 -1
- package/dist/core/modules/user/inputs/core-user-create.input.js +4 -0
- package/dist/core/modules/user/inputs/core-user-create.input.js.map +1 -1
- package/dist/core/modules/user/inputs/core-user.input.js +6 -0
- package/dist/core/modules/user/inputs/core-user.input.js.map +1 -1
- package/dist/server/common/models/persistence.model.js +5 -0
- package/dist/server/common/models/persistence.model.js.map +1 -1
- package/dist/server/modules/auth/auth.controller.js +3 -0
- package/dist/server/modules/auth/auth.controller.js.map +1 -1
- package/dist/server/modules/auth/auth.model.js +4 -0
- package/dist/server/modules/auth/auth.model.js.map +1 -1
- package/dist/server/modules/auth/auth.resolver.js +5 -0
- package/dist/server/modules/auth/auth.resolver.js.map +1 -1
- package/dist/server/modules/auth/inputs/auth-sign-in.input.js +3 -0
- 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 +5 -0
- package/dist/server/modules/auth/inputs/auth-sign-up.input.js.map +1 -1
- package/dist/server/modules/file/file-info.model.js +3 -0
- package/dist/server/modules/file/file-info.model.js.map +1 -1
- package/dist/server/modules/file/file.controller.js +4 -0
- package/dist/server/modules/file/file.controller.js.map +1 -1
- package/dist/server/modules/user/avatar.controller.js +1 -0
- package/dist/server/modules/user/avatar.controller.js.map +1 -1
- package/dist/server/modules/user/inputs/user-create.input.js +3 -0
- package/dist/server/modules/user/inputs/user-create.input.js.map +1 -1
- package/dist/server/modules/user/inputs/user.input.js +3 -0
- 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 +5 -0
- package/dist/server/modules/user/outputs/find-and-count-users-result.output.js.map +1 -1
- package/dist/server/modules/user/user.model.d.ts +1 -0
- package/dist/server/modules/user/user.model.js +14 -0
- package/dist/server/modules/user/user.model.js.map +1 -1
- package/dist/server/server.controller.js +2 -0
- package/dist/server/server.controller.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/config.env.ts +24 -3
- package/src/core/common/decorators/restricted.decorator.ts +8 -2
- package/src/core/common/inputs/combined-filter.input.ts +5 -0
- package/src/core/common/inputs/filter.input.ts +5 -0
- package/src/core/common/inputs/single-filter.input.ts +10 -0
- package/src/core/common/inputs/sort.input.ts +5 -0
- package/src/core/common/interceptors/check-response.interceptor.ts +18 -1
- package/src/core/common/interfaces/server-options.interface.ts +40 -2
- package/src/core/common/models/core-persistence.model.ts +9 -0
- package/src/core/modules/auth/core-auth.controller.ts +7 -0
- package/src/core/modules/auth/core-auth.model.ts +6 -0
- package/src/core/modules/auth/core-auth.resolver.ts +7 -0
- package/src/core/modules/auth/inputs/core-auth-sign-in.input.ts +7 -0
- package/src/core/modules/auth/inputs/core-auth-sign-up.input.ts +3 -0
- package/src/core/modules/file/core-file-info.model.ts +10 -0
- package/src/core/modules/file/core-file.controller.ts +4 -0
- package/src/core/modules/file/core-file.resolver.ts +7 -0
- package/src/core/modules/health-check/core-health-check-result.model.ts +7 -0
- package/src/core/modules/health-check/core-health-check.controller.ts +4 -0
- package/src/core/modules/user/core-user.model.ts +15 -0
- package/src/core/modules/user/inputs/core-user-create.input.ts +4 -0
- package/src/core/modules/user/inputs/core-user.input.ts +6 -0
- package/src/server/common/models/persistence.model.ts +5 -0
- package/src/server/modules/auth/auth.controller.ts +3 -0
- package/src/server/modules/auth/auth.model.ts +4 -0
- package/src/server/modules/auth/auth.resolver.ts +5 -0
- package/src/server/modules/auth/inputs/auth-sign-in.input.ts +3 -0
- package/src/server/modules/auth/inputs/auth-sign-up.input.ts +5 -0
- package/src/server/modules/file/file-info.model.ts +3 -0
- package/src/server/modules/file/file.controller.ts +4 -0
- package/src/server/modules/user/avatar.controller.ts +1 -0
- package/src/server/modules/user/inputs/user-create.input.ts +3 -0
- package/src/server/modules/user/inputs/user.input.ts +3 -0
- package/src/server/modules/user/outputs/find-and-count-users-result.output.ts +5 -0
- package/src/server/modules/user/user.model.ts +15 -0
- package/src/server/server.controller.ts +2 -0
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { Args, Mutation, Query, Resolver } from '@nestjs/graphql';
|
|
2
2
|
import * as GraphQLUpload from 'graphql-upload/GraphQLUpload.js';
|
|
3
3
|
|
|
4
|
+
import { Roles } from '../../common/decorators/roles.decorator';
|
|
5
|
+
import { RoleEnum } from '../../common/enums/role.enum';
|
|
4
6
|
import { CoreFileService } from './core-file.service';
|
|
5
7
|
import { CoreFileInfo } from './core-file-info.model';
|
|
6
8
|
import { FileUpload } from './interfaces/file-upload.interface';
|
|
@@ -8,6 +10,7 @@ import { FileUpload } from './interfaces/file-upload.interface';
|
|
|
8
10
|
/**
|
|
9
11
|
* File resolver
|
|
10
12
|
*/
|
|
13
|
+
@Roles(RoleEnum.ADMIN)
|
|
11
14
|
@Resolver()
|
|
12
15
|
export class CoreFileResolver {
|
|
13
16
|
/**
|
|
@@ -22,6 +25,7 @@ export class CoreFileResolver {
|
|
|
22
25
|
/**
|
|
23
26
|
* Get file info
|
|
24
27
|
*/
|
|
28
|
+
@Roles(RoleEnum.S_EVERYONE)
|
|
25
29
|
@Query(() => CoreFileInfo, { nullable: true })
|
|
26
30
|
async getFileInfo(@Args({ name: 'filename', type: () => String }) filename: string): Promise<any> {
|
|
27
31
|
return await this.fileService.getFileInfoByName(filename);
|
|
@@ -34,6 +38,7 @@ export class CoreFileResolver {
|
|
|
34
38
|
/**
|
|
35
39
|
* Delete file
|
|
36
40
|
*/
|
|
41
|
+
@Roles(RoleEnum.S_EVERYONE)
|
|
37
42
|
@Mutation(() => CoreFileInfo)
|
|
38
43
|
async deleteFile(@Args({ name: 'filename', type: () => String }) filename: string): Promise<any> {
|
|
39
44
|
return await this.fileService.deleteFileByName(filename);
|
|
@@ -42,6 +47,7 @@ export class CoreFileResolver {
|
|
|
42
47
|
/**
|
|
43
48
|
* Upload file
|
|
44
49
|
*/
|
|
50
|
+
@Roles(RoleEnum.S_EVERYONE)
|
|
45
51
|
@Mutation(() => CoreFileInfo)
|
|
46
52
|
async uploadFile(@Args({ name: 'file', type: () => GraphQLUpload }) file: FileUpload): Promise<any> {
|
|
47
53
|
return await this.fileService.createFile(file);
|
|
@@ -50,6 +56,7 @@ export class CoreFileResolver {
|
|
|
50
56
|
/**
|
|
51
57
|
* Upload files
|
|
52
58
|
*/
|
|
59
|
+
@Roles(RoleEnum.S_EVERYONE)
|
|
53
60
|
@Mutation(() => [CoreFileInfo])
|
|
54
61
|
async uploadFiles(@Args({ name: 'files', type: () => [GraphQLUpload] }) files: FileUpload[]): Promise<any> {
|
|
55
62
|
return await this.fileService.createFiles(files);
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { Field, ObjectType } from '@nestjs/graphql';
|
|
2
2
|
|
|
3
|
+
import { Restricted } from '../../common/decorators/restricted.decorator';
|
|
4
|
+
import { RoleEnum } from '../../common/enums/role.enum';
|
|
3
5
|
import { CoreModel } from '../../common/models/core-model.model';
|
|
4
6
|
import { JSON } from '../../common/scalars/json.scalar';
|
|
5
7
|
|
|
6
8
|
/**
|
|
7
9
|
* User model
|
|
8
10
|
*/
|
|
11
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
9
12
|
@ObjectType({ description: 'Health check result' })
|
|
10
13
|
export abstract class CoreHealthCheckResult extends CoreModel {
|
|
11
14
|
// ===================================================================================================================
|
|
@@ -15,12 +18,14 @@ export abstract class CoreHealthCheckResult extends CoreModel {
|
|
|
15
18
|
/**
|
|
16
19
|
* The overall status of the Health Check
|
|
17
20
|
*/
|
|
21
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
18
22
|
@Field({ description: 'The overall status of the Health Check', nullable: false })
|
|
19
23
|
status: 'error' | 'ok' | 'shutting_down' = undefined;
|
|
20
24
|
|
|
21
25
|
/**
|
|
22
26
|
* The info object contains information of each health indicator which is of status “up”
|
|
23
27
|
*/
|
|
28
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
24
29
|
@Field(type => JSON, {
|
|
25
30
|
description: 'The info object contains information of each health indicator which is of status “up”',
|
|
26
31
|
nullable: true,
|
|
@@ -30,6 +35,7 @@ export abstract class CoreHealthCheckResult extends CoreModel {
|
|
|
30
35
|
/**
|
|
31
36
|
* The error object contains information of each health indicator which is of status “down”
|
|
32
37
|
*/
|
|
38
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
33
39
|
@Field(type => JSON, {
|
|
34
40
|
description: 'The error object contains information of each health indicator which is of status “down”',
|
|
35
41
|
nullable: true,
|
|
@@ -39,6 +45,7 @@ export abstract class CoreHealthCheckResult extends CoreModel {
|
|
|
39
45
|
/**
|
|
40
46
|
* The details object contains information of every health indicator
|
|
41
47
|
*/
|
|
48
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
42
49
|
@Field(type => JSON, {
|
|
43
50
|
description: 'The details object contains information of every health indicator',
|
|
44
51
|
nullable: false,
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { Controller, Get } from '@nestjs/common';
|
|
2
2
|
|
|
3
|
+
import { Roles } from '../../common/decorators/roles.decorator';
|
|
4
|
+
import { RoleEnum } from '../../common/enums/role.enum';
|
|
3
5
|
import { CoreHealthCheckService } from './core-health-check.service';
|
|
4
6
|
|
|
5
7
|
/**
|
|
6
8
|
* The HealthController class checks the health of various components including the database, memory, and disk.
|
|
7
9
|
* Inspired by https://mobileappcircular.com/marketplace-backend-creating-a-health-check-endpoint-in-nestjs-app-using-terminus-25727e96c7d2
|
|
8
10
|
*/
|
|
11
|
+
@Roles(RoleEnum.ADMIN)
|
|
9
12
|
@Controller()
|
|
10
13
|
export class CoreHealthCheckController {
|
|
11
14
|
constructor(protected readonly healthCheckService: CoreHealthCheckService) {}
|
|
@@ -18,6 +21,7 @@ export class CoreHealthCheckController {
|
|
|
18
21
|
* storage. The `healthCheck()` method will return a Promise that resolves with an array of objects
|
|
19
22
|
* representing the results of each check
|
|
20
23
|
*/
|
|
24
|
+
@Roles(RoleEnum.S_EVERYONE)
|
|
21
25
|
@Get('health-check')
|
|
22
26
|
async healthCheck() {
|
|
23
27
|
return this.healthCheckService.healthCheck();
|
|
@@ -3,6 +3,8 @@ import { Schema as MongooseSchema, Prop, raw } from '@nestjs/mongoose';
|
|
|
3
3
|
import { IsEmail, IsOptional } from 'class-validator';
|
|
4
4
|
import { Document } from 'mongoose';
|
|
5
5
|
|
|
6
|
+
import { Restricted } from '../../common/decorators/restricted.decorator';
|
|
7
|
+
import { RoleEnum } from '../../common/enums/role.enum';
|
|
6
8
|
import { CorePersistenceModel } from '../../common/models/core-persistence.model';
|
|
7
9
|
import { CoreTokenData } from '../auth/interfaces/core-token-data.interface';
|
|
8
10
|
|
|
@@ -11,6 +13,7 @@ export type CoreUserModelDocument = CoreUserModel & Document;
|
|
|
11
13
|
/**
|
|
12
14
|
* User model
|
|
13
15
|
*/
|
|
16
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
14
17
|
@ObjectType({ description: 'User', isAbstract: true })
|
|
15
18
|
@MongooseSchema({ timestamps: true })
|
|
16
19
|
export abstract class CoreUserModel extends CorePersistenceModel {
|
|
@@ -21,6 +24,7 @@ export abstract class CoreUserModel extends CorePersistenceModel {
|
|
|
21
24
|
/**
|
|
22
25
|
* E-Mail address of the user
|
|
23
26
|
*/
|
|
27
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
24
28
|
@Field({ description: 'Email of the user', nullable: true })
|
|
25
29
|
@IsEmail()
|
|
26
30
|
@Prop({ lowercase: true, trim: true, unique: true })
|
|
@@ -29,6 +33,7 @@ export abstract class CoreUserModel extends CorePersistenceModel {
|
|
|
29
33
|
/**
|
|
30
34
|
* First name of the user
|
|
31
35
|
*/
|
|
36
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
32
37
|
@Field({ description: 'First name of the user', nullable: true })
|
|
33
38
|
@IsOptional()
|
|
34
39
|
@Prop()
|
|
@@ -37,6 +42,7 @@ export abstract class CoreUserModel extends CorePersistenceModel {
|
|
|
37
42
|
/**
|
|
38
43
|
* Last name of the user
|
|
39
44
|
*/
|
|
45
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
40
46
|
@Field({ description: 'Last name of the user', nullable: true })
|
|
41
47
|
@IsOptional()
|
|
42
48
|
@Prop()
|
|
@@ -45,12 +51,14 @@ export abstract class CoreUserModel extends CorePersistenceModel {
|
|
|
45
51
|
/**
|
|
46
52
|
* Password of the user
|
|
47
53
|
*/
|
|
54
|
+
@Restricted(RoleEnum.S_NO_ONE)
|
|
48
55
|
@Prop()
|
|
49
56
|
password: string = undefined;
|
|
50
57
|
|
|
51
58
|
/**
|
|
52
59
|
* Roles of the user
|
|
53
60
|
*/
|
|
61
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
54
62
|
@Field(type => [String], { description: 'Roles of the user', nullable: true })
|
|
55
63
|
@IsOptional()
|
|
56
64
|
@Prop([String])
|
|
@@ -59,6 +67,7 @@ export abstract class CoreUserModel extends CorePersistenceModel {
|
|
|
59
67
|
/**
|
|
60
68
|
* Username of the user
|
|
61
69
|
*/
|
|
70
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
62
71
|
@Field({ description: 'Username of the user', nullable: true })
|
|
63
72
|
@IsOptional()
|
|
64
73
|
@Prop()
|
|
@@ -67,6 +76,7 @@ export abstract class CoreUserModel extends CorePersistenceModel {
|
|
|
67
76
|
/**
|
|
68
77
|
* Password reset token of the user
|
|
69
78
|
*/
|
|
79
|
+
@Restricted(RoleEnum.S_NO_ONE)
|
|
70
80
|
@IsOptional()
|
|
71
81
|
@Prop()
|
|
72
82
|
passwordResetToken: string = undefined;
|
|
@@ -76,6 +86,7 @@ export abstract class CoreUserModel extends CorePersistenceModel {
|
|
|
76
86
|
* key: Token
|
|
77
87
|
* value: TokenData
|
|
78
88
|
*/
|
|
89
|
+
@Restricted(RoleEnum.S_NO_ONE)
|
|
79
90
|
@IsOptional()
|
|
80
91
|
@Prop(raw({}))
|
|
81
92
|
refreshTokens: Record<string, CoreTokenData> = undefined;
|
|
@@ -84,6 +95,7 @@ export abstract class CoreUserModel extends CorePersistenceModel {
|
|
|
84
95
|
* Temporary token for parallel requests during the token refresh process
|
|
85
96
|
* See sameTokenIdPeriod in configuration
|
|
86
97
|
*/
|
|
98
|
+
@Restricted(RoleEnum.S_NO_ONE)
|
|
87
99
|
@IsOptional()
|
|
88
100
|
@Prop(raw({}))
|
|
89
101
|
tempTokens: Record<string, { createdAt: number; deviceId: string; tokenId: string }> = undefined;
|
|
@@ -91,6 +103,7 @@ export abstract class CoreUserModel extends CorePersistenceModel {
|
|
|
91
103
|
/**
|
|
92
104
|
* Verification token of the user
|
|
93
105
|
*/
|
|
106
|
+
@Restricted(RoleEnum.S_NO_ONE)
|
|
94
107
|
@IsOptional()
|
|
95
108
|
@Prop()
|
|
96
109
|
verificationToken: string = undefined;
|
|
@@ -98,6 +111,7 @@ export abstract class CoreUserModel extends CorePersistenceModel {
|
|
|
98
111
|
/**
|
|
99
112
|
* Verification of the user
|
|
100
113
|
*/
|
|
114
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
101
115
|
@Field(type => Boolean, { description: 'Verification state of the user', nullable: true })
|
|
102
116
|
@Prop({ type: Boolean })
|
|
103
117
|
verified: boolean = undefined;
|
|
@@ -105,6 +119,7 @@ export abstract class CoreUserModel extends CorePersistenceModel {
|
|
|
105
119
|
/**
|
|
106
120
|
* Verification date
|
|
107
121
|
*/
|
|
122
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
108
123
|
@Field({ description: 'Verified date', nullable: true })
|
|
109
124
|
@Prop()
|
|
110
125
|
verifiedAt: Date = undefined;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { Field, InputType } from '@nestjs/graphql';
|
|
2
2
|
import { IsEmail } from 'class-validator';
|
|
3
3
|
|
|
4
|
+
import { Restricted } from '../../../common/decorators/restricted.decorator';
|
|
5
|
+
import { RoleEnum } from '../../../common/enums/role.enum';
|
|
4
6
|
import { CoreUserInput } from './core-user.input';
|
|
5
7
|
|
|
6
8
|
/**
|
|
@@ -10,8 +12,10 @@ import { CoreUserInput } from './core-user.input';
|
|
|
10
12
|
* otherwise the property will not be recognized via Object.keys (this is necessary for mapping) or will be initialized
|
|
11
13
|
* with a default value that may overwrite an existing value in the DB.
|
|
12
14
|
*/
|
|
15
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
13
16
|
@InputType({ description: 'User input to create a new user', isAbstract: true })
|
|
14
17
|
export abstract class CoreUserCreateInput extends CoreUserInput {
|
|
18
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
15
19
|
@Field({ description: 'Email of the user', nullable: false })
|
|
16
20
|
@IsEmail()
|
|
17
21
|
override email: string = undefined;
|
|
@@ -13,11 +13,13 @@ import { CoreInput } from '../../../common/inputs/core-input.input';
|
|
|
13
13
|
* otherwise the property will not be recognized via Object.keys (this is necessary for mapping) or will be initialized
|
|
14
14
|
* with a default value that may overwrite an existing value in the DB.
|
|
15
15
|
*/
|
|
16
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
16
17
|
@InputType({ description: 'User input', isAbstract: true })
|
|
17
18
|
export abstract class CoreUserInput extends CoreInput {
|
|
18
19
|
/**
|
|
19
20
|
* Email of the user
|
|
20
21
|
*/
|
|
22
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
21
23
|
@Field({ description: 'Email of the user', nullable: true })
|
|
22
24
|
@IsOptional()
|
|
23
25
|
@IsEmail()
|
|
@@ -26,6 +28,7 @@ export abstract class CoreUserInput extends CoreInput {
|
|
|
26
28
|
/**
|
|
27
29
|
* First name of the user
|
|
28
30
|
*/
|
|
31
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
29
32
|
@Field({ description: 'First name of the user', nullable: true })
|
|
30
33
|
@IsOptional()
|
|
31
34
|
firstName?: string = undefined;
|
|
@@ -33,6 +36,7 @@ export abstract class CoreUserInput extends CoreInput {
|
|
|
33
36
|
/**
|
|
34
37
|
* Last name of the user
|
|
35
38
|
*/
|
|
39
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
36
40
|
@Field({ description: 'Last name of the user', nullable: true })
|
|
37
41
|
@IsOptional()
|
|
38
42
|
lastName?: string = undefined;
|
|
@@ -48,6 +52,7 @@ export abstract class CoreUserInput extends CoreInput {
|
|
|
48
52
|
/**
|
|
49
53
|
* Username / alias of the user
|
|
50
54
|
*/
|
|
55
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
51
56
|
@Field({ description: 'Username / alias of the user', nullable: true })
|
|
52
57
|
@IsOptional()
|
|
53
58
|
username?: string = undefined;
|
|
@@ -55,6 +60,7 @@ export abstract class CoreUserInput extends CoreInput {
|
|
|
55
60
|
/**
|
|
56
61
|
* Password of the user
|
|
57
62
|
*/
|
|
63
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
58
64
|
@Field({ description: 'Password of the user', nullable: true })
|
|
59
65
|
@IsOptional()
|
|
60
66
|
password?: string = undefined;
|
|
@@ -2,6 +2,8 @@ import { Field, ObjectType } from '@nestjs/graphql';
|
|
|
2
2
|
import { Prop } from '@nestjs/mongoose';
|
|
3
3
|
import { Types } from 'mongoose';
|
|
4
4
|
|
|
5
|
+
import { Restricted } from '../../../core/common/decorators/restricted.decorator';
|
|
6
|
+
import { RoleEnum } from '../../../core/common/enums/role.enum';
|
|
5
7
|
import { CorePersistenceModel } from '../../../core/common/models/core-persistence.model';
|
|
6
8
|
import { User } from '../../modules/user/user.model';
|
|
7
9
|
|
|
@@ -12,6 +14,7 @@ import mongoose = require('mongoose');
|
|
|
12
14
|
*
|
|
13
15
|
* The models are a combination of MikroORM Entities and TypeGraphQL Types
|
|
14
16
|
*/
|
|
17
|
+
@Restricted(RoleEnum.ADMIN)
|
|
15
18
|
@ObjectType({
|
|
16
19
|
description: 'Persistence model which will be saved in DB',
|
|
17
20
|
isAbstract: true,
|
|
@@ -26,6 +29,7 @@ export abstract class PersistenceModel extends CorePersistenceModel {
|
|
|
26
29
|
*
|
|
27
30
|
* Not set when created by system
|
|
28
31
|
*/
|
|
32
|
+
@Restricted(RoleEnum.ADMIN)
|
|
29
33
|
@Field(() => User, {
|
|
30
34
|
description: 'ID of the user who created the object',
|
|
31
35
|
nullable: true,
|
|
@@ -38,6 +42,7 @@ export abstract class PersistenceModel extends CorePersistenceModel {
|
|
|
38
42
|
*
|
|
39
43
|
* Not set when updated by system
|
|
40
44
|
*/
|
|
45
|
+
@Restricted(RoleEnum.ADMIN)
|
|
41
46
|
@Field(() => User, {
|
|
42
47
|
description: 'ID of the user who updated the object',
|
|
43
48
|
nullable: true,
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { Controller } from '@nestjs/common';
|
|
2
2
|
|
|
3
|
+
import { Roles } from '../../../core/common/decorators/roles.decorator';
|
|
4
|
+
import { RoleEnum } from '../../../core/common/enums/role.enum';
|
|
3
5
|
import { ConfigService } from '../../../core/common/services/config.service';
|
|
4
6
|
import { CoreAuthController } from '../../../core/modules/auth/core-auth.controller';
|
|
5
7
|
import { AuthService } from './auth.service';
|
|
6
8
|
|
|
9
|
+
@Roles(RoleEnum.ADMIN)
|
|
7
10
|
@Controller('auth')
|
|
8
11
|
export class AuthController extends CoreAuthController {
|
|
9
12
|
/**
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Field, ObjectType } from '@nestjs/graphql';
|
|
2
2
|
|
|
3
|
+
import { Restricted } from '../../../core/common/decorators/restricted.decorator';
|
|
4
|
+
import { RoleEnum } from '../../../core/common/enums/role.enum';
|
|
3
5
|
import { mapClasses } from '../../../core/common/helpers/model.helper';
|
|
4
6
|
import { CoreAuthModel } from '../../../core/modules/auth/core-auth.model';
|
|
5
7
|
import { User } from '../user/user.model';
|
|
@@ -7,6 +9,7 @@ import { User } from '../user/user.model';
|
|
|
7
9
|
/**
|
|
8
10
|
* Authentication data
|
|
9
11
|
*/
|
|
12
|
+
@Restricted(RoleEnum.ADMIN)
|
|
10
13
|
@ObjectType({ description: 'Authentication data' })
|
|
11
14
|
export class Auth extends CoreAuthModel {
|
|
12
15
|
// ===================================================================================================================
|
|
@@ -16,6 +19,7 @@ export class Auth extends CoreAuthModel {
|
|
|
16
19
|
/**
|
|
17
20
|
* Signed-in user
|
|
18
21
|
*/
|
|
22
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
19
23
|
@Field(() => User, { description: 'User who signed in' })
|
|
20
24
|
override user: User = undefined;
|
|
21
25
|
|
|
@@ -2,6 +2,8 @@ import { Args, Context, Mutation, Resolver } from '@nestjs/graphql';
|
|
|
2
2
|
import { Response as ResponseType } from 'express';
|
|
3
3
|
|
|
4
4
|
import { GraphQLServiceOptions } from '../../../core/common/decorators/graphql-service-options.decorator';
|
|
5
|
+
import { Roles } from '../../../core/common/decorators/roles.decorator';
|
|
6
|
+
import { RoleEnum } from '../../../core/common/enums/role.enum';
|
|
5
7
|
import { ServiceOptions } from '../../../core/common/interfaces/service-options.interface';
|
|
6
8
|
import { ConfigService } from '../../../core/common/services/config.service';
|
|
7
9
|
import { CoreAuthResolver } from '../../../core/modules/auth/core-auth.resolver';
|
|
@@ -13,6 +15,7 @@ import { AuthSignUpInput } from './inputs/auth-sign-up.input';
|
|
|
13
15
|
/**
|
|
14
16
|
* Authentication resolver for the sign in
|
|
15
17
|
*/
|
|
18
|
+
@Roles(RoleEnum.ADMIN)
|
|
16
19
|
@Resolver(() => Auth)
|
|
17
20
|
export class AuthResolver extends CoreAuthResolver {
|
|
18
21
|
/**
|
|
@@ -28,6 +31,7 @@ export class AuthResolver extends CoreAuthResolver {
|
|
|
28
31
|
/**
|
|
29
32
|
* SignIn for User
|
|
30
33
|
*/
|
|
34
|
+
@Roles(RoleEnum.S_EVERYONE)
|
|
31
35
|
@Mutation(() => Auth, { description: 'Sign in and get JWT token' })
|
|
32
36
|
override async signIn(
|
|
33
37
|
@GraphQLServiceOptions({ gqlPath: 'signIn.user' }) serviceOptions: ServiceOptions,
|
|
@@ -44,6 +48,7 @@ export class AuthResolver extends CoreAuthResolver {
|
|
|
44
48
|
/**
|
|
45
49
|
* Sign up for user
|
|
46
50
|
*/
|
|
51
|
+
@Roles(RoleEnum.S_EVERYONE)
|
|
47
52
|
@Mutation(() => Auth, {
|
|
48
53
|
description: 'Sign up user and get JWT token',
|
|
49
54
|
})
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { InputType } from '@nestjs/graphql';
|
|
2
2
|
|
|
3
|
+
import { Restricted } from '../../../../core/common/decorators/restricted.decorator';
|
|
4
|
+
import { RoleEnum } from '../../../../core/common/enums/role.enum';
|
|
3
5
|
import { CoreAuthSignInInput } from '../../../../core/modules/auth/inputs/core-auth-sign-in.input';
|
|
4
6
|
|
|
5
7
|
/**
|
|
6
8
|
* SignIn input
|
|
7
9
|
*/
|
|
10
|
+
@Restricted(RoleEnum.ADMIN)
|
|
8
11
|
@InputType({ description: 'Sign-in input' })
|
|
9
12
|
export class AuthSignInInput extends CoreAuthSignInInput {
|
|
10
13
|
// Extend UserInput here
|
|
@@ -1,19 +1,24 @@
|
|
|
1
1
|
import { Field, InputType } from '@nestjs/graphql';
|
|
2
2
|
|
|
3
|
+
import { Restricted } from '../../../../core/common/decorators/restricted.decorator';
|
|
4
|
+
import { RoleEnum } from '../../../../core/common/enums/role.enum';
|
|
3
5
|
import { CoreAuthSignUpInput } from '../../../../core/modules/auth/inputs/core-auth-sign-up.input';
|
|
4
6
|
|
|
5
7
|
/**
|
|
6
8
|
* SignUp input
|
|
7
9
|
*/
|
|
10
|
+
@Restricted(RoleEnum.ADMIN)
|
|
8
11
|
@InputType({ description: 'Sign-up input' })
|
|
9
12
|
export class AuthSignUpInput extends CoreAuthSignUpInput {
|
|
10
13
|
// ===================================================================================================================
|
|
11
14
|
// Properties
|
|
12
15
|
// ===================================================================================================================
|
|
13
16
|
|
|
17
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
14
18
|
@Field({ description: 'firstName', nullable: true })
|
|
15
19
|
firstName: string = undefined;
|
|
16
20
|
|
|
21
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
17
22
|
@Field({ description: 'lastName', nullable: true })
|
|
18
23
|
lastName: string = undefined;
|
|
19
24
|
}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import { ObjectType } from '@nestjs/graphql';
|
|
2
2
|
import { Schema as MongooseSchema, SchemaFactory } from '@nestjs/mongoose';
|
|
3
3
|
|
|
4
|
+
import { Restricted } from '../../../core/common/decorators/restricted.decorator';
|
|
5
|
+
import { RoleEnum } from '../../../core/common/enums/role.enum';
|
|
4
6
|
import { CoreFileInfo } from '../../../core/modules/file/core-file-info.model';
|
|
5
7
|
|
|
6
8
|
/**
|
|
7
9
|
* File info model
|
|
8
10
|
*/
|
|
11
|
+
@Restricted(RoleEnum.ADMIN)
|
|
9
12
|
@ObjectType({ description: 'Information about file' })
|
|
10
13
|
@MongooseSchema({ collection: 'fs.files' })
|
|
11
14
|
export class FileInfo extends CoreFileInfo {}
|
|
@@ -30,6 +30,7 @@ export class FileController {
|
|
|
30
30
|
/**
|
|
31
31
|
* Upload file
|
|
32
32
|
*/
|
|
33
|
+
@Roles(RoleEnum.ADMIN)
|
|
33
34
|
@Post('upload')
|
|
34
35
|
@UseInterceptors(FileInterceptor('file'))
|
|
35
36
|
uploadFile(@UploadedFile() file: Express.Multer.File): any {
|
|
@@ -39,6 +40,7 @@ export class FileController {
|
|
|
39
40
|
/**
|
|
40
41
|
* Download file
|
|
41
42
|
*/
|
|
43
|
+
@Roles(RoleEnum.ADMIN)
|
|
42
44
|
@Get(':id')
|
|
43
45
|
async getFile(@Param('id') id: string, @Res() res) {
|
|
44
46
|
if (!id) {
|
|
@@ -65,6 +67,7 @@ export class FileController {
|
|
|
65
67
|
/**
|
|
66
68
|
* Get file information
|
|
67
69
|
*/
|
|
70
|
+
@Roles(RoleEnum.ADMIN)
|
|
68
71
|
@Get('info/:id')
|
|
69
72
|
async getFileInfo(@Param('id') id: string) {
|
|
70
73
|
return await this.fileService.getFileInfo(id);
|
|
@@ -73,6 +76,7 @@ export class FileController {
|
|
|
73
76
|
/**
|
|
74
77
|
* Delete file
|
|
75
78
|
*/
|
|
79
|
+
@Roles(RoleEnum.ADMIN)
|
|
76
80
|
@Delete(':id')
|
|
77
81
|
async deleteFile(@Param('id') id: string) {
|
|
78
82
|
if (!id) {
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { InputType } from '@nestjs/graphql';
|
|
2
2
|
|
|
3
|
+
import { Restricted } from '../../../../core/common/decorators/restricted.decorator';
|
|
4
|
+
import { RoleEnum } from '../../../../core/common/enums/role.enum';
|
|
3
5
|
import { CoreUserCreateInput } from '../../../../core/modules/user/inputs/core-user-create.input';
|
|
4
6
|
|
|
5
7
|
/**
|
|
6
8
|
* User input to create a new user
|
|
7
9
|
*/
|
|
10
|
+
@Restricted(RoleEnum.ADMIN)
|
|
8
11
|
@InputType({ description: 'User input to create a new user' })
|
|
9
12
|
export class UserCreateInput extends CoreUserCreateInput {
|
|
10
13
|
// Extend UserCreateInput here
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { InputType } from '@nestjs/graphql';
|
|
2
2
|
|
|
3
|
+
import { Restricted } from '../../../../core/common/decorators/restricted.decorator';
|
|
4
|
+
import { RoleEnum } from '../../../../core/common/enums/role.enum';
|
|
3
5
|
import { CoreUserInput } from '../../../../core/modules/user/inputs/core-user.input';
|
|
4
6
|
|
|
5
7
|
/**
|
|
6
8
|
* User input to update a user
|
|
7
9
|
*/
|
|
10
|
+
@Restricted(RoleEnum.ADMIN)
|
|
8
11
|
@InputType({ description: 'User input' })
|
|
9
12
|
export class UserInput extends CoreUserInput {
|
|
10
13
|
// Extend UserInput here
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import { Field, ObjectType } from '@nestjs/graphql';
|
|
2
2
|
|
|
3
|
+
import { Restricted } from '../../../../core/common/decorators/restricted.decorator';
|
|
4
|
+
import { RoleEnum } from '../../../../core/common/enums/role.enum';
|
|
3
5
|
import { User } from '../user.model';
|
|
4
6
|
|
|
7
|
+
@Restricted(RoleEnum.ADMIN)
|
|
5
8
|
@ObjectType({ description: 'Result of find and count' })
|
|
6
9
|
export class FindAndCountUsersResult {
|
|
10
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
7
11
|
@Field(() => [User], { description: 'Found users' })
|
|
8
12
|
items: User[];
|
|
9
13
|
|
|
14
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
10
15
|
@Field({ description: 'Total count (skip/offset and limit/take are ignored in the count)' })
|
|
11
16
|
totalCount: number;
|
|
12
17
|
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { Field, ObjectType } from '@nestjs/graphql';
|
|
2
2
|
import { Schema as MongooseSchema, Prop, SchemaFactory } from '@nestjs/mongoose';
|
|
3
|
+
import { IsOptional } from 'class-validator';
|
|
3
4
|
import { Document, Schema } from 'mongoose';
|
|
4
5
|
|
|
6
|
+
import { Restricted } from '../../../core/common/decorators/restricted.decorator';
|
|
5
7
|
import { RoleEnum } from '../../../core/common/enums/role.enum';
|
|
6
8
|
import { CoreUserModel } from '../../../core/modules/user/core-user.model';
|
|
7
9
|
import { PersistenceModel } from '../../common/models/persistence.model';
|
|
@@ -11,6 +13,7 @@ export type UserDocument = Document & User;
|
|
|
11
13
|
/**
|
|
12
14
|
* User model
|
|
13
15
|
*/
|
|
16
|
+
@Restricted(RoleEnum.ADMIN)
|
|
14
17
|
@ObjectType({ description: 'User' })
|
|
15
18
|
@MongooseSchema({ timestamps: true })
|
|
16
19
|
export class User extends CoreUserModel implements PersistenceModel {
|
|
@@ -21,6 +24,7 @@ export class User extends CoreUserModel implements PersistenceModel {
|
|
|
21
24
|
/**
|
|
22
25
|
* URL to avatar file of the user
|
|
23
26
|
*/
|
|
27
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
24
28
|
@Field({ description: 'URL to avatar file of the user', nullable: true })
|
|
25
29
|
@Prop()
|
|
26
30
|
avatar: string = undefined;
|
|
@@ -30,6 +34,7 @@ export class User extends CoreUserModel implements PersistenceModel {
|
|
|
30
34
|
*
|
|
31
35
|
* Not set when created by system
|
|
32
36
|
*/
|
|
37
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
33
38
|
@Field(() => String, {
|
|
34
39
|
description: 'ID of the user who created the object',
|
|
35
40
|
nullable: true,
|
|
@@ -37,11 +42,21 @@ export class User extends CoreUserModel implements PersistenceModel {
|
|
|
37
42
|
@Prop({ ref: 'User', type: Schema.Types.ObjectId })
|
|
38
43
|
createdBy: string = undefined;
|
|
39
44
|
|
|
45
|
+
/**
|
|
46
|
+
* Roles of the user
|
|
47
|
+
*/
|
|
48
|
+
@Restricted(RoleEnum.S_EVERYONE)
|
|
49
|
+
@Field(type => [String], { description: 'Roles of the user', nullable: true })
|
|
50
|
+
@IsOptional()
|
|
51
|
+
@Prop([String])
|
|
52
|
+
override roles: string[] = undefined;
|
|
53
|
+
|
|
40
54
|
/**
|
|
41
55
|
* ID of the user who updated the object
|
|
42
56
|
*
|
|
43
57
|
* Not set when updated by system
|
|
44
58
|
*/
|
|
59
|
+
@Restricted(RoleEnum.S_USER)
|
|
45
60
|
@Field(() => String, {
|
|
46
61
|
description: 'ID of the user who last updated the object',
|
|
47
62
|
nullable: true,
|
|
@@ -2,10 +2,12 @@ import { Controller, Get, Render } from '@nestjs/common';
|
|
|
2
2
|
|
|
3
3
|
import { ConfigService, RoleEnum, Roles } from '..';
|
|
4
4
|
|
|
5
|
+
@Roles(RoleEnum.ADMIN)
|
|
5
6
|
@Controller()
|
|
6
7
|
export class ServerController {
|
|
7
8
|
constructor(protected configService: ConfigService) {}
|
|
8
9
|
|
|
10
|
+
@Roles(RoleEnum.S_EVERYONE)
|
|
9
11
|
@Get()
|
|
10
12
|
@Render('index')
|
|
11
13
|
root() {
|