@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.
- 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 +2 -0
- package/dist/core/common/decorators/restricted.decorator.js +10 -7
- package/dist/core/common/decorators/restricted.decorator.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 +35 -0
- package/dist/core/common/helpers/db.helper.js +345 -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 +40 -4
- package/dist/core/common/helpers/input.helper.js +253 -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/plugins/mongoose-id.plugin.js +1 -1
- package/dist/core/common/plugins/mongoose-id.plugin.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 +39 -0
- package/dist/core/common/services/module.service.js +76 -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.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 +74 -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 +1 -1
- package/dist/server/modules/user/avatar.controller.js.map +1 -1
- package/dist/server/modules/user/user.model.d.ts +4 -2
- 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 +19 -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 -60
- 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 +16 -10
- 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 +580 -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 +347 -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/plugins/mongoose-id.plugin.js +1 -1
- 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 +180 -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 +1 -1
- 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 +120 -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 +2 -2
- 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 +23 -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,147 @@ 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
|
-
|
|
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
|
-
*
|
|
73
|
+
* Get user via email
|
|
71
74
|
*/
|
|
72
|
-
async
|
|
73
|
-
|
|
74
|
-
|
|
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
|
|
84
|
+
* Get verified state of user by token
|
|
96
85
|
*/
|
|
97
|
-
async
|
|
98
|
-
const user = await this.
|
|
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
|
|
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,
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
if (!
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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,
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
if (!
|
|
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
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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,
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
if (!
|
|
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
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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[],
|
|
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
|
-
|
|
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);
|
|
189
|
+
return this.process(
|
|
190
|
+
async (data) => {
|
|
191
|
+
return await this.mainDbModel.findByIdAndUpdate(userId, { roles }).exec();
|
|
192
|
+
},
|
|
193
|
+
{ serviceOptions }
|
|
194
|
+
);
|
|
260
195
|
}
|
|
261
196
|
}
|
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
|
|
|
@@ -27,7 +27,7 @@ export class AvatarController {
|
|
|
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 {}
|