@lenne.tech/nest-server 8.0.1 → 8.2.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 (164) 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 +2 -0
  6. package/dist/core/common/decorators/restricted.decorator.js +10 -7
  7. package/dist/core/common/decorators/restricted.decorator.js.map +1 -1
  8. package/dist/core/common/helpers/config.helper.d.ts +2 -1
  9. package/dist/core/common/helpers/config.helper.js +11 -7
  10. package/dist/core/common/helpers/config.helper.js.map +1 -1
  11. package/dist/core/common/helpers/context.helper.d.ts +7 -1
  12. package/dist/core/common/helpers/context.helper.js +33 -29
  13. package/dist/core/common/helpers/context.helper.js.map +1 -1
  14. package/dist/core/common/helpers/db.helper.d.ts +35 -0
  15. package/dist/core/common/helpers/db.helper.js +345 -0
  16. package/dist/core/common/helpers/db.helper.js.map +1 -0
  17. package/dist/core/common/helpers/file.helper.d.ts +8 -1
  18. package/dist/core/common/helpers/file.helper.js +43 -31
  19. package/dist/core/common/helpers/file.helper.js.map +1 -1
  20. package/dist/core/common/helpers/filter.helper.d.ts +3 -0
  21. package/dist/core/common/helpers/filter.helper.js +93 -81
  22. package/dist/core/common/helpers/filter.helper.js.map +1 -1
  23. package/dist/core/common/helpers/graphql.helper.d.ts +24 -1
  24. package/dist/core/common/helpers/graphql.helper.js +144 -96
  25. package/dist/core/common/helpers/graphql.helper.js.map +1 -1
  26. package/dist/core/common/helpers/input.helper.d.ts +40 -4
  27. package/dist/core/common/helpers/input.helper.js +253 -97
  28. package/dist/core/common/helpers/input.helper.js.map +1 -1
  29. package/dist/core/common/helpers/model.helper.d.ts +11 -0
  30. package/dist/core/common/helpers/model.helper.js +41 -29
  31. package/dist/core/common/helpers/model.helper.js.map +1 -1
  32. package/dist/core/common/helpers/service.helper.d.ts +21 -1
  33. package/dist/core/common/helpers/service.helper.js +80 -72
  34. package/dist/core/common/helpers/service.helper.js.map +1 -1
  35. package/dist/core/common/inputs/combined-filter.input.js +1 -1
  36. package/dist/core/common/inputs/combined-filter.input.js.map +1 -1
  37. package/dist/core/common/inputs/core-input.input.js +1 -1
  38. package/dist/core/common/inputs/core-input.input.js.map +1 -1
  39. package/dist/core/common/interceptors/check-response.interceptor.js +1 -1
  40. package/dist/core/common/interceptors/check-response.interceptor.js.map +1 -1
  41. package/dist/core/common/interfaces/resolve-selector.interface.d.ts +5 -0
  42. package/dist/core/common/interfaces/resolve-selector.interface.js +3 -0
  43. package/dist/core/common/interfaces/resolve-selector.interface.js.map +1 -0
  44. package/dist/core/common/interfaces/service-options.interface.d.ts +36 -0
  45. package/dist/core/common/interfaces/service-options.interface.js +3 -0
  46. package/dist/core/common/interfaces/service-options.interface.js.map +1 -0
  47. package/dist/core/common/models/core-model.model.d.ts +5 -1
  48. package/dist/core/common/models/core-model.model.js +1 -1
  49. package/dist/core/common/models/core-model.model.js.map +1 -1
  50. package/dist/core/common/pipes/check-input.pipe.js +2 -2
  51. package/dist/core/common/pipes/check-input.pipe.js.map +1 -1
  52. package/dist/core/common/pipes/map-and-validate.pipe.js +1 -1
  53. package/dist/core/common/pipes/map-and-validate.pipe.js.map +1 -1
  54. package/dist/core/common/plugins/mongoose-id.plugin.js +1 -1
  55. package/dist/core/common/plugins/mongoose-id.plugin.js.map +1 -1
  56. package/dist/core/common/services/crud.service.d.ts +13 -0
  57. package/dist/core/common/services/crud.service.js +57 -0
  58. package/dist/core/common/services/crud.service.js.map +1 -0
  59. package/dist/core/common/services/email.service.js +8 -8
  60. package/dist/core/common/services/email.service.js.map +1 -1
  61. package/dist/core/common/services/module.service.d.ts +39 -0
  62. package/dist/core/common/services/module.service.js +76 -0
  63. package/dist/core/common/services/module.service.js.map +1 -0
  64. package/dist/core/common/types/core-model-constructor.type.d.ts +21 -0
  65. package/dist/core/common/types/core-model-constructor.type.js +3 -0
  66. package/dist/core/common/types/core-model-constructor.type.js.map +1 -0
  67. package/dist/core/common/types/field-selection.type.d.ts +4 -0
  68. package/dist/core/common/types/field-selection.type.js +3 -0
  69. package/dist/core/common/types/field-selection.type.js.map +1 -0
  70. package/dist/core/common/types/ids.type.d.ts +8 -0
  71. package/dist/core/common/types/ids.type.js +3 -0
  72. package/dist/core/common/types/ids.type.js.map +1 -0
  73. package/dist/core/common/types/string-or-object-id.type.d.ts +2 -0
  74. package/dist/core/common/types/string-or-object-id.type.js +3 -0
  75. package/dist/core/common/types/string-or-object-id.type.js.map +1 -0
  76. package/dist/core/modules/auth/core-auth.resolver.d.ts +2 -1
  77. package/dist/core/modules/auth/core-auth.resolver.js +4 -3
  78. package/dist/core/modules/auth/core-auth.resolver.js.map +1 -1
  79. package/dist/core/modules/auth/guards/roles.guard.js.map +1 -1
  80. package/dist/core/modules/auth/services/core-auth-user.service.d.ts +3 -1
  81. package/dist/core/modules/auth/services/core-auth-user.service.js.map +1 -1
  82. package/dist/core/modules/auth/services/core-auth.service.d.ts +2 -1
  83. package/dist/core/modules/auth/services/core-auth.service.js +6 -4
  84. package/dist/core/modules/auth/services/core-auth.service.js.map +1 -1
  85. package/dist/core/modules/user/core-user.model.js +1 -1
  86. package/dist/core/modules/user/core-user.model.js.map +1 -1
  87. package/dist/core/modules/user/core-user.service.d.ts +16 -25
  88. package/dist/core/modules/user/core-user.service.js +74 -90
  89. package/dist/core/modules/user/core-user.service.js.map +1 -1
  90. package/dist/core.module.js +1 -1
  91. package/dist/core.module.js.map +1 -1
  92. package/dist/index.d.ts +9 -1
  93. package/dist/index.js +9 -1
  94. package/dist/index.js.map +1 -1
  95. package/dist/server/modules/auth/auth.resolver.d.ts +2 -1
  96. package/dist/server/modules/auth/auth.resolver.js +4 -3
  97. package/dist/server/modules/auth/auth.resolver.js.map +1 -1
  98. package/dist/server/modules/file/file.controller.js +1 -1
  99. package/dist/server/modules/file/file.controller.js.map +1 -1
  100. package/dist/server/modules/user/avatar.controller.js +1 -1
  101. package/dist/server/modules/user/avatar.controller.js.map +1 -1
  102. package/dist/server/modules/user/user.model.d.ts +4 -2
  103. package/dist/server/modules/user/user.module.js +7 -3
  104. package/dist/server/modules/user/user.module.js.map +1 -1
  105. package/dist/server/modules/user/user.resolver.d.ts +8 -7
  106. package/dist/server/modules/user/user.resolver.js +85 -49
  107. package/dist/server/modules/user/user.resolver.js.map +1 -1
  108. package/dist/server/modules/user/user.service.d.ts +9 -18
  109. package/dist/server/modules/user/user.service.js +19 -30
  110. package/dist/server/modules/user/user.service.js.map +1 -1
  111. package/dist/test/test.helper.d.ts +1 -2
  112. package/dist/test/test.helper.js +1 -16
  113. package/dist/test/test.helper.js.map +1 -1
  114. package/dist/tsconfig.build.tsbuildinfo +1 -1
  115. package/package.json +58 -60
  116. package/src/config.env.ts +3 -2
  117. package/src/core/common/args/pagination.args.ts +2 -2
  118. package/src/core/common/decorators/restricted.decorator.ts +16 -10
  119. package/src/core/common/helpers/config.helper.ts +26 -6
  120. package/src/core/common/helpers/context.helper.ts +42 -33
  121. package/src/core/common/helpers/db.helper.ts +580 -0
  122. package/src/core/common/helpers/file.helper.ts +76 -49
  123. package/src/core/common/helpers/filter.helper.ts +119 -96
  124. package/src/core/common/helpers/graphql.helper.ts +219 -117
  125. package/src/core/common/helpers/input.helper.ts +347 -108
  126. package/src/core/common/helpers/model.helper.ts +102 -57
  127. package/src/core/common/helpers/service.helper.ts +149 -117
  128. package/src/core/common/inputs/combined-filter.input.ts +2 -2
  129. package/src/core/common/inputs/core-input.input.ts +2 -2
  130. package/src/core/common/interceptors/check-response.interceptor.ts +2 -2
  131. package/src/core/common/interfaces/resolve-selector.interface.ts +9 -0
  132. package/src/core/common/interfaces/service-options.interface.ts +71 -0
  133. package/src/core/common/models/core-model.model.ts +7 -3
  134. package/src/core/common/pipes/check-input.pipe.ts +4 -4
  135. package/src/core/common/pipes/map-and-validate.pipe.ts +2 -2
  136. package/src/core/common/plugins/mongoose-id.plugin.js +1 -1
  137. package/src/core/common/services/crud.service.ts +100 -0
  138. package/src/core/common/services/email.service.ts +9 -9
  139. package/src/core/common/services/module.service.ts +180 -0
  140. package/src/core/common/types/core-model-constructor.type.ts +30 -0
  141. package/src/core/common/types/field-selection.type.ts +8 -0
  142. package/src/core/common/types/ids.type.ts +7 -0
  143. package/src/core/common/types/string-or-object-id.type.ts +3 -0
  144. package/src/core/modules/auth/core-auth.module.ts +1 -1
  145. package/src/core/modules/auth/core-auth.resolver.ts +8 -3
  146. package/src/core/modules/auth/guards/roles.guard.ts +1 -1
  147. package/src/core/modules/auth/services/core-auth-user.service.ts +7 -1
  148. package/src/core/modules/auth/services/core-auth.service.ts +14 -4
  149. package/src/core/modules/user/core-user.model.ts +2 -1
  150. package/src/core/modules/user/core-user.service.ts +120 -185
  151. package/src/core.module.ts +2 -2
  152. package/src/index.ts +9 -1
  153. package/src/main.ts +1 -1
  154. package/src/server/modules/auth/auth.resolver.ts +8 -3
  155. package/src/server/modules/file/file.controller.ts +2 -2
  156. package/src/server/modules/user/avatar.controller.ts +2 -2
  157. package/src/server/modules/user/user.module.ts +7 -3
  158. package/src/server/modules/user/user.resolver.ts +74 -43
  159. package/src/server/modules/user/user.service.ts +23 -53
  160. package/src/test/test.helper.ts +31 -30
  161. package/dist/core/modules/user/core-basic-user.service.d.ts +0 -17
  162. package/dist/core/modules/user/core-basic-user.service.js +0 -73
  163. package/dist/core/modules/user/core-basic-user.service.js.map +0 -1
  164. 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,147 @@ 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
