@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.
- package/dist/config.env.js +3 -2
- package/dist/config.env.js.map +1 -1
- package/dist/core/common/args/pagination.args.js +1 -1
- package/dist/core/common/args/pagination.args.js.map +1 -1
- package/dist/core/common/decorators/restricted.decorator.d.ts +3 -0
- package/dist/core/common/decorators/restricted.decorator.js +14 -8
- package/dist/core/common/decorators/restricted.decorator.js.map +1 -1
- package/dist/core/common/enums/role.enum.d.ts +3 -2
- package/dist/core/common/enums/role.enum.js +3 -2
- package/dist/core/common/enums/role.enum.js.map +1 -1
- package/dist/core/common/helpers/config.helper.d.ts +2 -1
- package/dist/core/common/helpers/config.helper.js +11 -7
- package/dist/core/common/helpers/config.helper.js.map +1 -1
- package/dist/core/common/helpers/context.helper.d.ts +7 -1
- package/dist/core/common/helpers/context.helper.js +33 -29
- package/dist/core/common/helpers/context.helper.js.map +1 -1
- package/dist/core/common/helpers/db.helper.d.ts +37 -0
- package/dist/core/common/helpers/db.helper.js +356 -0
- package/dist/core/common/helpers/db.helper.js.map +1 -0
- package/dist/core/common/helpers/file.helper.d.ts +8 -1
- package/dist/core/common/helpers/file.helper.js +43 -31
- package/dist/core/common/helpers/file.helper.js.map +1 -1
- package/dist/core/common/helpers/filter.helper.d.ts +3 -0
- package/dist/core/common/helpers/filter.helper.js +93 -81
- package/dist/core/common/helpers/filter.helper.js.map +1 -1
- package/dist/core/common/helpers/graphql.helper.d.ts +24 -1
- package/dist/core/common/helpers/graphql.helper.js +144 -96
- package/dist/core/common/helpers/graphql.helper.js.map +1 -1
- package/dist/core/common/helpers/input.helper.d.ts +42 -4
- package/dist/core/common/helpers/input.helper.js +256 -97
- package/dist/core/common/helpers/input.helper.js.map +1 -1
- package/dist/core/common/helpers/model.helper.d.ts +11 -0
- package/dist/core/common/helpers/model.helper.js +41 -29
- package/dist/core/common/helpers/model.helper.js.map +1 -1
- package/dist/core/common/helpers/service.helper.d.ts +21 -1
- package/dist/core/common/helpers/service.helper.js +80 -72
- package/dist/core/common/helpers/service.helper.js.map +1 -1
- package/dist/core/common/inputs/combined-filter.input.js +1 -1
- package/dist/core/common/inputs/combined-filter.input.js.map +1 -1
- package/dist/core/common/inputs/core-input.input.js +1 -1
- package/dist/core/common/inputs/core-input.input.js.map +1 -1
- package/dist/core/common/interceptors/check-response.interceptor.js +1 -1
- package/dist/core/common/interceptors/check-response.interceptor.js.map +1 -1
- package/dist/core/common/interfaces/resolve-selector.interface.d.ts +5 -0
- package/dist/core/common/interfaces/resolve-selector.interface.js +3 -0
- package/dist/core/common/interfaces/resolve-selector.interface.js.map +1 -0
- package/dist/core/common/interfaces/service-options.interface.d.ts +36 -0
- package/dist/core/common/interfaces/service-options.interface.js +3 -0
- package/dist/core/common/interfaces/service-options.interface.js.map +1 -0
- package/dist/core/common/models/core-model.model.d.ts +5 -1
- package/dist/core/common/models/core-model.model.js +1 -1
- package/dist/core/common/models/core-model.model.js.map +1 -1
- package/dist/core/common/pipes/check-input.pipe.js +2 -2
- package/dist/core/common/pipes/check-input.pipe.js.map +1 -1
- package/dist/core/common/pipes/map-and-validate.pipe.js +1 -1
- package/dist/core/common/pipes/map-and-validate.pipe.js.map +1 -1
- package/dist/core/common/services/crud.service.d.ts +13 -0
- package/dist/core/common/services/crud.service.js +57 -0
- package/dist/core/common/services/crud.service.js.map +1 -0
- package/dist/core/common/services/email.service.js +8 -8
- package/dist/core/common/services/email.service.js.map +1 -1
- package/dist/core/common/services/module.service.d.ts +40 -0
- package/dist/core/common/services/module.service.js +80 -0
- package/dist/core/common/services/module.service.js.map +1 -0
- package/dist/core/common/types/core-model-constructor.type.d.ts +21 -0
- package/dist/core/common/types/core-model-constructor.type.js +3 -0
- package/dist/core/common/types/core-model-constructor.type.js.map +1 -0
- package/dist/core/common/types/field-selection.type.d.ts +4 -0
- package/dist/core/common/types/field-selection.type.js +3 -0
- package/dist/core/common/types/field-selection.type.js.map +1 -0
- package/dist/core/common/types/ids.type.d.ts +8 -0
- package/dist/core/common/types/ids.type.js +3 -0
- package/dist/core/common/types/ids.type.js.map +1 -0
- package/dist/core/common/types/string-or-object-id.type.d.ts +2 -0
- package/dist/core/common/types/string-or-object-id.type.js +3 -0
- package/dist/core/common/types/string-or-object-id.type.js.map +1 -0
- package/dist/core/modules/auth/core-auth.resolver.d.ts +2 -1
- package/dist/core/modules/auth/core-auth.resolver.js +4 -3
- package/dist/core/modules/auth/core-auth.resolver.js.map +1 -1
- package/dist/core/modules/auth/guards/roles.guard.js +1 -2
- package/dist/core/modules/auth/guards/roles.guard.js.map +1 -1
- package/dist/core/modules/auth/services/core-auth-user.service.d.ts +3 -1
- package/dist/core/modules/auth/services/core-auth-user.service.js.map +1 -1
- package/dist/core/modules/auth/services/core-auth.service.d.ts +2 -1
- package/dist/core/modules/auth/services/core-auth.service.js +6 -4
- package/dist/core/modules/auth/services/core-auth.service.js.map +1 -1
- package/dist/core/modules/user/core-user.model.js +1 -1
- package/dist/core/modules/user/core-user.model.js.map +1 -1
- package/dist/core/modules/user/core-user.service.d.ts +16 -25
- package/dist/core/modules/user/core-user.service.js +69 -90
- package/dist/core/modules/user/core-user.service.js.map +1 -1
- package/dist/core.module.js +1 -1
- package/dist/core.module.js.map +1 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +9 -1
- package/dist/index.js.map +1 -1
- package/dist/server/modules/auth/auth.resolver.d.ts +2 -1
- package/dist/server/modules/auth/auth.resolver.js +4 -3
- package/dist/server/modules/auth/auth.resolver.js.map +1 -1
- package/dist/server/modules/file/file.controller.js +1 -1
- package/dist/server/modules/file/file.controller.js.map +1 -1
- package/dist/server/modules/user/avatar.controller.js +2 -2
- package/dist/server/modules/user/avatar.controller.js.map +1 -1
- package/dist/server/modules/user/user.model.d.ts +2 -1
- package/dist/server/modules/user/user.module.js +7 -3
- package/dist/server/modules/user/user.module.js.map +1 -1
- package/dist/server/modules/user/user.resolver.d.ts +8 -7
- package/dist/server/modules/user/user.resolver.js +85 -49
- package/dist/server/modules/user/user.resolver.js.map +1 -1
- package/dist/server/modules/user/user.service.d.ts +9 -18
- package/dist/server/modules/user/user.service.js +23 -30
- package/dist/server/modules/user/user.service.js.map +1 -1
- package/dist/test/test.helper.d.ts +1 -2
- package/dist/test/test.helper.js +1 -16
- package/dist/test/test.helper.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +58 -59
- package/src/config.env.ts +3 -2
- package/src/core/common/args/pagination.args.ts +2 -2
- package/src/core/common/decorators/restricted.decorator.ts +24 -12
- package/src/core/common/enums/role.enum.ts +23 -5
- package/src/core/common/helpers/config.helper.ts +26 -6
- package/src/core/common/helpers/context.helper.ts +42 -33
- package/src/core/common/helpers/db.helper.ts +595 -0
- package/src/core/common/helpers/file.helper.ts +76 -49
- package/src/core/common/helpers/filter.helper.ts +119 -96
- package/src/core/common/helpers/graphql.helper.ts +219 -117
- package/src/core/common/helpers/input.helper.ts +349 -108
- package/src/core/common/helpers/model.helper.ts +102 -57
- package/src/core/common/helpers/service.helper.ts +149 -117
- package/src/core/common/inputs/combined-filter.input.ts +2 -2
- package/src/core/common/inputs/core-input.input.ts +2 -2
- package/src/core/common/interceptors/check-response.interceptor.ts +2 -2
- package/src/core/common/interfaces/resolve-selector.interface.ts +9 -0
- package/src/core/common/interfaces/service-options.interface.ts +71 -0
- package/src/core/common/models/core-model.model.ts +7 -3
- package/src/core/common/pipes/check-input.pipe.ts +4 -4
- package/src/core/common/pipes/map-and-validate.pipe.ts +2 -2
- package/src/core/common/services/crud.service.ts +100 -0
- package/src/core/common/services/email.service.ts +9 -9
- package/src/core/common/services/module.service.ts +188 -0
- package/src/core/common/types/core-model-constructor.type.ts +30 -0
- package/src/core/common/types/field-selection.type.ts +8 -0
- package/src/core/common/types/ids.type.ts +7 -0
- package/src/core/common/types/string-or-object-id.type.ts +3 -0
- package/src/core/modules/auth/core-auth.module.ts +1 -1
- package/src/core/modules/auth/core-auth.resolver.ts +8 -3
- package/src/core/modules/auth/guards/roles.guard.ts +5 -7
- package/src/core/modules/auth/services/core-auth-user.service.ts +7 -1
- package/src/core/modules/auth/services/core-auth.service.ts +14 -4
- package/src/core/modules/user/core-user.model.ts +2 -1
- package/src/core/modules/user/core-user.service.ts +115 -185
- package/src/core.module.ts +2 -2
- package/src/index.ts +9 -1
- package/src/main.ts +1 -1
- package/src/server/modules/auth/auth.resolver.ts +8 -3
- package/src/server/modules/file/file.controller.ts +2 -2
- package/src/server/modules/user/avatar.controller.ts +3 -3
- package/src/server/modules/user/user.module.ts +7 -3
- package/src/server/modules/user/user.resolver.ts +74 -43
- package/src/server/modules/user/user.service.ts +30 -53
- package/src/test/test.helper.ts +31 -30
- package/dist/core/modules/user/core-basic-user.service.d.ts +0 -17
- package/dist/core/modules/user/core-basic-user.service.js +0 -73
- package/dist/core/modules/user/core-basic-user.service.js.map +0 -1
- 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
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
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
|
|
27
|
-
protected constructor(
|
|
28
|
-
|
|
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:
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
*
|
|
68
|
+
* Get user via email
|
|
71
69
|
*/
|
|
72
|
-
async
|
|
73
|
-
|
|
74
|
-
|
|
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
|
|
79
|
+
* Get verified state of user by token
|
|
96
80
|
*/
|
|
97
|
-
async
|
|
98
|
-
const user = await this.
|
|
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
|
|
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,
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
if (!
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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,
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
if (!
|
|
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
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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,
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
if (!
|
|
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
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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[],
|
|
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
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
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
|
}
|
package/src/core.module.ts
CHANGED
|
@@ -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 {
|
|
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 =
|
|
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
|
|
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(
|
|
15
|
-
|
|
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 {
|
|
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:
|
|
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 {
|
|
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.
|
|
25
|
+
@Roles(RoleEnum.S_USER)
|
|
26
26
|
@Post('upload')
|
|
27
27
|
@UseInterceptors(
|
|
28
28
|
FileInterceptor(
|
|
29
29
|
'file',
|
|
30
|
-
|
|
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 {}
|