@lenne.tech/nest-server 8.0.0 → 8.1.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 (151) hide show
  1. package/dist/core/common/args/pagination.args.js +1 -1
  2. package/dist/core/common/args/pagination.args.js.map +1 -1
  3. package/dist/core/common/helpers/config.helper.d.ts +2 -1
  4. package/dist/core/common/helpers/config.helper.js +11 -7
  5. package/dist/core/common/helpers/config.helper.js.map +1 -1
  6. package/dist/core/common/helpers/context.helper.d.ts +7 -1
  7. package/dist/core/common/helpers/context.helper.js +33 -29
  8. package/dist/core/common/helpers/context.helper.js.map +1 -1
  9. package/dist/core/common/helpers/db.helper.d.ts +35 -0
  10. package/dist/core/common/helpers/db.helper.js +345 -0
  11. package/dist/core/common/helpers/db.helper.js.map +1 -0
  12. package/dist/core/common/helpers/file.helper.d.ts +8 -1
  13. package/dist/core/common/helpers/file.helper.js +43 -31
  14. package/dist/core/common/helpers/file.helper.js.map +1 -1
  15. package/dist/core/common/helpers/filter.helper.d.ts +3 -0
  16. package/dist/core/common/helpers/filter.helper.js +93 -81
  17. package/dist/core/common/helpers/filter.helper.js.map +1 -1
  18. package/dist/core/common/helpers/graphql.helper.d.ts +24 -1
  19. package/dist/core/common/helpers/graphql.helper.js +144 -96
  20. package/dist/core/common/helpers/graphql.helper.js.map +1 -1
  21. package/dist/core/common/helpers/input.helper.d.ts +29 -3
  22. package/dist/core/common/helpers/input.helper.js +222 -105
  23. package/dist/core/common/helpers/input.helper.js.map +1 -1
  24. package/dist/core/common/helpers/model.helper.d.ts +11 -0
  25. package/dist/core/common/helpers/model.helper.js +41 -29
  26. package/dist/core/common/helpers/model.helper.js.map +1 -1
  27. package/dist/core/common/helpers/service.helper.d.ts +21 -1
  28. package/dist/core/common/helpers/service.helper.js +80 -72
  29. package/dist/core/common/helpers/service.helper.js.map +1 -1
  30. package/dist/core/common/inputs/combined-filter.input.js +1 -1
  31. package/dist/core/common/inputs/combined-filter.input.js.map +1 -1
  32. package/dist/core/common/inputs/core-input.input.js +1 -1
  33. package/dist/core/common/inputs/core-input.input.js.map +1 -1
  34. package/dist/core/common/interceptors/check-response.interceptor.js +1 -1
  35. package/dist/core/common/interceptors/check-response.interceptor.js.map +1 -1
  36. package/dist/core/common/interfaces/resolve-selector.interface.d.ts +5 -0
  37. package/dist/core/common/interfaces/resolve-selector.interface.js +3 -0
  38. package/dist/core/common/interfaces/resolve-selector.interface.js.map +1 -0
  39. package/dist/core/common/interfaces/service-options.interface.d.ts +30 -0
  40. package/dist/core/common/interfaces/service-options.interface.js +3 -0
  41. package/dist/core/common/interfaces/service-options.interface.js.map +1 -0
  42. package/dist/core/common/models/core-model.model.d.ts +4 -0
  43. package/dist/core/common/models/core-model.model.js +1 -1
  44. package/dist/core/common/models/core-model.model.js.map +1 -1
  45. package/dist/core/common/pipes/check-input.pipe.js +2 -2
  46. package/dist/core/common/pipes/check-input.pipe.js.map +1 -1
  47. package/dist/core/common/pipes/map-and-validate.pipe.js +1 -1
  48. package/dist/core/common/pipes/map-and-validate.pipe.js.map +1 -1
  49. package/dist/core/common/plugins/mongoose-id.plugin.js +1 -1
  50. package/dist/core/common/plugins/mongoose-id.plugin.js.map +1 -1
  51. package/dist/core/common/services/crud.service.d.ts +13 -0
  52. package/dist/core/common/services/crud.service.js +59 -0
  53. package/dist/core/common/services/crud.service.js.map +1 -0
  54. package/dist/core/common/services/email.service.js +8 -8
  55. package/dist/core/common/services/email.service.js.map +1 -1
  56. package/dist/core/common/services/module.service.d.ts +27 -0
  57. package/dist/core/common/services/module.service.js +41 -0
  58. package/dist/core/common/services/module.service.js.map +1 -0
  59. package/dist/core/common/types/core-model-constructor.type.d.ts +21 -0
  60. package/dist/core/common/types/core-model-constructor.type.js +3 -0
  61. package/dist/core/common/types/core-model-constructor.type.js.map +1 -0
  62. package/dist/core/common/types/field-selection.type.d.ts +4 -0
  63. package/dist/core/common/types/field-selection.type.js +3 -0
  64. package/dist/core/common/types/field-selection.type.js.map +1 -0
  65. package/dist/core/common/types/string-or-object-id.type.d.ts +2 -0
  66. package/dist/core/common/types/string-or-object-id.type.js +3 -0
  67. package/dist/core/common/types/string-or-object-id.type.js.map +1 -0
  68. package/dist/core/modules/auth/core-auth.resolver.d.ts +2 -1
  69. package/dist/core/modules/auth/core-auth.resolver.js +4 -3
  70. package/dist/core/modules/auth/core-auth.resolver.js.map +1 -1
  71. package/dist/core/modules/auth/services/core-auth-user.service.d.ts +3 -1
  72. package/dist/core/modules/auth/services/core-auth-user.service.js.map +1 -1
  73. package/dist/core/modules/auth/services/core-auth.service.d.ts +2 -1
  74. package/dist/core/modules/auth/services/core-auth.service.js +6 -4
  75. package/dist/core/modules/auth/services/core-auth.service.js.map +1 -1
  76. package/dist/core/modules/user/core-user.model.js +1 -1
  77. package/dist/core/modules/user/core-user.model.js.map +1 -1
  78. package/dist/core/modules/user/core-user.service.d.ts +16 -25
  79. package/dist/core/modules/user/core-user.service.js +79 -98
  80. package/dist/core/modules/user/core-user.service.js.map +1 -1
  81. package/dist/core.module.js +22 -19
  82. package/dist/core.module.js.map +1 -1
  83. package/dist/index.d.ts +8 -1
  84. package/dist/index.js +8 -1
  85. package/dist/index.js.map +1 -1
  86. package/dist/server/modules/auth/auth.resolver.d.ts +2 -1
  87. package/dist/server/modules/auth/auth.resolver.js +4 -3
  88. package/dist/server/modules/auth/auth.resolver.js.map +1 -1
  89. package/dist/server/modules/file/file.controller.js +1 -1
  90. package/dist/server/modules/file/file.controller.js.map +1 -1
  91. package/dist/server/modules/user/avatar.controller.js +1 -1
  92. package/dist/server/modules/user/avatar.controller.js.map +1 -1
  93. package/dist/server/modules/user/user.model.d.ts +3 -1
  94. package/dist/server/modules/user/user.module.js +7 -3
  95. package/dist/server/modules/user/user.module.js.map +1 -1
  96. package/dist/server/modules/user/user.resolver.d.ts +8 -7
  97. package/dist/server/modules/user/user.resolver.js +65 -45
  98. package/dist/server/modules/user/user.resolver.js.map +1 -1
  99. package/dist/server/modules/user/user.service.d.ts +9 -18
  100. package/dist/server/modules/user/user.service.js +19 -30
  101. package/dist/server/modules/user/user.service.js.map +1 -1
  102. package/dist/test/test.helper.d.ts +1 -2
  103. package/dist/test/test.helper.js +1 -16
  104. package/dist/test/test.helper.js.map +1 -1
  105. package/dist/tsconfig.build.tsbuildinfo +1 -1
  106. package/package.json +45 -47
  107. package/src/core/common/args/pagination.args.ts +2 -2
  108. package/src/core/common/helpers/config.helper.ts +26 -6
  109. package/src/core/common/helpers/context.helper.ts +42 -33
  110. package/src/core/common/helpers/db.helper.ts +580 -0
  111. package/src/core/common/helpers/file.helper.ts +76 -49
  112. package/src/core/common/helpers/filter.helper.ts +119 -96
  113. package/src/core/common/helpers/graphql.helper.ts +219 -117
  114. package/src/core/common/helpers/input.helper.ts +296 -106
  115. package/src/core/common/helpers/model.helper.ts +102 -57
  116. package/src/core/common/helpers/service.helper.ts +149 -117
  117. package/src/core/common/inputs/combined-filter.input.ts +2 -2
  118. package/src/core/common/inputs/core-input.input.ts +2 -2
  119. package/src/core/common/interceptors/check-response.interceptor.ts +2 -2
  120. package/src/core/common/interfaces/resolve-selector.interface.ts +9 -0
  121. package/src/core/common/interfaces/service-options.interface.ts +53 -0
  122. package/src/core/common/models/core-model.model.ts +6 -2
  123. package/src/core/common/pipes/check-input.pipe.ts +4 -4
  124. package/src/core/common/pipes/map-and-validate.pipe.ts +2 -2
  125. package/src/core/common/plugins/mongoose-id.plugin.js +1 -1
  126. package/src/core/common/services/crud.service.ts +105 -0
  127. package/src/core/common/services/email.service.ts +9 -9
  128. package/src/core/common/services/module.service.ts +114 -0
  129. package/src/core/common/types/core-model-constructor.type.ts +30 -0
  130. package/src/core/common/types/field-selection.type.ts +8 -0
  131. package/src/core/common/types/string-or-object-id.type.ts +3 -0
  132. package/src/core/modules/auth/core-auth.module.ts +1 -1
  133. package/src/core/modules/auth/core-auth.resolver.ts +8 -3
  134. package/src/core/modules/auth/services/core-auth-user.service.ts +7 -1
  135. package/src/core/modules/auth/services/core-auth.service.ts +14 -4
  136. package/src/core/modules/user/core-user.model.ts +2 -1
  137. package/src/core/modules/user/core-user.service.ts +131 -194
  138. package/src/core.module.ts +28 -24
  139. package/src/index.ts +8 -1
  140. package/src/main.ts +1 -1
  141. package/src/server/modules/auth/auth.resolver.ts +8 -3
  142. package/src/server/modules/file/file.controller.ts +2 -2
  143. package/src/server/modules/user/avatar.controller.ts +2 -2
  144. package/src/server/modules/user/user.module.ts +7 -3
  145. package/src/server/modules/user/user.resolver.ts +62 -37
  146. package/src/server/modules/user/user.service.ts +23 -53
  147. package/src/test/test.helper.ts +31 -30
  148. package/dist/core/modules/user/core-basic-user.service.d.ts +0 -17
  149. package/dist/core/modules/user/core-basic-user.service.js +0 -73
  150. package/dist/core/modules/user/core-basic-user.service.js.map +0 -1
  151. 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,149 @@ 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