+ 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
+ if (!createdUser.ownerIds) {
51
+ createdUser.ownerIds = [];
52
+ }
53
+ createdUser.ownerIds.push(createdUser.id);
54
+ await createdUser.save();
55
+ } catch (error) {
56
+ if (error.code === 11000) {
57
+ throw new UnprocessableEntityException(
58
+ `User with email address "${(data.input as any).email}" already exists`
59
+ );
60
+ } else {
61
+ throw new UnprocessableEntityException();
62
+ }
63
+ }
64
+
65
+ // Return created user
66
+ return createdUser;
67
+ },
68
+ { input, serviceOptions }
69
+ );
67
70
  }
68
71
 
69
72
  /**
70
- * Delete user via ID
73
+ * Get user via email
71
74
  */
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();
75
+ async getViaEmail(email: string, serviceOptions?: ServiceOptions): Promise<TUser> {
76
+ const dbObject = await this.mainDbModel.findOne({ email }).exec();
77
+ if (!dbObject) {
78
+ throw new NotFoundException(`No user found with email: ${email}`);
79
79
  }
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;
80
+ return this.process(async () => dbObject, { dbObject, serviceOptions });
92
81
  }
93
82
 
94
83
  /**
95
- * Get user via ID
84
+ * Get verified state of user by token
96
85
  */
