@lenne.tech/nest-server 8.0.2 → 8.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/dist/config.env.js +3 -2
  2. package/dist/config.env.js.map +1 -1
  3. package/dist/core/common/args/pagination.args.js +1 -1
  4. package/dist/core/common/args/pagination.args.js.map +1 -1
  5. package/dist/core/common/decorators/restricted.decorator.d.ts +3 -0
  6. package/dist/core/common/decorators/restricted.decorator.js +14 -8
  7. package/dist/core/common/decorators/restricted.decorator.js.map +1 -1
  8. package/dist/core/common/enums/role.enum.d.ts +3 -2
  9. package/dist/core/common/enums/role.enum.js +3 -2
  10. package/dist/core/common/enums/role.enum.js.map +1 -1
  11. package/dist/core/common/helpers/config.helper.d.ts +2 -1
  12. package/dist/core/common/helpers/config.helper.js +11 -7
  13. package/dist/core/common/helpers/config.helper.js.map +1 -1
  14. package/dist/core/common/helpers/context.helper.d.ts +7 -1
  15. package/dist/core/common/helpers/context.helper.js +33 -29
  16. package/dist/core/common/helpers/context.helper.js.map +1 -1
  17. package/dist/core/common/helpers/db.helper.d.ts +37 -0
  18. package/dist/core/common/helpers/db.helper.js +356 -0
  19. package/dist/core/common/helpers/db.helper.js.map +1 -0
  20. package/dist/core/common/helpers/file.helper.d.ts +8 -1
  21. package/dist/core/common/helpers/file.helper.js +43 -31
  22. package/dist/core/common/helpers/file.helper.js.map +1 -1
  23. package/dist/core/common/helpers/filter.helper.d.ts +3 -0
  24. package/dist/core/common/helpers/filter.helper.js +93 -81
  25. package/dist/core/common/helpers/filter.helper.js.map +1 -1
  26. package/dist/core/common/helpers/graphql.helper.d.ts +24 -1
  27. package/dist/core/common/helpers/graphql.helper.js +144 -96
  28. package/dist/core/common/helpers/graphql.helper.js.map +1 -1
  29. package/dist/core/common/helpers/input.helper.d.ts +42 -4
  30. package/dist/core/common/helpers/input.helper.js +256 -97
  31. package/dist/core/common/helpers/input.helper.js.map +1 -1
  32. package/dist/core/common/helpers/model.helper.d.ts +11 -0
  33. package/dist/core/common/helpers/model.helper.js +41 -29
  34. package/dist/core/common/helpers/model.helper.js.map +1 -1
  35. package/dist/core/common/helpers/service.helper.d.ts +21 -1
  36. package/dist/core/common/helpers/service.helper.js +80 -72
  37. package/dist/core/common/helpers/service.helper.js.map +1 -1
  38. package/dist/core/common/inputs/combined-filter.input.js +1 -1
  39. package/dist/core/common/inputs/combined-filter.input.js.map +1 -1
  40. package/dist/core/common/inputs/core-input.input.js +1 -1
  41. package/dist/core/common/inputs/core-input.input.js.map +1 -1
  42. package/dist/core/common/interceptors/check-response.interceptor.js +1 -1
  43. package/dist/core/common/interceptors/check-response.interceptor.js.map +1 -1
  44. package/dist/core/common/interfaces/resolve-selector.interface.d.ts +5 -0
  45. package/dist/core/common/interfaces/resolve-selector.interface.js +3 -0
  46. package/dist/core/common/interfaces/resolve-selector.interface.js.map +1 -0
  47. package/dist/core/common/interfaces/service-options.interface.d.ts +36 -0
  48. package/dist/core/common/interfaces/service-options.interface.js +3 -0
  49. package/dist/core/common/interfaces/service-options.interface.js.map +1 -0
  50. package/dist/core/common/models/core-model.model.d.ts +5 -1
  51. package/dist/core/common/models/core-model.model.js +1 -1
  52. package/dist/core/common/models/core-model.model.js.map +1 -1
  53. package/dist/core/common/pipes/check-input.pipe.js +2 -2
  54. package/dist/core/common/pipes/check-input.pipe.js.map +1 -1
  55. package/dist/core/common/pipes/map-and-validate.pipe.js +1 -1
  56. package/dist/core/common/pipes/map-and-validate.pipe.js.map +1 -1
  57. package/dist/core/common/services/crud.service.d.ts +13 -0
  58. package/dist/core/common/services/crud.service.js +57 -0
  59. package/dist/core/common/services/crud.service.js.map +1 -0
  60. package/dist/core/common/services/email.service.js +8 -8
  61. package/dist/core/common/services/email.service.js.map +1 -1
  62. package/dist/core/common/services/module.service.d.ts +40 -0
  63. package/dist/core/common/services/module.service.js +80 -0
  64. package/dist/core/common/services/module.service.js.map +1 -0
  65. package/dist/core/common/types/core-model-constructor.type.d.ts +21 -0
  66. package/dist/core/common/types/core-model-constructor.type.js +3 -0
  67. package/dist/core/common/types/core-model-constructor.type.js.map +1 -0
  68. package/dist/core/common/types/field-selection.type.d.ts +4 -0
  69. package/dist/core/common/types/field-selection.type.js +3 -0
  70. package/dist/core/common/types/field-selection.type.js.map +1 -0
  71. package/dist/core/common/types/ids.type.d.ts +8 -0
  72. package/dist/core/common/types/ids.type.js +3 -0
  73. package/dist/core/common/types/ids.type.js.map +1 -0
  74. package/dist/core/common/types/string-or-object-id.type.d.ts +2 -0
  75. package/dist/core/common/types/string-or-object-id.type.js +3 -0
  76. package/dist/core/common/types/string-or-object-id.type.js.map +1 -0
  77. package/dist/core/modules/auth/core-auth.resolver.d.ts +2 -1
  78. package/dist/core/modules/auth/core-auth.resolver.js +4 -3
  79. package/dist/core/modules/auth/core-auth.resolver.js.map +1 -1
  80. package/dist/core/modules/auth/guards/roles.guard.js +1 -2
  81. package/dist/core/modules/auth/guards/roles.guard.js.map +1 -1
  82. package/dist/core/modules/auth/services/core-auth-user.service.d.ts +3 -1
  83. package/dist/core/modules/auth/services/core-auth-user.service.js.map +1 -1
  84. package/dist/core/modules/auth/services/core-auth.service.d.ts +2 -1
  85. package/dist/core/modules/auth/services/core-auth.service.js +6 -4
  86. package/dist/core/modules/auth/services/core-auth.service.js.map +1 -1
  87. package/dist/core/modules/user/core-user.model.js +1 -1
  88. package/dist/core/modules/user/core-user.model.js.map +1 -1
  89. package/dist/core/modules/user/core-user.service.d.ts +16 -25
  90. package/dist/core/modules/user/core-user.service.js +69 -90
  91. package/dist/core/modules/user/core-user.service.js.map +1 -1
  92. package/dist/core.module.js +1 -1
  93. package/dist/core.module.js.map +1 -1
  94. package/dist/index.d.ts +9 -1
  95. package/dist/index.js +9 -1
  96. package/dist/index.js.map +1 -1
  97. package/dist/server/modules/auth/auth.resolver.d.ts +2 -1
  98. package/dist/server/modules/auth/auth.resolver.js +4 -3
  99. package/dist/server/modules/auth/auth.resolver.js.map +1 -1
  100. package/dist/server/modules/file/file.controller.js +1 -1
  101. package/dist/server/modules/file/file.controller.js.map +1 -1
  102. package/dist/server/modules/user/avatar.controller.js +2 -2
  103. package/dist/server/modules/user/avatar.controller.js.map +1 -1
  104. package/dist/server/modules/user/user.model.d.ts +2 -1
  105. package/dist/server/modules/user/user.module.js +7 -3
  106. package/dist/server/modules/user/user.module.js.map +1 -1
  107. package/dist/server/modules/user/user.resolver.d.ts +8 -7
  108. package/dist/server/modules/user/user.resolver.js +85 -49
  109. package/dist/server/modules/user/user.resolver.js.map +1 -1
  110. package/dist/server/modules/user/user.service.d.ts +9 -18
  111. package/dist/server/modules/user/user.service.js +23 -30
  112. package/dist/server/modules/user/user.service.js.map +1 -1
  113. package/dist/test/test.helper.d.ts +1 -2
  114. package/dist/test/test.helper.js +1 -16
  115. package/dist/test/test.helper.js.map +1 -1
  116. package/dist/tsconfig.build.tsbuildinfo +1 -1
  117. package/package.json +58 -59
  118. package/src/config.env.ts +3 -2
  119. package/src/core/common/args/pagination.args.ts +2 -2
  120. package/src/core/common/decorators/restricted.decorator.ts +24 -12
  121. package/src/core/common/enums/role.enum.ts +23 -5
  122. package/src/core/common/helpers/config.helper.ts +26 -6
  123. package/src/core/common/helpers/context.helper.ts +42 -33
  124. package/src/core/common/helpers/db.helper.ts +595 -0
  125. package/src/core/common/helpers/file.helper.ts +76 -49
  126. package/src/core/common/helpers/filter.helper.ts +119 -96
  127. package/src/core/common/helpers/graphql.helper.ts +219 -117
  128. package/src/core/common/helpers/input.helper.ts +349 -108
  129. package/src/core/common/helpers/model.helper.ts +102 -57
  130. package/src/core/common/helpers/service.helper.ts +149 -117
  131. package/src/core/common/inputs/combined-filter.input.ts +2 -2
  132. package/src/core/common/inputs/core-input.input.ts +2 -2
  133. package/src/core/common/interceptors/check-response.interceptor.ts +2 -2
  134. package/src/core/common/interfaces/resolve-selector.interface.ts +9 -0
  135. package/src/core/common/interfaces/service-options.interface.ts +71 -0
  136. package/src/core/common/models/core-model.model.ts +7 -3
  137. package/src/core/common/pipes/check-input.pipe.ts +4 -4
  138. package/src/core/common/pipes/map-and-validate.pipe.ts +2 -2
  139. package/src/core/common/services/crud.service.ts +100 -0
  140. package/src/core/common/services/email.service.ts +9 -9
  141. package/src/core/common/services/module.service.ts +188 -0
  142. package/src/core/common/types/core-model-constructor.type.ts +30 -0
  143. package/src/core/common/types/field-selection.type.ts +8 -0
  144. package/src/core/common/types/ids.type.ts +7 -0
  145. package/src/core/common/types/string-or-object-id.type.ts +3 -0
  146. package/src/core/modules/auth/core-auth.module.ts +1 -1
  147. package/src/core/modules/auth/core-auth.resolver.ts +8 -3
  148. package/src/core/modules/auth/guards/roles.guard.ts +5 -7
  149. package/src/core/modules/auth/services/core-auth-user.service.ts +7 -1
  150. package/src/core/modules/auth/services/core-auth.service.ts +14 -4
  151. package/src/core/modules/user/core-user.model.ts +2 -1
  152. package/src/core/modules/user/core-user.service.ts +115 -185
  153. package/src/core.module.ts +2 -2
  154. package/src/index.ts +9 -1
  155. package/src/main.ts +1 -1
  156. package/src/server/modules/auth/auth.resolver.ts +8 -3
  157. package/src/server/modules/file/file.controller.ts +2 -2
  158. package/src/server/modules/user/avatar.controller.ts +3 -3
  159. package/src/server/modules/user/user.module.ts +7 -3
  160. package/src/server/modules/user/user.resolver.ts +74 -43
  161. package/src/server/modules/user/user.service.ts +30 -53
  162. package/src/test/test.helper.ts +31 -30
  163. package/dist/core/modules/user/core-basic-user.service.d.ts +0 -17
  164. package/dist/core/modules/user/core-basic-user.service.js +0 -73
  165. package/dist/core/modules/user/core-basic-user.service.js.map +0 -1
  166. package/src/core/modules/user/core-basic-user.service.ts +0 -138
