@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.
Files changed (112) hide show
  1. package/dist/config.env.js +24 -3
  2. package/dist/config.env.js.map +1 -1
  3. package/dist/core/common/decorators/restricted.decorator.d.ts +1 -0
  4. package/dist/core/common/decorators/restricted.decorator.js +5 -2
  5. package/dist/core/common/decorators/restricted.decorator.js.map +1 -1
  6. package/dist/core/common/inputs/combined-filter.input.js +5 -0
  7. package/dist/core/common/inputs/combined-filter.input.js.map +1 -1
  8. package/dist/core/common/inputs/filter.input.js +5 -0
  9. package/dist/core/common/inputs/filter.input.js.map +1 -1
  10. package/dist/core/common/inputs/single-filter.input.js +10 -0
  11. package/dist/core/common/inputs/single-filter.input.js.map +1 -1
  12. package/dist/core/common/inputs/sort.input.js +5 -0
  13. package/dist/core/common/inputs/sort.input.js.map +1 -1
  14. package/dist/core/common/interceptors/check-response.interceptor.d.ts +11 -0
  15. package/dist/core/common/interceptors/check-response.interceptor.js +22 -2
  16. package/dist/core/common/interceptors/check-response.interceptor.js.map +1 -1
  17. package/dist/core/common/interfaces/server-options.interface.d.ts +8 -1
  18. package/dist/core/common/models/core-persistence.model.js +13 -0
  19. package/dist/core/common/models/core-persistence.model.js.map +1 -1
  20. package/dist/core/modules/auth/core-auth.controller.js +7 -0
  21. package/dist/core/modules/auth/core-auth.controller.js.map +1 -1
  22. package/dist/core/modules/auth/core-auth.model.js +6 -0
  23. package/dist/core/modules/auth/core-auth.model.js.map +1 -1
  24. package/dist/core/modules/auth/core-auth.resolver.js +7 -0
  25. package/dist/core/modules/auth/core-auth.resolver.js.map +1 -1
  26. package/dist/core/modules/auth/inputs/core-auth-sign-in.input.js +7 -0
  27. package/dist/core/modules/auth/inputs/core-auth-sign-in.input.js.map +1 -1
  28. package/dist/core/modules/auth/inputs/core-auth-sign-up.input.js +3 -0
  29. package/dist/core/modules/auth/inputs/core-auth-sign-up.input.js.map +1 -1
  30. package/dist/core/modules/file/core-file-info.model.js +14 -0
  31. package/dist/core/modules/file/core-file-info.model.js.map +1 -1
  32. package/dist/core/modules/file/core-file.controller.js +4 -0
  33. package/dist/core/modules/file/core-file.controller.js.map +1 -1
  34. package/dist/core/modules/file/core-file.resolver.js +7 -0
  35. package/dist/core/modules/file/core-file.resolver.js.map +1 -1
  36. package/dist/core/modules/health-check/core-health-check-result.model.js +7 -0
  37. package/dist/core/modules/health-check/core-health-check-result.model.js.map +1 -1
  38. package/dist/core/modules/health-check/core-health-check.controller.js +4 -0
  39. package/dist/core/modules/health-check/core-health-check.controller.js.map +1 -1
  40. package/dist/core/modules/user/core-user.model.js +15 -0
  41. package/dist/core/modules/user/core-user.model.js.map +1 -1
  42. package/dist/core/modules/user/inputs/core-user-create.input.js +4 -0
  43. package/dist/core/modules/user/inputs/core-user-create.input.js.map +1 -1
  44. package/dist/core/modules/user/inputs/core-user.input.js +6 -0
  45. package/dist/core/modules/user/inputs/core-user.input.js.map +1 -1
  46. package/dist/server/common/models/persistence.model.js +5 -0
  47. package/dist/server/common/models/persistence.model.js.map +1 -1
  48. package/dist/server/modules/auth/auth.controller.js +3 -0
  49. package/dist/server/modules/auth/auth.controller.js.map +1 -1
  50. package/dist/server/modules/auth/auth.model.js +4 -0
  51. package/dist/server/modules/auth/auth.model.js.map +1 -1
  52. package/dist/server/modules/auth/auth.resolver.js +5 -0
  53. package/dist/server/modules/auth/auth.resolver.js.map +1 -1
  54. package/dist/server/modules/auth/inputs/auth-sign-in.input.js +3 -0
  55. package/dist/server/modules/auth/inputs/auth-sign-in.input.js.map +1 -1
  56. package/dist/server/modules/auth/inputs/auth-sign-up.input.js +5 -0
  57. package/dist/server/modules/auth/inputs/auth-sign-up.input.js.map +1 -1
  58. package/dist/server/modules/file/file-info.model.js +3 -0
  59. package/dist/server/modules/file/file-info.model.js.map +1 -1
  60. package/dist/server/modules/file/file.controller.js +4 -0
  61. package/dist/server/modules/file/file.controller.js.map +1 -1
  62. package/dist/server/modules/user/avatar.controller.js +1 -0
  63. package/dist/server/modules/user/avatar.controller.js.map +1 -1
  64. package/dist/server/modules/user/inputs/user-create.input.js +3 -0
  65. package/dist/server/modules/user/inputs/user-create.input.js.map +1 -1
  66. package/dist/server/modules/user/inputs/user.input.js +3 -0
  67. package/dist/server/modules/user/inputs/user.input.js.map +1 -1
  68. package/dist/server/modules/user/outputs/find-and-count-users-result.output.js +5 -0
  69. package/dist/server/modules/user/outputs/find-and-count-users-result.output.js.map +1 -1
  70. package/dist/server/modules/user/user.model.d.ts +1 -0
  71. package/dist/server/modules/user/user.model.js +14 -0
  72. package/dist/server/modules/user/user.model.js.map +1 -1
  73. package/dist/server/server.controller.js +2 -0
  74. package/dist/server/server.controller.js.map +1 -1
  75. package/dist/tsconfig.build.tsbuildinfo +1 -1
  76. package/package.json +1 -1
  77. package/src/config.env.ts +24 -3
  78. package/src/core/common/decorators/restricted.decorator.ts +8 -2
  79. package/src/core/common/inputs/combined-filter.input.ts +5 -0
  80. package/src/core/common/inputs/filter.input.ts +5 -0
  81. package/src/core/common/inputs/single-filter.input.ts +10 -0
  82. package/src/core/common/inputs/sort.input.ts +5 -0
  83. package/src/core/common/interceptors/check-response.interceptor.ts +18 -1
  84. package/src/core/common/interfaces/server-options.interface.ts +40 -2
  85. package/src/core/common/models/core-persistence.model.ts +9 -0
  86. package/src/core/modules/auth/core-auth.controller.ts +7 -0
  87. package/src/core/modules/auth/core-auth.model.ts +6 -0
  88. package/src/core/modules/auth/core-auth.resolver.ts +7 -0
  89. package/src/core/modules/auth/inputs/core-auth-sign-in.input.ts +7 -0
  90. package/src/core/modules/auth/inputs/core-auth-sign-up.input.ts +3 -0
  91. package/src/core/modules/file/core-file-info.model.ts +10 -0
  92. package/src/core/modules/file/core-file.controller.ts +4 -0
  93. package/src/core/modules/file/core-file.resolver.ts +7 -0
  94. package/src/core/modules/health-check/core-health-check-result.model.ts +7 -0
  95. package/src/core/modules/health-check/core-health-check.controller.ts +4 -0
  96. package/src/core/modules/user/core-user.model.ts +15 -0
  97. package/src/core/modules/user/inputs/core-user-create.input.ts +4 -0
  98. package/src/core/modules/user/inputs/core-user.input.ts +6 -0
  99. package/src/server/common/models/persistence.model.ts +5 -0
  100. package/src/server/modules/auth/auth.controller.ts +3 -0
  101. package/src/server/modules/auth/auth.model.ts +4 -0
  102. package/src/server/modules/auth/auth.resolver.ts +5 -0
  103. package/src/server/modules/auth/inputs/auth-sign-in.input.ts +3 -0
  104. package/src/server/modules/auth/inputs/auth-sign-up.input.ts +5 -0
  105. package/src/server/modules/file/file-info.model.ts +3 -0
  106. package/src/server/modules/file/file.controller.ts +4 -0
  107. package/src/server/modules/user/avatar.controller.ts +1 -0
  108. package/src/server/modules/user/inputs/user-create.input.ts +3 -0
  109. package/src/server/modules/user/inputs/user.input.ts +3 -0
  110. package/src/server/modules/user/outputs/find-and-count-users-result.output.ts +5 -0
  111. package/src/server/modules/user/user.model.ts +15 -0
  112. 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) {
@@ -13,6 +13,7 @@ import { UserService } from './user.service';
13
13
  /**
14
14
  * Controller for avatar
15
15
  */
16
+ @Roles(RoleEnum.ADMIN)
16
17
  @Controller('avatar')
17
18
  export class AvatarController {
18
19
  /**
@@ -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() {