+ } 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();
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;
70
+ async getViaEmail(email: string, serviceOptions?: ServiceOptions): Promise<TUser> {
71
+ return this.process(
72
+ async () => {
73
+ const user = await this.mainDbModel.findOne({ email }).exec();
74
+ if (!user) {
75
+ throw new NotFoundException(`No user found with email: ${email}`);
76
+ }
77
+ return user;
78
+ },
79
+ { serviceOptions }
80
+ );
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();
130
- }
131
-
132
- if (!user.verificationToken) {
133
- throw new Error('User has no token');
134
- }
135
-
136
- if (user.verified) {
137
- throw new Error('User already verified');
138
- }
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;
99
+ async verify(token: string, serviceOptions?: ServiceOptions): Promise<TUser> {
100
+ return this.process(
101
+ async () => {
102
+ // Get user
103
+ const user = await this.mainDbModel.findOne({ verificationToken: token }).exec();
104
+ if (!user) {
105
+ throw new NotFoundException(`No user found with verify token: ${token}`);
106
+ }
107
+ if (!user.verificationToken) {
108
+ throw new Error('User has no token');
109
+ }
110
+ if (user.verified) {
111
+ throw new Error('User already verified');
112
+ }
113
+
114
+ // Update user
115
+ await Object.assign(user, {
116
+ verified: true,
117
+ verificationToken: null,
118
+ }).save();
119
+
120
+ // Return prepared user
121
+ return user;
122
+ },
123
+ { serviceOptions }
124
+ );
154
125
  }