97
- async get(id: string, ...args: any[]): Promise<TUser> {
98
- const user = await this.userModel.findById(id).exec();
86
+ async getVerifiedState(token: string, serviceOptions?: ServiceOptions): Promise<boolean> {
87
+ const user = await this.mainDbModel.findOne({ verificationToken: token }).exec();
99
88
 
100
89
  if (!user) {
101
- throw new NotFoundException();
90
+ throw new NotFoundException(`No user found with verify token: ${token}`);
102
91
  }
103
92
 
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
- );
93
+ return user.verified;
120
94
  }
121
95
 
122
96
  /**
123
97
  * Verify user with token
124
98
  */
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();
99
+ async verify(token: string, serviceOptions?: ServiceOptions): Promise<TUser> {
100
+ // Get user
101
+ const dbObject = await this.mainDbModel.findOne({ verificationToken: token }).exec();
102
+ if (!dbObject) {
103
+ throw new NotFoundException(`No user found with verify token: ${token}`);
130
104
  }
131
-
132
- if (!user.verificationToken) {
105
+ if (!dbObject.verificationToken) {
133
106
  throw new Error('User has no token');
134
107
  }
135
-
136
- if (user.verified) {
108
+ if (dbObject.verified) {
137
109
  throw new Error('User already verified');
138
110
  }
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;
111
+ return this.process(
112
+ async () => {
113
+ // Update user
114
+ await Object.assign(dbObject, {
115
+ verified: true,
116
+ verificationToken: null,
117
+ }).save();
118
+
119
+ // Return prepared user
120
+ return dbObject;
121
+ },
122
+ { dbObject, serviceOptions }
123
+ );
154
124
  }
155
125
 
156
126
  /**
157
127
  * Set newpassword for user with token
158
128
  */
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();
129
+ async resetPassword(token: string, newPassword: string, serviceOptions?: ServiceOptions): Promise<TUser> {
130
+ // Get user
131
+ const dbObject = await this.mainDbModel.findOne({ passwordResetToken: token }).exec();
132
+ if (!dbObject) {
133
+ throw new NotFoundException(`No user found with password reset token: ${token}`);
164
134
  }
165
135
 
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]);
136
+ return this.process(
137
+ async () => {
138
+ // Update user
139
+ await Object.assign(dbObject, {
140
+ password: await bcrypt.hash(newPassword, 10),
141
+ passwordResetToken: null,
142
+ }).save();
143
+
144
+ // Return user
145
+ return dbObject;
146
+ },
147
+ { dbObject, serviceOptions }
148
+ );
174
149
  }
