@adaptivestone/framework 5.0.0-beta.17 → 5.0.0-beta.18
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/CHANGELOG.md +50 -0
- package/dist/commands/GenerateTypes.d.ts +2 -2
- package/dist/commands/GenerateTypes.js +22 -8
- package/dist/commands/GenerateTypes.js.map +1 -1
- package/dist/helpers/appInstance.d.ts +3 -0
- package/dist/helpers/appInstance.js +8 -0
- package/dist/helpers/appInstance.js.map +1 -0
- package/dist/helpers/crypto.d.ts +3 -0
- package/dist/helpers/crypto.js +14 -0
- package/dist/helpers/crypto.js.map +1 -0
- package/dist/helpers/redis/clearNamespace.d.ts +1 -2
- package/dist/helpers/redis/clearNamespace.js +2 -3
- package/dist/helpers/redis/clearNamespace.js.map +1 -1
- package/dist/models/Lock.d.ts +84 -57
- package/dist/models/Lock.js +87 -82
- package/dist/models/Lock.js.map +1 -1
- package/dist/models/Migration.d.ts +6 -9
- package/dist/models/Migration.js +3 -4
- package/dist/models/Migration.js.map +1 -1
- package/dist/models/Sequence.d.ts +22 -18
- package/dist/models/Sequence.js +24 -7
- package/dist/models/Sequence.js.map +1 -1
- package/dist/models/User.d.ts +2347 -153
- package/dist/models/User.js +203 -173
- package/dist/models/User.js.map +1 -1
- package/dist/models/UserOld.d.ts +179 -0
- package/dist/models/UserOld.js +230 -0
- package/dist/models/UserOld.js.map +1 -0
- package/dist/modules/AbstractModel.d.ts +1 -1
- package/dist/modules/AbstractModel.js +1 -31
- package/dist/modules/AbstractModel.js.map +1 -1
- package/dist/modules/BaseModel.d.ts +49 -0
- package/dist/modules/BaseModel.js +31 -0
- package/dist/modules/BaseModel.js.map +1 -0
- package/dist/server.d.ts +5 -3
- package/dist/server.js +44 -3
- package/dist/server.js.map +1 -1
- package/dist/tests/setupVitest.js +1 -1
- package/dist/tests/setupVitest.js.map +1 -1
- package/genTypes.d.ts +3 -2
- package/package.json +1 -1
package/dist/models/User.js
CHANGED
|
@@ -1,26 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
saltSecret;
|
|
8
|
-
constructor(app) {
|
|
9
|
-
super(app);
|
|
10
|
-
const authConfig = this.app.getConfig('auth');
|
|
11
|
-
this.hashRounds = authConfig.hashRounds;
|
|
12
|
-
this.saltSecret = authConfig.saltSecret;
|
|
13
|
-
}
|
|
14
|
-
initHooks() {
|
|
15
|
-
this.mongooseSchema.pre('save', async function userPreSaveHook() {
|
|
1
|
+
import { BaseModel } from "../modules/BaseModel.js";
|
|
2
|
+
import { scryptAsyncWithSaltAsString } from "../helpers/crypto.js";
|
|
3
|
+
import { appInstance } from "../helpers/appInstance.js";
|
|
4
|
+
class User extends BaseModel {
|
|
5
|
+
static initHooks(schema) {
|
|
6
|
+
schema.pre('save', async function userPreSaveHook() {
|
|
16
7
|
if (this.isModified('password')) {
|
|
17
|
-
|
|
18
|
-
this.password = await this.constructor.hashPassword(this.password);
|
|
8
|
+
this.password = await scryptAsyncWithSaltAsString(this.password);
|
|
19
9
|
}
|
|
20
10
|
});
|
|
21
11
|
}
|
|
22
|
-
|
|
23
|
-
get modelSchema() {
|
|
12
|
+
static get modelSchema() {
|
|
24
13
|
return {
|
|
25
14
|
avatar: {
|
|
26
15
|
type: String,
|
|
@@ -64,181 +53,222 @@ class User extends AbstractModel {
|
|
|
64
53
|
languages: [String],
|
|
65
54
|
};
|
|
66
55
|
}
|
|
67
|
-
static
|
|
68
|
-
const data = await this.findOne({ email: String(email) });
|
|
69
|
-
if (!data) {
|
|
70
|
-
return false;
|
|
71
|
-
}
|
|
72
|
-
const hashedPasswords = await this.hashPassword(password);
|
|
73
|
-
if (data.password !== hashedPasswords) {
|
|
74
|
-
return false;
|
|
75
|
-
}
|
|
76
|
-
return data;
|
|
77
|
-
}
|
|
78
|
-
async generateToken() {
|
|
79
|
-
const timestamp = new Date();
|
|
80
|
-
timestamp.setDate(timestamp.getDate() + 30);
|
|
81
|
-
const data = await scryptAsync(this.email + Date.now(),
|
|
82
|
-
// @ts-ignore
|
|
83
|
-
this.getSuper().saltSecret,
|
|
84
|
-
// @ts-ignore
|
|
85
|
-
this.getSuper().hashRounds);
|
|
86
|
-
const token = data.toString('base64url');
|
|
87
|
-
this.sessionTokens.push({ token, valid: timestamp });
|
|
88
|
-
await this.save();
|
|
89
|
-
return { token, valid: timestamp };
|
|
90
|
-
}
|
|
91
|
-
getPublic() {
|
|
56
|
+
static get modelStatics() {
|
|
92
57
|
return {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
58
|
+
/**
|
|
59
|
+
* Get user by email and password
|
|
60
|
+
* @param {string} email
|
|
61
|
+
* @param {string} password
|
|
62
|
+
* @returns {Promise<InstanceType<UserModelLite> | false>}
|
|
63
|
+
*/
|
|
64
|
+
getUserByEmailAndPassword: async function getUserByEmailAndPassword(email, password) {
|
|
65
|
+
const data = await this.findOne({ email: String(email) });
|
|
66
|
+
if (!data) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
const hashedPasswords = await scryptAsyncWithSaltAsString(password);
|
|
70
|
+
if (data.password !== hashedPasswords) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
return data;
|
|
74
|
+
},
|
|
75
|
+
/**
|
|
76
|
+
* Get user by token
|
|
77
|
+
* @param {string}
|
|
78
|
+
* @returns {Promise<InstanceType<UserModelLite> | false>}
|
|
79
|
+
*/
|
|
80
|
+
getUserByToken: async function getUserByToken(token) {
|
|
81
|
+
const data = await this.findOne({
|
|
82
|
+
'sessionTokens.token': String(token),
|
|
83
|
+
});
|
|
84
|
+
return data || false;
|
|
85
|
+
},
|
|
86
|
+
/**
|
|
87
|
+
* Get user by email
|
|
88
|
+
* @param {string}
|
|
89
|
+
* @returns {Promise<InstanceType<UserModelLite> | false>}
|
|
90
|
+
*/
|
|
91
|
+
getUserByEmail: async function getUserByEmail(email) {
|
|
92
|
+
const data = await this.findOne({ email: String(email) });
|
|
93
|
+
if (!data) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
return data;
|
|
97
|
+
},
|
|
98
|
+
/**
|
|
99
|
+
* Get user by password recovery token
|
|
100
|
+
* @param {string} passwordRecoveryToken
|
|
101
|
+
* @returns {Promise<InstanceType<UserModelLite> | false>}
|
|
102
|
+
*/
|
|
103
|
+
getUserByPasswordRecoveryToken: async function getUserByPasswordRecoveryToken(passwordRecoveryToken) {
|
|
104
|
+
const data = await this.findOne({
|
|
105
|
+
passwordRecoveryTokens: {
|
|
106
|
+
$elemMatch: { token: String(passwordRecoveryToken) },
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
if (!data) {
|
|
110
|
+
return Promise.reject(new Error('User not exists'));
|
|
111
|
+
}
|
|
112
|
+
// TODO token expiration and remove that token
|
|
113
|
+
data.passwordRecoveryTokens?.pop();
|
|
114
|
+
const result = await data.save();
|
|
115
|
+
return result;
|
|
116
|
+
},
|
|
117
|
+
/**
|
|
118
|
+
* Get user by verification token
|
|
119
|
+
* @param {string} verificationToken
|
|
120
|
+
* @returns {Promise<InstanceType<UserModelLite> | false>}
|
|
121
|
+
*/
|
|
122
|
+
getUserByVerificationToken: async function getUserByVerificationToken(verificationToken) {
|
|
123
|
+
const data = await this.findOne({
|
|
124
|
+
verificationTokens: {
|
|
125
|
+
$elemMatch: { token: String(verificationToken) },
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
if (!data) {
|
|
129
|
+
return Promise.reject(new Error('User not exists'));
|
|
130
|
+
}
|
|
131
|
+
// TODO token expiration and remove that token
|
|
132
|
+
data.verificationTokens?.pop();
|
|
133
|
+
const result = await data.save();
|
|
134
|
+
return result;
|
|
135
|
+
},
|
|
136
|
+
// TODO
|
|
137
|
+
removeVerificationToken: async function removeVerificationToken(verificationToken) {
|
|
138
|
+
this.updateOne({
|
|
139
|
+
verificationTokens: {
|
|
140
|
+
$elemMatch: { token: String(verificationToken) },
|
|
141
|
+
},
|
|
142
|
+
}, { $pop: { verificationTokens: 1 } });
|
|
143
|
+
},
|
|
100
144
|
};
|
|
101
145
|
}
|
|
102
|
-
static
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
146
|
+
static get modelMethods() {
|
|
147
|
+
return {
|
|
148
|
+
/**
|
|
149
|
+
* Generate token for user
|
|
150
|
+
* @returns {Object}
|
|
151
|
+
*/
|
|
152
|
+
generateToken: async function () {
|
|
153
|
+
const timestamp = new Date();
|
|
154
|
+
timestamp.setDate(timestamp.getDate() + 30);
|
|
155
|
+
const token = await scryptAsyncWithSaltAsString(this.email + Date.now());
|
|
156
|
+
this.sessionTokens?.push({ token, valid: timestamp });
|
|
157
|
+
await this.save();
|
|
158
|
+
return { token, valid: timestamp };
|
|
159
|
+
},
|
|
160
|
+
/**
|
|
161
|
+
* Send password recovery email
|
|
162
|
+
* @param {Object}
|
|
163
|
+
* @param {TFunction}
|
|
164
|
+
* @param {string} i18n.language
|
|
165
|
+
* @returns {Promise<boolean>}
|
|
166
|
+
*/
|
|
167
|
+
sendPasswordRecoveryEmail: async function (i18n) {
|
|
168
|
+
const passwordRecoveryToken = await userHelpers.generateUserPasswordRecoveryToken(this);
|
|
169
|
+
let Mailer;
|
|
170
|
+
// speed optimisation
|
|
171
|
+
try {
|
|
172
|
+
// @ts-ignore
|
|
173
|
+
// eslint-disable-next-line import-x/no-unresolved
|
|
174
|
+
Mailer = (await import('@adaptivestone/framework-module-email'))
|
|
175
|
+
.default;
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
const error = 'Mailer not found. Please install @adaptivestone/framework-module-email in order to use it';
|
|
179
|
+
appInstance.logger?.error(error);
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
const mail = new Mailer(appInstance, 'recovery', {
|
|
183
|
+
link: `${i18n.language}/auth/recovery?password_recovery_token=${passwordRecoveryToken.token}`,
|
|
184
|
+
editor: this.name?.nick,
|
|
185
|
+
}, i18n);
|
|
186
|
+
return mail.send(this.email);
|
|
187
|
+
},
|
|
188
|
+
/**
|
|
189
|
+
* Send verification email
|
|
190
|
+
* @param {Object}
|
|
191
|
+
* @param {TFunction} i18n.t
|
|
192
|
+
* @param {string} i18n.language
|
|
193
|
+
* @returns {Promise<boolean>}
|
|
194
|
+
*/
|
|
195
|
+
sendVerificationEmail: async function (i18n) {
|
|
196
|
+
const verificationToken = await userHelpers.generateUserVerificationToken(this);
|
|
197
|
+
// speed optimisation
|
|
198
|
+
let Mailer;
|
|
199
|
+
try {
|
|
200
|
+
// @ts-ignore
|
|
201
|
+
Mailer = (await import('@adaptivestone/framework-module-email'))
|
|
202
|
+
.default;
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
const error = 'Mailer not found. Please install @adaptivestone/framework-module-email in order to use it';
|
|
206
|
+
appInstance.logger?.error(error);
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
const mail = new Mailer(appInstance, 'verification', {
|
|
210
|
+
link: `${i18n.language}/auth/login?verification_token=${verificationToken.token}`,
|
|
211
|
+
editor: this.name?.nick,
|
|
212
|
+
}, i18n);
|
|
213
|
+
return mail.send(this.email);
|
|
214
|
+
} /**
|
|
215
|
+
* Get public user data
|
|
216
|
+
* @returns {Object}
|
|
217
|
+
*/,
|
|
218
|
+
getPublic() {
|
|
219
|
+
return {
|
|
220
|
+
avatar: this.avatar,
|
|
221
|
+
name: this.name,
|
|
222
|
+
email: this.email,
|
|
223
|
+
id: this.id,
|
|
224
|
+
isVerified: this.isVerified,
|
|
225
|
+
permissions: this.permissions,
|
|
226
|
+
locale: this.locale,
|
|
227
|
+
};
|
|
228
|
+
},
|
|
229
|
+
};
|
|
120
230
|
}
|
|
121
|
-
|
|
231
|
+
}
|
|
232
|
+
export const userHelpers = {
|
|
233
|
+
/**
|
|
234
|
+
* Generate user verification token
|
|
235
|
+
* @param {InstanceType<UserModelLite>} userMongoose
|
|
236
|
+
* @returns {Promise<{ token: string; until: number }>}
|
|
237
|
+
*/
|
|
238
|
+
generateUserVerificationToken: async function generateUserVerificationToken(userMongoose) {
|
|
122
239
|
const date = new Date();
|
|
123
240
|
date.setDate(date.getDate() + 14);
|
|
124
|
-
const
|
|
125
|
-
//
|
|
126
|
-
userMongoose.getSuper().saltSecret,
|
|
127
|
-
// @ts-ignore
|
|
128
|
-
userMongoose.getSuper().hashRounds);
|
|
129
|
-
const token = data.toString('base64url');
|
|
130
|
-
// if (err) {
|
|
241
|
+
const token = await scryptAsyncWithSaltAsString(userMongoose.email + Date.now());
|
|
242
|
+
// if (err) {
|
|
131
243
|
// this.logger.error("Hash 2 error ", err);
|
|
132
244
|
// reject(err);
|
|
133
245
|
// return;
|
|
134
246
|
// }
|
|
135
|
-
userMongoose.
|
|
136
|
-
userMongoose.
|
|
247
|
+
userMongoose.verificationTokens = [];
|
|
248
|
+
userMongoose.verificationTokens.push({
|
|
137
249
|
until: date,
|
|
138
250
|
token,
|
|
139
251
|
});
|
|
140
252
|
await userMongoose.save();
|
|
141
253
|
return { token, until: date.getTime() };
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
if (!data) {
|
|
150
|
-
return Promise.reject(new Error('User not exists'));
|
|
151
|
-
}
|
|
152
|
-
// TODO token expiration and remove that token
|
|
153
|
-
data.passwordRecoveryTokens.pop();
|
|
154
|
-
const result = await data.save();
|
|
155
|
-
return result;
|
|
156
|
-
}
|
|
157
|
-
async sendPasswordRecoveryEmail(i18n) {
|
|
158
|
-
const passwordRecoveryToken = await User.generateUserPasswordRecoveryToken(this);
|
|
159
|
-
let Mailer;
|
|
160
|
-
// speed optimisation
|
|
161
|
-
try {
|
|
162
|
-
// @ts-ignore
|
|
163
|
-
// eslint-disable-next-line import-x/no-unresolved
|
|
164
|
-
Mailer = (await import('@adaptivestone/framework-module-email')).default;
|
|
165
|
-
}
|
|
166
|
-
catch {
|
|
167
|
-
const error = 'Mailer not found. Please install @adaptivestone/framework-module-email in order to use it';
|
|
168
|
-
this.getSuper().logger?.error(error);
|
|
169
|
-
return false;
|
|
170
|
-
}
|
|
171
|
-
const mail = new Mailer(this.getSuper().app, 'recovery', {
|
|
172
|
-
link: `${i18n.language}/auth/recovery?password_recovery_token=${passwordRecoveryToken.token}`,
|
|
173
|
-
editor: this.name.nick,
|
|
174
|
-
}, i18n);
|
|
175
|
-
return mail.send(this.email);
|
|
176
|
-
}
|
|
177
|
-
static async generateUserVerificationToken(userMongoose) {
|
|
254
|
+
},
|
|
255
|
+
/**
|
|
256
|
+
* Get user by id
|
|
257
|
+
* @param {string}
|
|
258
|
+
* @returns {Promise<InstanceType<UserModelLite> | false>}
|
|
259
|
+
*/
|
|
260
|
+
generateUserPasswordRecoveryToken: async function generateUserPasswordRecoveryToken(userMongoose) {
|
|
178
261
|
const date = new Date();
|
|
179
262
|
date.setDate(date.getDate() + 14);
|
|
180
|
-
const
|
|
181
|
-
|
|
182
|
-
userMongoose.
|
|
183
|
-
// @ts-ignore
|
|
184
|
-
userMongoose.getSuper().hashRounds);
|
|
185
|
-
const token = data.toString('base64url');
|
|
186
|
-
// if (err) {
|
|
187
|
-
// this.logger.error("Hash 2 error ", err);
|
|
188
|
-
// reject(err);
|
|
189
|
-
// return;
|
|
190
|
-
// }
|
|
191
|
-
userMongoose.verificationTokens = [];
|
|
192
|
-
userMongoose.verificationTokens.push({
|
|
263
|
+
const token = await scryptAsyncWithSaltAsString(userMongoose.email + Date.now());
|
|
264
|
+
userMongoose.passwordRecoveryTokens = [];
|
|
265
|
+
userMongoose.passwordRecoveryTokens.push({
|
|
193
266
|
until: date,
|
|
194
267
|
token,
|
|
195
268
|
});
|
|
196
269
|
await userMongoose.save();
|
|
197
270
|
return { token, until: date.getTime() };
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
const data = await this.findOne({
|
|
201
|
-
verificationTokens: {
|
|
202
|
-
$elemMatch: { token: String(verificationToken) },
|
|
203
|
-
},
|
|
204
|
-
});
|
|
205
|
-
if (!data) {
|
|
206
|
-
return Promise.reject(new Error('User not exists'));
|
|
207
|
-
}
|
|
208
|
-
// TODO token expiration and remove that token
|
|
209
|
-
data.verificationTokens.pop();
|
|
210
|
-
const result = await data.save();
|
|
211
|
-
return result;
|
|
212
|
-
}
|
|
213
|
-
// async removeVerificationToken(verificationToken) {
|
|
214
|
-
// this.mongooseModel.updateOne(
|
|
215
|
-
// {
|
|
216
|
-
// verificationTokens: {
|
|
217
|
-
// $elemMatch: { token: String(verificationToken) },
|
|
218
|
-
// },
|
|
219
|
-
// },
|
|
220
|
-
// { $pop: { verificationTokens: 1 } },
|
|
221
|
-
// );
|
|
222
|
-
// }
|
|
223
|
-
async sendVerificationEmail(i18n) {
|
|
224
|
-
const verificationToken = await User.generateUserVerificationToken(this);
|
|
225
|
-
// speed optimisation
|
|
226
|
-
let Mailer;
|
|
227
|
-
try {
|
|
228
|
-
// @ts-ignore
|
|
229
|
-
Mailer = (await import('@adaptivestone/framework-module-email')).default;
|
|
230
|
-
}
|
|
231
|
-
catch {
|
|
232
|
-
const error = 'Mailer not found. Please install @adaptivestone/framework-module-email in order to use it';
|
|
233
|
-
this.getSuper().logger?.error(error);
|
|
234
|
-
return false;
|
|
235
|
-
}
|
|
236
|
-
const mail = new Mailer(this.getSuper().app, 'verification', {
|
|
237
|
-
link: `${i18n.language}/auth/login?verification_token=${verificationToken.token}`,
|
|
238
|
-
editor: this.name.nick,
|
|
239
|
-
}, i18n);
|
|
240
|
-
return mail.send(this.email);
|
|
241
|
-
}
|
|
242
|
-
}
|
|
271
|
+
},
|
|
272
|
+
};
|
|
243
273
|
export default User;
|
|
244
274
|
//# sourceMappingURL=User.js.map
|
package/dist/models/User.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"User.js","sourceRoot":"","sources":["../../src/models/User.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"User.js","sourceRoot":"","sources":["../../src/models/User.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import AbstractModel from '../modules/AbstractModel.ts';
|
|
2
|
+
import type { IApp } from '../server.ts';
|
|
3
|
+
import type { TFunction } from 'i18next';
|
|
4
|
+
import type { IAbstractModel, IAbstractModelMethods } from '../modules/AbstractModel.ts';
|
|
5
|
+
interface IUser {
|
|
6
|
+
avatar: string;
|
|
7
|
+
name: {
|
|
8
|
+
first: string;
|
|
9
|
+
last: string;
|
|
10
|
+
nick: string;
|
|
11
|
+
};
|
|
12
|
+
password: string;
|
|
13
|
+
email: string;
|
|
14
|
+
sessionTokens: {
|
|
15
|
+
token: string;
|
|
16
|
+
valid: Date;
|
|
17
|
+
}[];
|
|
18
|
+
verificationTokens: {
|
|
19
|
+
until: Date;
|
|
20
|
+
token: string;
|
|
21
|
+
}[];
|
|
22
|
+
passwordRecoveryTokens: {
|
|
23
|
+
until: Date;
|
|
24
|
+
token: string;
|
|
25
|
+
}[];
|
|
26
|
+
permissions: string[];
|
|
27
|
+
roles: string[];
|
|
28
|
+
isVerified: boolean;
|
|
29
|
+
locale: string;
|
|
30
|
+
languages: string[];
|
|
31
|
+
}
|
|
32
|
+
interface IStatic extends IAbstractModel<IUser, IAbstractModelMethods<IUser>> {
|
|
33
|
+
getUserByEmailAndPassword(email: string, password: string): Promise<InstanceType<UserOld['mongooseModel']> | false>;
|
|
34
|
+
hashPassword(password: string): Promise<string>;
|
|
35
|
+
getUserByToken(token: string): Promise<InstanceType<UserOld['mongooseModel']> | false>;
|
|
36
|
+
getUserByEmail(email: string): Promise<InstanceType<UserOld['mongooseModel']> | false>;
|
|
37
|
+
getUserByPasswordRecoveryToken(token: string): Promise<InstanceType<UserOld['mongooseModel']> | false>;
|
|
38
|
+
generateUserPasswordRecoveryToken(user: InstanceType<UserOld['mongooseModel']>): Promise<{
|
|
39
|
+
token: string;
|
|
40
|
+
until: Date;
|
|
41
|
+
}>;
|
|
42
|
+
getUserByVerificationToken(token: string): Promise<InstanceType<UserOld['mongooseModel']> | false>;
|
|
43
|
+
generateUserVerificationToken(user: InstanceType<UserOld['mongooseModel']>): Promise<{
|
|
44
|
+
token: string;
|
|
45
|
+
until: Date;
|
|
46
|
+
}>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* @deprecated use User Model instead of UserOld
|
|
50
|
+
*/
|
|
51
|
+
declare class UserOld extends AbstractModel<IUser, IAbstractModelMethods<IUser>, IStatic> {
|
|
52
|
+
constructor(app: IApp);
|
|
53
|
+
initHooks(): void;
|
|
54
|
+
get modelSchema(): {
|
|
55
|
+
avatar: {
|
|
56
|
+
type: StringConstructor;
|
|
57
|
+
maxlength: number;
|
|
58
|
+
};
|
|
59
|
+
name: {
|
|
60
|
+
first: {
|
|
61
|
+
type: StringConstructor;
|
|
62
|
+
maxlength: number;
|
|
63
|
+
};
|
|
64
|
+
last: {
|
|
65
|
+
type: StringConstructor;
|
|
66
|
+
maxlength: number;
|
|
67
|
+
};
|
|
68
|
+
nick: {
|
|
69
|
+
minlength: number;
|
|
70
|
+
maxlength: number;
|
|
71
|
+
type: StringConstructor;
|
|
72
|
+
index: {
|
|
73
|
+
unique: boolean;
|
|
74
|
+
partialFilterExpression: {
|
|
75
|
+
'name.nick': {
|
|
76
|
+
$type: string;
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
password: StringConstructor;
|
|
83
|
+
email: {
|
|
84
|
+
type: StringConstructor;
|
|
85
|
+
maxlength: number;
|
|
86
|
+
index: {
|
|
87
|
+
unique: boolean;
|
|
88
|
+
partialFilterExpression: {
|
|
89
|
+
email: {
|
|
90
|
+
$type: string;
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
sessionTokens: {
|
|
96
|
+
token: StringConstructor;
|
|
97
|
+
valid: DateConstructor;
|
|
98
|
+
}[];
|
|
99
|
+
verificationTokens: {
|
|
100
|
+
until: DateConstructor;
|
|
101
|
+
token: StringConstructor;
|
|
102
|
+
}[];
|
|
103
|
+
passwordRecoveryTokens: {
|
|
104
|
+
until: DateConstructor;
|
|
105
|
+
token: StringConstructor;
|
|
106
|
+
}[];
|
|
107
|
+
permissions: never[];
|
|
108
|
+
roles: never[];
|
|
109
|
+
isVerified: {
|
|
110
|
+
type: BooleanConstructor;
|
|
111
|
+
default: boolean;
|
|
112
|
+
};
|
|
113
|
+
locale: {
|
|
114
|
+
type: StringConstructor;
|
|
115
|
+
default: string;
|
|
116
|
+
};
|
|
117
|
+
languages: StringConstructor[];
|
|
118
|
+
};
|
|
119
|
+
static getUserByEmailAndPassword(this: UserOld['mongooseModel'], email: string, password: string): Promise<false | (import("mongoose").Document<unknown, {}, IUser, {}> & Omit<IUser & {
|
|
120
|
+
_id: import("mongoose").Types.ObjectId;
|
|
121
|
+
} & {
|
|
122
|
+
__v: number;
|
|
123
|
+
}, "getSuper"> & IAbstractModelMethods<IUser>)>;
|
|
124
|
+
generateToken(this: InstanceType<UserOld['mongooseModel']>): Promise<{
|
|
125
|
+
token: string;
|
|
126
|
+
valid: Date;
|
|
127
|
+
}>;
|
|
128
|
+
getPublic(this: InstanceType<UserOld['mongooseModel']>): {
|
|
129
|
+
avatar: string;
|
|
130
|
+
name: {
|
|
131
|
+
first: string;
|
|
132
|
+
last: string;
|
|
133
|
+
nick: string;
|
|
134
|
+
};
|
|
135
|
+
email: string;
|
|
136
|
+
id: any;
|
|
137
|
+
isVerified: boolean;
|
|
138
|
+
permissions: string[];
|
|
139
|
+
locale: string;
|
|
140
|
+
};
|
|
141
|
+
static hashPassword(this: UserOld['mongooseModel'], password: string): Promise<string>;
|
|
142
|
+
static getUserByToken(this: UserOld['mongooseModel'], token: string): Promise<false | (import("mongoose").Document<unknown, {}, IUser, {}> & Omit<IUser & {
|
|
143
|
+
_id: import("mongoose").Types.ObjectId;
|
|
144
|
+
} & {
|
|
145
|
+
__v: number;
|
|
146
|
+
}, "getSuper"> & IAbstractModelMethods<IUser>)>;
|
|
147
|
+
static getUserByEmail(this: UserOld['mongooseModel'], email: string): Promise<false | (import("mongoose").Document<unknown, {}, IUser, {}> & Omit<IUser & {
|
|
148
|
+
_id: import("mongoose").Types.ObjectId;
|
|
149
|
+
} & {
|
|
150
|
+
__v: number;
|
|
151
|
+
}, "getSuper"> & IAbstractModelMethods<IUser>)>;
|
|
152
|
+
static generateUserPasswordRecoveryToken(userMongoose: InstanceType<UserOld['mongooseModel']>): Promise<{
|
|
153
|
+
token: string;
|
|
154
|
+
until: number;
|
|
155
|
+
}>;
|
|
156
|
+
static getUserByPasswordRecoveryToken(this: UserOld['mongooseModel'], passwordRecoveryToken: string): Promise<import("mongoose").Document<unknown, {}, IUser, {}> & Omit<IUser & {
|
|
157
|
+
_id: import("mongoose").Types.ObjectId;
|
|
158
|
+
} & {
|
|
159
|
+
__v: number;
|
|
160
|
+
}, "getSuper"> & IAbstractModelMethods<IUser>>;
|
|
161
|
+
sendPasswordRecoveryEmail(this: InstanceType<UserOld['mongooseModel']>, i18n: {
|
|
162
|
+
t: TFunction;
|
|
163
|
+
language: string;
|
|
164
|
+
}): Promise<any>;
|
|
165
|
+
static generateUserVerificationToken(userMongoose: InstanceType<UserOld['mongooseModel']>): Promise<{
|
|
166
|
+
token: string;
|
|
167
|
+
until: number;
|
|
168
|
+
}>;
|
|
169
|
+
static getUserByVerificationToken(this: UserOld['mongooseModel'], verificationToken: string): Promise<import("mongoose").Document<unknown, {}, IUser, {}> & Omit<IUser & {
|
|
170
|
+
_id: import("mongoose").Types.ObjectId;
|
|
171
|
+
} & {
|
|
172
|
+
__v: number;
|
|
173
|
+
}, "getSuper"> & IAbstractModelMethods<IUser>>;
|
|
174
|
+
sendVerificationEmail(this: InstanceType<UserOld['mongooseModel']>, i18n: {
|
|
175
|
+
t: TFunction;
|
|
176
|
+
language: string;
|
|
177
|
+
}): Promise<any>;
|
|
178
|
+
}
|
|
179
|
+
export default UserOld;
|