@lenne.tech/nest-server 2.0.2 → 3.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.
- package/dist/config.env.js +18 -5
- package/dist/config.env.js.map +1 -1
- package/dist/core/common/args/filter.args.js +3 -3
- package/dist/core/common/args/filter.args.js.map +1 -1
- package/dist/core/common/args/pagination.args.js +13 -13
- package/dist/core/common/args/pagination.args.js.map +1 -1
- package/dist/core/common/decorators/graphql-user.decorator.js +1 -1
- package/dist/core/common/decorators/graphql-user.decorator.js.map +1 -1
- package/dist/core/common/decorators/rest-user.decorator.js +1 -1
- package/dist/core/common/decorators/rest-user.decorator.js.map +1 -1
- package/dist/core/common/decorators/restricted.decorator.js +3 -3
- package/dist/core/common/decorators/restricted.decorator.js.map +1 -1
- package/dist/core/common/decorators/roles.decorator.js +1 -1
- package/dist/core/common/decorators/roles.decorator.js.map +1 -1
- package/dist/core/common/enums/comparison-operator.enum.js +1 -1
- package/dist/core/common/enums/comparison-operator.enum.js.map +1 -1
- package/dist/core/common/enums/logical-operator.enum.js +1 -1
- package/dist/core/common/enums/logical-operator.enum.js.map +1 -1
- package/dist/core/common/enums/sort-order.emum.js +1 -1
- package/dist/core/common/enums/sort-order.emum.js.map +1 -1
- package/dist/core/common/helpers/file.helper.js +3 -3
- package/dist/core/common/helpers/file.helper.js.map +1 -1
- package/dist/core/common/helpers/input.helper.js +3 -3
- package/dist/core/common/helpers/input.helper.js.map +1 -1
- package/dist/core/common/helpers/service.helper.d.ts +1 -0
- package/dist/core/common/helpers/service.helper.js +20 -1
- package/dist/core/common/helpers/service.helper.js.map +1 -1
- package/dist/core/common/inputs/combined-filter.input.js +3 -3
- package/dist/core/common/inputs/combined-filter.input.js.map +1 -1
- package/dist/core/common/inputs/filter.input.js +3 -3
- package/dist/core/common/inputs/filter.input.js.map +1 -1
- package/dist/core/common/inputs/single-filter.input.js +6 -6
- package/dist/core/common/inputs/single-filter.input.js.map +1 -1
- package/dist/core/common/inputs/sort.input.js +3 -3
- package/dist/core/common/inputs/sort.input.js.map +1 -1
- package/dist/core/common/interceptors/check-response.interceptor.js +3 -3
- package/dist/core/common/interceptors/check-response.interceptor.js.map +1 -1
- package/dist/core/common/interfaces/mailjet-options.interface.d.ts +4 -0
- package/dist/core/common/interfaces/mailjet-options.interface.js +3 -0
- package/dist/core/common/interfaces/mailjet-options.interface.js.map +1 -0
- package/dist/core/common/interfaces/server-options.interface.d.ts +4 -0
- package/dist/core/common/models/core-persistence.model.js +14 -14
- package/dist/core/common/models/core-persistence.model.js.map +1 -1
- package/dist/core/common/pipes/check-input.pipe.js +5 -5
- package/dist/core/common/pipes/check-input.pipe.js.map +1 -1
- package/dist/core/common/scalars/any.scalar.js +1 -1
- package/dist/core/common/scalars/any.scalar.js.map +1 -1
- package/dist/core/common/scalars/date.scalar.js +1 -1
- package/dist/core/common/scalars/date.scalar.js.map +1 -1
- package/dist/core/common/scalars/json.scalar.js +1 -1
- package/dist/core/common/scalars/json.scalar.js.map +1 -1
- package/dist/core/common/services/config.service.d.ts +1 -1
- package/dist/core/common/services/config.service.js +3 -3
- package/dist/core/common/services/config.service.js.map +1 -1
- package/dist/core/common/services/email.service.js +1 -1
- package/dist/core/common/services/email.service.js.map +1 -1
- package/dist/core/common/services/mailjet.service.d.ts +15 -0
- package/dist/core/common/services/mailjet.service.js +64 -0
- package/dist/core/common/services/mailjet.service.js.map +1 -0
- package/dist/core/common/services/template.service.js +2 -2
- package/dist/core/common/services/template.service.js.map +1 -1
- package/dist/core/modules/auth/core-auth.model.js +2 -2
- package/dist/core/modules/auth/core-auth.model.js.map +1 -1
- package/dist/core/modules/auth/core-auth.module.js +1 -1
- package/dist/core/modules/auth/core-auth.module.js.map +1 -1
- package/dist/core/modules/auth/core-auth.resolver.js +4 -4
- package/dist/core/modules/auth/core-auth.resolver.js.map +1 -1
- package/dist/core/modules/auth/guards/auth.guard.js +3 -3
- package/dist/core/modules/auth/guards/auth.guard.js.map +1 -1
- package/dist/core/modules/auth/guards/roles.guard.js +2 -2
- package/dist/core/modules/auth/guards/roles.guard.js.map +1 -1
- package/dist/core/modules/auth/jwt.strategy.js +2 -2
- package/dist/core/modules/auth/jwt.strategy.js.map +1 -1
- package/dist/core/modules/auth/services/core-auth.service.js +1 -1
- package/dist/core/modules/auth/services/core-auth.service.js.map +1 -1
- package/dist/core/modules/user/core-basic-user.service.d.ts +1 -1
- package/dist/core/modules/user/core-user.model.d.ts +3 -0
- package/dist/core/modules/user/core-user.model.js +35 -18
- package/dist/core/modules/user/core-user.model.js.map +1 -1
- package/dist/core/modules/user/core-user.service.d.ts +4 -3
- package/dist/core/modules/user/core-user.service.js +28 -1
- package/dist/core/modules/user/core-user.service.js.map +1 -1
- package/dist/core/modules/user/inputs/core-user-create.input.js +3 -3
- package/dist/core/modules/user/inputs/core-user-create.input.js.map +1 -1
- package/dist/core/modules/user/inputs/core-user.input.js +15 -15
- package/dist/core/modules/user/inputs/core-user.input.js.map +1 -1
- package/dist/core.module.js +5 -3
- package/dist/core.module.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/server/common/models/persistence.model.js +5 -5
- package/dist/server/common/models/persistence.model.js.map +1 -1
- package/dist/server/modules/auth/auth.model.js +2 -2
- package/dist/server/modules/auth/auth.model.js.map +1 -1
- package/dist/server/modules/auth/auth.module.js +1 -1
- package/dist/server/modules/auth/auth.module.js.map +1 -1
- package/dist/server/modules/auth/auth.resolver.js +4 -4
- package/dist/server/modules/auth/auth.resolver.js.map +1 -1
- package/dist/server/modules/file/file.controller.js +7 -7
- package/dist/server/modules/file/file.controller.js.map +1 -1
- package/dist/server/modules/user/avatar.controller.js +6 -6
- package/dist/server/modules/user/avatar.controller.js.map +1 -1
- package/dist/server/modules/user/inputs/user-create.input.js +1 -1
- package/dist/server/modules/user/inputs/user-create.input.js.map +1 -1
- package/dist/server/modules/user/inputs/user.input.js +1 -1
- package/dist/server/modules/user/inputs/user.input.js.map +1 -1
- package/dist/server/modules/user/user.model.d.ts +1 -1
- package/dist/server/modules/user/user.model.js +8 -8
- package/dist/server/modules/user/user.model.js.map +1 -1
- package/dist/server/modules/user/user.module.js +1 -1
- package/dist/server/modules/user/user.module.js.map +1 -1
- package/dist/server/modules/user/user.resolver.d.ts +3 -0
- package/dist/server/modules/user/user.resolver.js +55 -24
- package/dist/server/modules/user/user.resolver.js.map +1 -1
- package/dist/server/modules/user/user.service.d.ts +3 -0
- package/dist/server/modules/user/user.service.js +47 -6
- package/dist/server/modules/user/user.service.js.map +1 -1
- package/dist/server/server.controller.js +5 -5
- package/dist/server/server.controller.js.map +1 -1
- package/dist/server/server.module.js +1 -1
- package/dist/server/server.module.js.map +1 -1
- package/dist/test/test.helper.js +2 -2
- package/dist/test/test.helper.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +48 -54
- package/src/config.env.ts +14 -1
- package/src/core/common/helpers/service.helper.ts +27 -2
- package/src/core/common/interfaces/mailjet-options.interface.ts +4 -0
- package/src/core/common/interfaces/server-options.interface.ts +12 -0
- package/src/core/common/models/core-persistence.model.ts +1 -1
- package/src/core/common/services/config.service.ts +7 -5
- package/src/core/common/services/mailjet.service.ts +84 -0
- package/src/core/modules/user/core-basic-user.service.ts +3 -3
- package/src/core/modules/user/core-user.model.ts +20 -0
- package/src/core/modules/user/core-user.service.ts +54 -8
- package/src/core.module.ts +3 -1
- package/src/index.ts +1 -0
- package/src/server/modules/user/user.resolver.ts +24 -0
- package/src/server/modules/user/user.service.ts +86 -4
- package/src/server/server.module.ts +0 -1
- package/src/templates/password-reset.ejs +3 -0
- package/src/templates/welcome.ejs +3 -2
- package/src/test/test.helper.ts +2 -2
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
Inject,
|
|
3
|
+
Injectable,
|
|
4
|
+
NotFoundException,
|
|
5
|
+
UnauthorizedException,
|
|
6
|
+
UnprocessableEntityException,
|
|
7
|
+
} from '@nestjs/common';
|
|
2
8
|
import * as fs from 'fs';
|
|
3
9
|
import { GraphQLResolveInfo } from 'graphql';
|
|
4
10
|
import envConfig from '../../../config.env';
|
|
@@ -15,6 +21,8 @@ import { InjectModel } from '@nestjs/mongoose';
|
|
|
15
21
|
import { Model } from 'mongoose';
|
|
16
22
|
import { ICorePersistenceModel } from '../../../core/common/interfaces/core-persistence-model.interface';
|
|
17
23
|
import { PubSub } from 'graphql-subscriptions';
|
|
24
|
+
import * as crypto from 'crypto';
|
|
25
|
+
import * as bcrypt from 'bcrypt';
|
|
18
26
|
|
|
19
27
|
/**
|
|
20
28
|
* User service
|
|
@@ -55,17 +63,91 @@ export class UserService extends CoreUserService<User, UserInput, UserCreateInpu
|
|
|
55
63
|
*/
|
|
56
64
|
async create(input: UserCreateInput, currentUser?: User, ...args: any[]): Promise<User> {
|
|
57
65
|
const user = await super.create(input, currentUser);
|
|
58
|
-
|
|
66
|
+
|
|
67
|
+
await this.prepareOutput(user, args[0]);
|
|
68
|
+
|
|
59
69
|
await this.pubSub.publish('userCreated', User.map(user));
|
|
70
|
+
|
|
71
|
+
const verificationToken = crypto.randomBytes(32).toString('hex');
|
|
72
|
+
await this.userModel.findByIdAndUpdate(user.id, { $set: { verificationToken } }).exec();
|
|
73
|
+
|
|
60
74
|
await this.emailService.sendMail(user.email, 'Welcome', {
|
|
61
75
|
htmlTemplate: 'welcome',
|
|
62
|
-
templateData: user,
|
|
63
|
-
text,
|
|
76
|
+
templateData: { name: user.username, link: envConfig.email.verificationLink + '/' + verificationToken },
|
|
64
77
|
});
|
|
65
78
|
|
|
66
79
|
return user;
|
|
67
80
|
}
|
|
68
81
|
|
|
82
|
+
/**
|
|
83
|
+
* Verify user with token
|
|
84
|
+
*
|
|
85
|
+
* @param token
|
|
86
|
+
*/
|
|
87
|
+
async verify(token: string): Promise<boolean> {
|
|
88
|
+
const user = await this.userModel.findOne({ verificationToken: token }).exec();
|
|
89
|
+
|
|
90
|
+
if (!user) {
|
|
91
|
+
throw new NotFoundException();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (!user.verificationToken) {
|
|
95
|
+
throw new Error('User has no token');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (user.verified) {
|
|
99
|
+
throw new Error('User already verified');
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
await this.userModel.findByIdAndUpdate(user.id, { $set: { verified: true, verificationToken: null } }).exec();
|
|
103
|
+
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Set newpassword for user with token
|
|
109
|
+
*
|
|
110
|
+
* @param token
|
|
111
|
+
* @param newPassword
|
|
112
|
+
*/
|
|
113
|
+
async resetPassword(token: string, newPassword: string): Promise<boolean> {
|
|
114
|
+
const user = await this.userModel.findOne({ passwordResetToken: token }).exec();
|
|
115
|
+
|
|
116
|
+
if (!user) {
|
|
117
|
+
throw new NotFoundException();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const cryptedPassword = await bcrypt.hash(newPassword, 10);
|
|
121
|
+
await this.userModel
|
|
122
|
+
.findByIdAndUpdate(user.id, { $set: { password: cryptedPassword, passwordResetToken: null } })
|
|
123
|
+
.exec();
|
|
124
|
+
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Request email with password reset link
|
|
130
|
+
*
|
|
131
|
+
* @param email
|
|
132
|
+
*/
|
|
133
|
+
async requestPasswordResetMail(email: string): Promise<boolean> {
|
|
134
|
+
const user = await this.userModel.findOne({ email }).exec();
|
|
135
|
+
|
|
136
|
+
if (!user) {
|
|
137
|
+
throw new NotFoundException();
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const resetToken = crypto.randomBytes(32).toString('hex');
|
|
141
|
+
await this.userModel.findByIdAndUpdate(user.id, { $set: { passwordResetToken: resetToken } }).exec();
|
|
142
|
+
|
|
143
|
+
await this.emailService.sendMail(user.email, 'Password reset', {
|
|
144
|
+
htmlTemplate: 'password-reset',
|
|
145
|
+
templateData: { name: user.username, link: envConfig.email.passwordResetLink + '/' + resetToken },
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
|
|
69
151
|
/**
|
|
70
152
|
* Get users via filter
|
|
71
153
|
*/
|
|
@@ -4,7 +4,6 @@ import { CoreModule } from '../core.module';
|
|
|
4
4
|
import { AuthModule } from './modules/auth/auth.module';
|
|
5
5
|
import { FileController } from './modules/file/file.controller';
|
|
6
6
|
import { ServerController } from './server.controller';
|
|
7
|
-
import { PubSub } from 'graphql-subscriptions';
|
|
8
7
|
|
|
9
8
|
/**
|
|
10
9
|
* Server module (dynamic)
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
<h1>Welcome <%=
|
|
2
|
-
<p>
|
|
1
|
+
<h1>Welcome <%= name %>,</h1>
|
|
2
|
+
<p>please confirm your email address.</p>
|
|
3
|
+
<a href="<%= link %>">E-Mail bestätigen</a>
|
package/src/test/test.helper.ts
CHANGED
|
@@ -113,7 +113,7 @@ export class TestHelper {
|
|
|
113
113
|
/**
|
|
114
114
|
* GraphQL request
|
|
115
115
|
* @param graphql
|
|
116
|
-
* @param
|
|
116
|
+
* @param options
|
|
117
117
|
*/
|
|
118
118
|
async graphQl(graphql: string | TestGraphQLConfig, options: TestGraphQLOptions = {}): Promise<any> {
|
|
119
119
|
// Default options
|
|
@@ -148,7 +148,7 @@ export class TestHelper {
|
|
|
148
148
|
graphql = Object.assign(
|
|
149
149
|
{
|
|
150
150
|
arguments: null,
|
|
151
|
-
fields: [
|
|
151
|
+
fields: [],
|
|
152
152
|
name: null,
|
|
153
153
|
type: TestGraphQLType.QUERY,
|
|
154
154
|
},
|