155
126
 
156
127
  /**
157
128
  * Set newpassword for user with token
158
129
  */
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();
164
- }
165
-
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]);
130
+ async resetPassword(token: string, newPassword: string, serviceOptions?: ServiceOptions): Promise<TUser> {
131
+ return this.process(
132
+ async () => {
133
+ // Get user
134
+ const user = await this.mainDbModel.findOne({ passwordResetToken: token }).exec();
135
+ if (!user) {
136
+ throw new NotFoundException(`No user found with password reset token: ${token}`);
137
+ }
138
+
139
+ // Update user
140
+ await Object.assign(user, {
141
+ password: await bcrypt.hash(newPassword, 10),
142
+ passwordResetToken: null,
143
+ }).save();
144
+
145
+ // Return user
146
+ return user;
147
+ },
148
+ { serviceOptions }
149
+ );
174
150
  }
175
151
 
176
152
  /**
177
153
  * Set password rest token for email
178
154
  */
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();
184
- }
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
+ async setPasswordResetTokenForEmail(email: string, serviceOptions?: ServiceOptions): Promise<TUser> {
156
+ return this.process(
157
+ async () => {
158
+ // Get user
159
+ const user = await this.mainDbModel.findOne({ email }).exec();
160
+ if (!user) {
161
+ throw new NotFoundException(`No user found with email: ${email}`);
162
+ }
163
+
164
+ // Set reset token
165
+ const resetToken = crypto.randomBytes(32).toString('hex');
166
+ user.passwordResetToken = resetToken;
167
+ await user.save();
168
+
169
+ // Return user
170
+ return user;
171
+ },
172
+ { serviceOptions }
173
+ );
193
174
  }