175
150
 
176
151
  /**
177
152
  * Set password rest token for email
178
153
  */
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();
154
+ async setPasswordResetTokenForEmail(email: string, serviceOptions?: ServiceOptions): Promise<TUser> {
155
+ // Get user
156
+ const dbObject = await this.mainDbModel.findOne({ email }).exec();
157
+ if (!dbObject) {
158
+ throw new NotFoundException(`No user found with email: ${email}`);
184
159
  }
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]);
160
+ return this.process(
161
+ async () => {
162
+ // Set reset token
163
+ const resetToken = crypto.randomBytes(32).toString('hex');
164
+ dbObject.passwordResetToken = resetToken;
165
+ await dbObject.save();
166
+
167
+ // Return user
168
+ return dbObject;
169
+ },
170
+ { dbObject, serviceOptions }
171
+ );
193
172
  }
194
173
 
195
174
  /**
196
175
  * Set roles for specified user
197
176
  */
198
- async setRoles(userId: string, roles: string[], ...args: any[]): Promise<TUser> {
177
+ async setRoles(userId: string, roles: string[], serviceOptions?: ServiceOptions): Promise<TUser> {
199
178
  // Check roles
200
179
  if (!Array.isArray(roles)) {
201
180
  throw new BadRequestException('Missing roles');
@@ -207,55 +186,11 @@ export abstract class CoreUserService<
207
186
  }
208
187
 
209
188
  // 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);
189
+ return this.process(
190
+ async (data) => {
191
+ return await this.mainDbModel.findByIdAndUpdate(userId, { roles }).exec();
192
+ },
193
+ { serviceOptions }
194
+ );
260
195
  }
261
196
  }
@@ -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
 
@@ -27,7 +27,7 @@ export class AvatarController {
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 {}