@@ -1,20 +1,15 @@
1
1
  import { BadRequestException, NotFoundException, UnprocessableEntityException } from '@nestjs/common';
2
2
  import * as bcrypt from 'bcrypt';
3
- import { PubSub } from 'graphql-subscriptions';
4
- import { FilterArgs } from '../../common/args/filter.args';
5
- import { Filter } from '../../common/helpers/filter.helper';
6
- import { ServiceHelper } from '../../common/helpers/service.helper';
7
- import { CoreBasicUserService } from './core-basic-user.service';
3
+ import * as crypto from 'crypto';
4
+ import { Document, Model } from 'mongoose';
5
+ import { merge } from '../../common/helpers/config.helper';
6
+ import { ServiceOptions } from '../../common/interfaces/service-options.interface';
7
+ import { CrudService } from '../../common/services/crud.service';
8
+ import { EmailService } from '../../common/services/email.service';
9
+ import { CoreModelConstructor } from '../../common/types/core-model-constructor.type';
8
10
  import { CoreUserModel } from './core-user.model';
9
11
  import { CoreUserCreateInput } from './inputs/core-user-create.input';
10
12
  import { CoreUserInput } from './inputs/core-user.input';
11
- import { Model, Document } from 'mongoose';
12
- import * as crypto from 'crypto';
13
- import envConfig from '../../../config.env';
14
- import { EmailService } from '../../common/services/email.service';
15
-
16
- // Subscription
17
- const pubSub = new PubSub();
18
13
 