194
175
 
195
176
  /**
196
177
  * Set roles for specified user
197
178
  */
198
- async setRoles(userId: string, roles: string[], ...args: any[]): Promise<TUser> {
179
+ async setRoles(userId: string, roles: string[], serviceOptions?: ServiceOptions): Promise<TUser> {
199
180
  // Check roles
200
181
  if (!Array.isArray(roles)) {
201
182
  throw new BadRequestException('Missing roles');
@@ -207,55 +188,11 @@ export abstract class CoreUserService<
207
188
  }
208
189
 
209
190
  // 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);
191
+ return this.process(
192
+ async (data) => {
193
+ return await this.mainDbModel.findByIdAndUpdate(userId, { roles }).exec();
194
+ },
195
+ { serviceOptions }
196
+ );
260
197
  }
261
198
  }
@@ -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,39 +36,43 @@ 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: {
43
43
  driver: {
44
44
  imports: [AuthModule],
45
45
  inject: [AuthService],
46
- useFactory: async (authService: any) => ({
47
- autoSchemaFile: 'schema.gql',
48
- context: ({ req }) => ({ req }),
49
- installSubscriptionHandlers: true,
50
- subscriptions: {
51
- 'subscriptions-transport-ws': {
52
- onConnect: async (connectionParams) => {
53
- if (config.graphQl.enableSubscriptionAuth) {
54
- // get authToken from authorization header
55
- const authToken: string =
56
- 'Authorization' in connectionParams && connectionParams?.Authorization?.split(' ')[1];
46
+ useFactory: async (authService: any) =>
47
+ Object.assign(
48
+ {
49
+ autoSchemaFile: 'schema.gql',
50
+ context: ({ req }) => ({ req }),
51
+ installSubscriptionHandlers: true,
52
+ subscriptions: {
53
+ 'subscriptions-transport-ws': {
54
+ onConnect: async (connectionParams) => {
55
+ if (config.graphQl.enableSubscriptionAuth) {
56
+ // get authToken from authorization header
57
+ const authToken: string =
58
+ 'Authorization' in connectionParams && connectionParams?.Authorization?.split(' ')[1];
57
59
 
58
- if (authToken) {
59
- // verify authToken/getJwtPayLoad
60
- const payload = authService.decodeJwt(authToken);
61
- const user = await authService.validateUser(payload);
62
- // the user/jwtPayload object found will be available as context.currentUser/jwtPayload in your GraphQL resolvers
63
- return { user: user, headers: connectionParams };
64
- }
60
+ if (authToken) {
61
+ // verify authToken/getJwtPayLoad
62
+ const payload = authService.decodeJwt(authToken);
63
+ const user = await authService.validateUser(payload);
64
+ // the user/jwtPayload object found will be available as context.currentUser/jwtPayload in your GraphQL resolvers
65
+ return { user: user, headers: connectionParams };
66
+ }
65
67
 
66
- throw new UnauthorizedException();
67
- }
68
+ throw new UnauthorizedException();
69
+ }
70
+ },
71
+ },
68
72
  },
69
73
  },
70
- },
71
- }),
74
+ options?.graphQl?.driver
75
+ ),
72
76
  },
73
77
  enableSubscriptionAuth: true,
74
78
  },
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,15 @@ 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';
48
55
  export * from './core/common/types/plain-input.type';
56
+ export * from './core/common/types/string-or-object-id.type';
49
57
 
50
58
  // =====================================================================================================================
51
59
  // Core - Modules - Auth
@@ -68,7 +76,6 @@ export * from './core/modules/auth/jwt.strategy';
68
76
 
69
77
  export * from './core/modules/user/inputs/core-user.input';
70
78
  export * from './core/modules/user/inputs/core-user-create.input';
71
- export * from './core/modules/user/core-basic-user.service';
72
79
  export * from './core/modules/user/core-user.model';
73
80
  export * from './core/modules/user/core-user.service';
74
81
 
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 {}