19
14
  /**
20
15
  * User service
@@ -23,9 +18,13 @@ export abstract class CoreUserService<
23
18
  TUser extends CoreUserModel,
24
19
  TUserInput extends CoreUserInput,
25
20
  TUserCreateInput extends CoreUserCreateInput
26
- > extends CoreBasicUserService<TUser, TUserInput, TUserCreateInput> {
27
- protected constructor(protected readonly userModel: Model<TUser & Document>, protected emailService: EmailService) {
28
- super(userModel);
21
+ > extends CrudService<TUser> {
22
+ protected constructor(
23
+ protected emailService: EmailService,
24
+ protected readonly mainDbModel: Model<TUser & Document>,
25
+ protected mainModelConstructor: CoreModelConstructor<TUser>
26
+ ) {
27
+ super();
29
28
  }
30
29
 
31
30
  // ===================================================================================================================
@@ -35,167 +34,142 @@ export abstract class CoreUserService<
35
34
  /**
36
35
  * Create user
37
36
  */
38
- async create(input: TUserCreateInput, currentUser?: TUser, ...args: any[]): Promise<TUser> {
39
- // Prepare input
40
- await this.prepareInput(input, currentUser, { create: true });
41
-
42
- // Create new user
43
- const createdUser = new this.userModel({
44
- ...input,
45
- verificationToken: crypto.randomBytes(32).toString('hex'),
46
- });
47
-
48
- try {
49
- // Save created user
50
- await createdUser.save();
51
- } catch (error) {
52
- if (error.code === 11000) {
53
- throw new UnprocessableEntityException(`User with email address "${(input as any).email}" already exists`);
54
- } else {
55
- throw new UnprocessableEntityException();
56
- }
57
- }
58
-
59
- // Prepare output
60
- const preparedUser = await this.prepareOutput(this.model.map(createdUser), args[0]);
61
-
62
- // Inform subscriber
63
- pubSub.publish('userCreated', { userCreated: preparedUser });
64
-
65
- // Return created user
66
- return preparedUser;
37
+ async create(input: any, serviceOptions?: ServiceOptions): Promise<TUser> {
38
+ serviceOptions = merge({ prepareInput: { create: true } }, serviceOptions);
39
+ return this.process(
40
+ async (data) => {
41
+ // Create user with verification token
42
+ const createdUser = new this.mainDbModel({
43
+ ...data.input,
44
+ verificationToken: crypto.randomBytes(32).toString('hex'),
45
+ });
46
+
47
+ // Distinguish between different error messages when saving
48
+ try {
49
+ await createdUser.save();
50
+ } catch (error) {
51
+ if (error.code === 11000) {
52
+ throw new UnprocessableEntityException(
53
+ `User with email address "${(data.input as any).email}" already exists`
54
+ );
55
+ } else {
56
+ throw new UnprocessableEntityException();
57
+ }
58
+ }
59
+
60
+ // Return created user
61
+ return createdUser;
62
+ },
63
+ { input, serviceOptions }
64
+ );
67
65
  }
68
66
 
69
67
  /**
70
- * Delete user via ID
68
+ * Get user via email
71
69
  */
72
- async delete(id: string, ...args: any[]): Promise<TUser> {
73
- // Search user
74
- const user = await this.userModel.findById(id).exec();
75
-
76
- // Check user
77
- if (!user) {
78
- throw new NotFoundException();
70
+ async getViaEmail(email: string, serviceOptions?: ServiceOptions): Promise<TUser> {
71
+ const dbObject = await this.mainDbModel.findOne({ email }).exec();
72
+ if (!dbObject) {
73
+ throw new NotFoundException(`No user found with email: ${email}`);
79
74
  }
80
-
81
- // Delete user
82
- await user.delete();
83
-
84
- // Prepare output
85
- const deletedUser = await this.prepareOutput(this.model.map(user), args[0]);
86
-
87
- // Inform subscriber
88
- pubSub.publish('userDeleted', { userDeleted: deletedUser });
89
-
90
- // Return deleted user
91
- return deletedUser;
75
+ return this.process(async () => dbObject, { dbObject, serviceOptions });
92
76
  }
93
77
 
94
78
  /**
95
- * Get user via ID
79
+ * Get verified state of user by token
96
80
  */
97
- async get(id: string, ...args: any[]): Promise<TUser> {
98
- const user = await this.userModel.findById(id).exec();
81
+ async getVerifiedState(token: string, serviceOptions?: ServiceOptions): Promise<boolean> {
82
+ const user = await this.mainDbModel.findOne({ verificationToken: token }).exec();
99
83
 
100
84
  if (!user) {
101
- throw new NotFoundException();
85
+ throw new NotFoundException(`No user found with verify token: ${token}`);
102
86
  }
103
87
 
104
- return this.prepareOutput(this.model.map(user), args[0]);
105
- }
106
-
107
- /**
108
- * Get users via filter
109
- */
110
- async find(filterArgs?: FilterArgs, ...args: any[]): Promise<TUser[]> {
111
- const filterQuery = Filter.convertFilterArgsToQuery(filterArgs);
112
- // Return found users
113
- return await Promise.all(
114
- (
115
- await this.userModel.find(filterQuery[0], null, filterQuery[1]).exec()
116
- ).map((user) => {
117
- return this.prepareOutput(this.model.map(user), args[0]);
118
- })
119
- );
88
+ return user.verified;
120
89
  }
121
90
 
122
91
  /**
123
92
  * Verify user with token
124
93
  */
125
- async verify(token: string, ...args: any[]): Promise<TUser> {
126
- const user = await this.userModel.findOne({ verificationToken: token }).exec();
127
-
128
- if (!user) {
129
- throw new NotFoundException();
94
+ async verify(token: string, serviceOptions?: ServiceOptions): Promise<TUser> {
95
+ // Get user
96
+ const dbObject = await this.mainDbModel.findOne({ verificationToken: token }).exec();
97
+ if (!dbObject) {
98
+ throw new NotFoundException(`No user found with verify token: ${token}`);
130
99
  }
131
-
132
- if (!user.verificationToken) {
100
+ if (!dbObject.verificationToken) {
133
101
  throw new Error('User has no token');
134
102
  }
135
-
136
- if (user.verified) {
103
+ if (dbObject.verified) {
137
104
  throw new Error('User already verified');
138
105
  }
139
-
140
- // Update user
141
- await Object.assign(user, {
142
- verified: true,
143
- verificationToken: null,
144
- }).save();
145
-
146
- // Prepare verified user
147
- const verifiedUser = this.prepareOutput(this.model.map(user), args[0]);
148
-
149
- // Inform subscriber
150
- pubSub.publish('userVerified', { userVerified: verifiedUser });
151
-
152
- // Return prepared verified user
153
- return verifiedUser;
106
+ return this.process(
107
+ async () => {
108
+ // Update user
109
+ await Object.assign(dbObject, {
110
+ verified: true,
111
+ verificationToken: null,
112
+ }).save();
113
+
114
+ // Return prepared user
115
+ return dbObject;
116
+ },
117
+ { dbObject, serviceOptions }
118
+ );
154
119
  }
155
120
 
156
121
  /**
157
122
  * Set newpassword for user with token
158
123
  */
159
- async resetPassword(token: string, newPassword: string, ...args: any[]): Promise<TUser> {
160
- const user = await this.userModel.findOne({ passwordResetToken: token }).exec();
161
-
162
- if (!user) {
163
- throw new NotFoundException();
124
+ async resetPassword(token: string, newPassword: string, serviceOptions?: ServiceOptions): Promise<TUser> {
125
+ // Get user
126
+ const dbObject = await this.mainDbModel.findOne({ passwordResetToken: token }).exec();
127
+ if (!dbObject) {
128
+ throw new NotFoundException(`No user found with password reset token: ${token}`);
164
129
  }
165
130
 
166
- // Update user
167
- await Object.assign(user, {
168
- password: await bcrypt.hash(newPassword, 10),
169
- passwordResetToken: null,
170
- }).save();
171
-
172
- // Return prepared user with changed password
173
- return this.prepareOutput(this.model.map(user), args[0]);
131
+ return this.process(
132
+ async () => {
133
+ // Update user
134
+ await Object.assign(dbObject, {
135
+ password: await bcrypt.hash(newPassword, 10),
136
+ passwordResetToken: null,
137
+ }).save();
138
+
139
+ // Return user
140
+ return dbObject;
141
+ },
142
+ { dbObject, serviceOptions }
143
+ );
174
144
  }
175
145
 
176
146
  /**
177
147
  * Set password rest token for email
178
148
  */
179
- async setPasswordResetTokenForEmail(email: string, ...args: any[]): Promise<TUser> {
180
- const user = await this.userModel.findOne({ email }).exec();
181
-
182
- if (!user) {
183
- throw new NotFoundException();
149
+ async setPasswordResetTokenForEmail(email: string, serviceOptions?: ServiceOptions): Promise<TUser> {
150
+ // Get user
151
+ const dbObject = await this.mainDbModel.findOne({ email }).exec();
152
+ if (!dbObject) {
153
+ throw new NotFoundException(`No user found with email: ${email}`);
184
154
  }
185
-
186
- // Set reset token
187
- const resetToken = crypto.randomBytes(32).toString('hex');
188
- user.passwordResetToken = resetToken;
189
- await user.save();
190
-
191
- // Return user who want to reset the password
192
- return this.prepareOutput(this.model.map(user), args[0]);
155
+ return this.process(
156
+ async () => {
157
+ // Set reset token
158
+ const resetToken = crypto.randomBytes(32).toString('hex');
159
+ dbObject.passwordResetToken = resetToken;
160
+ await dbObject.save();
161
+
162
+ // Return user
163
+ return dbObject;
164
+ },
165
+ { dbObject, serviceOptions }
166
+ );
193
167
  }
194
168
 
195
169
  /**
196
170
  * Set roles for specified user
197
171
  */
198
- async setRoles(userId: string, roles: string[], ...args: any[]): Promise<TUser> {
172
+ async setRoles(userId: string, roles: string[], serviceOptions?: ServiceOptions): Promise<TUser> {
199
173
  // Check roles
200
174
  if (!Array.isArray(roles)) {
201
175
  throw new BadRequestException('Missing roles');
@@ -207,55 +181,11 @@ export abstract class CoreUserService<
207
181
  }
208
182
 
209
183
  // Update and return user
210
- const user = await this.userModel.findByIdAndUpdate(userId, { roles }).exec();
211
- return this.prepareOutput(this.model.map(user), args[0]);
212
- }
213
-
214
- /**
215
- * Update user via ID
216
- */
217
- async update(id: string, input: TUserInput, currentUser: TUser, ...args: any[]): Promise<TUser> {
218
- // Check if user exists
219
- const user = await this.userModel.findById(id).exec();
220
-
221
- if (!user) {
222
- throw new NotFoundException(`User not found with ID: ${id}`);
223
- }
224
-
225
- // Prepare input
226
- await this.prepareInput(input, currentUser);
227
-
228
- // Update
229
- await Object.assign(user, input).save();
230
-
231
- // Return user
232
- return await this.prepareOutput(this.model.map(user), args[0]);
233
- }
234
-
235
- // ===================================================================================================================
236
- // Helper methods
237
- // ===================================================================================================================
238
-
239
- /**
240
- * Prepare input before save
241
- */
242
- protected async prepareInput(
243
- input: Record<string, any>,
244
- currentUser?: TUser,
245
- options: { [key: string]: any; checkRoles?: boolean; clone?: boolean } = {},
246
- ...args: any[]
247
- ) {
248
- return ServiceHelper.prepareInput(input, currentUser, options);
249
- }
250
-
251
- /**
252
- * Prepare output before return
253
- */
254
- protected async prepareOutput(
255
- user: TUser,
256
- options: { [key: string]: any; clone?: boolean } = {},
257
- ...args: any[]
258
- ): Promise<TUser> {
259
- return ServiceHelper.prepareOutput(user, options);
184
+ return this.process(
185
+ async (data) => {
186
+ return await this.mainDbModel.findByIdAndUpdate(userId, { roles }).exec();
187
+ },
188
+ { serviceOptions }
189
+ );
260
190
  }
261
191
  }
@@ -1,7 +1,7 @@
1
1
  import { DynamicModule, Global, Module, UnauthorizedException } from '@nestjs/common';
2
2
  import { APP_INTERCEPTOR, APP_PIPE } from '@nestjs/core';
3
3
  import { GraphQLModule } from '@nestjs/graphql';
4
- import { Config } from './core/common/helpers/config.helper';
4
+ import { merge } from './core/common/helpers/config.helper';
5
5
  import { CheckResponseInterceptor } from './core/common/interceptors/check-response.interceptor';
6
6
  import { IServerOptions } from './core/common/interfaces/server-options.interface';
7
7
  import { MapAndValidatePipe } from './core/common/pipes/map-and-validate.pipe';
@@ -36,7 +36,7 @@ export class CoreModule {
36
36
  */
37
37
  static forRoot(AuthService: any, AuthModule: any, options: Partial<IServerOptions>): DynamicModule {
38
38
  // Process config
39
- const config: IServerOptions = Config.merge(
39
+ const config: IServerOptions = merge(
40
40
  {
41
41
  env: 'develop',
42
42
  graphQl: {
package/src/index.ts CHANGED
@@ -19,6 +19,7 @@ export * from './core/common/enums/role.enum';
19
19
  export * from './core/common/enums/sort-order.emum';
20
20
  export * from './core/common/helpers/config.helper';
21
21
  export * from './core/common/helpers/context.helper';
22
+ export * from './core/common/helpers/db.helper';
22
23
  export * from './core/common/helpers/file.helper';
23
24
  export * from './core/common/helpers/filter.helper';
24
25
  export * from './core/common/helpers/graphql.helper';
@@ -33,7 +34,9 @@ export * from './core/common/inputs/sort.input';
33
34
  export * from './core/common/interceptors/check-response.interceptor';
34
35
  export * from './core/common/interfaces/core-persistence-model.interface';
35
36
  export * from './core/common/interfaces/mailjet-options.interface';
37
+ export * from './core/common/interfaces/resolve-selector.interface';
36
38
  export * from './core/common/interfaces/server-options.interface';
39
+ export * from './core/common/interfaces/service-options.interface';
37
40
  export * from './core/common/models/core-model.model';
38
41
  export * from './core/common/models/core-persistence.model';
39
42
  export * from './core/common/pipes/check-input.pipe';
@@ -42,10 +45,16 @@ export * from './core/common/scalars/any.scalar';
42
45
  export * from './core/common/scalars/date.scalar';
43
46
  export * from './core/common/scalars/json.scalar';
44
47
  export * from './core/common/services/config.service';
48
+ export * from './core/common/services/crud.service';
45
49
  export * from './core/common/services/email.service';
46
50
  export * from './core/common/services/mailjet.service';
51
+ export * from './core/common/services/module.service';
47
52
  export * from './core/common/services/template.service';
53
+ export * from './core/common/types/core-model-constructor.type';
54
+ export * from './core/common/types/field-selection.type';
55
+ export * from './core/common/types/ids.type';
48
56
  export * from './core/common/types/plain-input.type';
57
+ export * from './core/common/types/string-or-object-id.type';
49
58
 
50
59
  // =====================================================================================================================
51
60
  // Core - Modules - Auth
@@ -68,7 +77,6 @@ export * from './core/modules/auth/jwt.strategy';
68
77
 
69
78
  export * from './core/modules/user/inputs/core-user.input';
70
79
  export * from './core/modules/user/inputs/core-user-create.input';
71
- export * from './core/modules/user/core-basic-user.service';
72
80
  export * from './core/modules/user/core-user.model';
73
81
  export * from './core/modules/user/core-user.service';
74
82
 
package/src/main.ts CHANGED
@@ -7,7 +7,7 @@ import { ServerModule } from './server/server.module';
7
7
  * Preparations for server start
8
8
  */
9
9
  async function bootstrap() {
10
- // Create a new server based on fastify
10
+ // Create a new server based on express
11
11
  const server = await NestFactory.create<NestExpressApplication>(
12
12
  // Include server module, with all necessary modules for the project
13
13
  ServerModule
@@ -1,4 +1,5 @@
1
- import { Args, Query, Resolver } from '@nestjs/graphql';
1
+ import { Args, Info, Query, Resolver } from '@nestjs/graphql';
2
+ import { GraphQLResolveInfo } from 'graphql';
2
3
  import { CoreAuthResolver } from '../../../core/modules/auth/core-auth.resolver';
3
4
  import { Auth } from './auth.model';
4
5
 
@@ -11,7 +12,11 @@ export class AuthResolver extends CoreAuthResolver {
11
12
  * Get user via ID
12
13
  */
13
14
  @Query((returns) => Auth, { description: 'Get JWT token' })
14
- async signIn(@Args('email') email: string, @Args('password') password: string): Promise<Auth> {
15
- return (await this.authService.signIn(email, password)) as Auth;
15
+ async signIn(
16
+ @Args('email') email: string,
17
+ @Args('password') password: string,
18
+ @Info() info: GraphQLResolveInfo
19
+ ): Promise<Auth> {
20
+ return (await this.authService.signIn(email, password, { fieldSelection: { info, select: 'signIn' } })) as Auth;
16
21
  }
17
22
  }
@@ -4,7 +4,7 @@ import { diskStorage } from 'multer';
4
4
  import envConfig from '../../../config.env';
5
5
  import { Roles } from '../../../core/common/decorators/roles.decorator';
6
6
  import { RoleEnum } from '../../../core/common/enums/role.enum';
7
- import { FileHelper } from '../../../core/common/helpers/file.helper';
7
+ import { multerRandomFileName } from '../../../core/common/helpers/file.helper';
8
8
 
9
9
  /**
10
10
  * File controller for
@@ -27,7 +27,7 @@ export class FileController {
27
27
  destination: envConfig.staticAssets.path,
28
28
 
29
29
  // Generated random file name
30
- filename: FileHelper.multerRandomFileName(),
30
+ filename: multerRandomFileName(),
31
31
  }),
32
32
  })
33
33
  )
@@ -5,7 +5,7 @@ import envConfig from '../../../config.env';
5
5
  import { RESTUser } from '../../../core/common/decorators/rest-user.decorator';
6
6
  import { Roles } from '../../../core/common/decorators/roles.decorator';
7
7
  import { RoleEnum } from '../../../core/common/enums/role.enum';
8
- import { FileHelper } from '../../../core/common/helpers/file.helper';
8
+ import { multerOptionsForImageUpload } from '../../../core/common/helpers/file.helper';
9
9
  import { User } from './user.model';
10
10
  import { UserService } from './user.service';
11
11
 
@@ -22,12 +22,12 @@ export class AvatarController {
22
22
  /**
23
23
  * Upload files
24
24
  */
25
- @Roles(RoleEnum.USER)
25
+ @Roles(RoleEnum.S_USER)
26
26
  @Post('upload')
27
27
  @UseInterceptors(
28
28
  FileInterceptor(
29
29
  'file',
30
- FileHelper.multerOptionsForImageUpload({
30
+ multerOptionsForImageUpload({
31
31
  destination: envConfig.staticAssets.path + '/avatars',
32
32
  })
33
33
  )
@@ -1,11 +1,11 @@
1
1
  import { Module } from '@nestjs/common';
2
+ import { MongooseModule } from '@nestjs/mongoose';
3
+ import { PubSub } from 'graphql-subscriptions';
2
4
  import { JSON } from '../../../core/common/scalars/json.scalar';
3
5
  import { AvatarController } from './avatar.controller';
4
6
  import { User, UserSchema } from './user.model';
5
7
  import { UserResolver } from './user.resolver';
6
8
  import { UserService } from './user.service';
7
- import { MongooseModule } from '@nestjs/mongoose';
8
- import { PubSub } from 'graphql-subscriptions';
9
9
 
10
10
  /**
11
11
  * User module
@@ -17,11 +17,15 @@ import { PubSub } from 'graphql-subscriptions';
17
17
  JSON,
18
18
  UserResolver,
19
19
  UserService,
20
+ {
21
+ provide: 'USER_CLASS',
22
+ useValue: User,
23
+ },
20
24
  {
21
25
  provide: 'PUB_SUB',
22
26
  useValue: new PubSub(),
23
27
  },
24
28
  ],
25
- exports: [MongooseModule, UserResolver, UserService],
29
+ exports: [MongooseModule, UserResolver, UserService, 'USER_CLASS'],
26
30
  })
27
31
  export class UserModule {}