|
|
@@ -1,5 +1,6 @@
|
|
|
const mongoose = require('mongoose');
|
|
|
const uniqueValidator = require('mongoose-unique-validator');
|
|
|
+const crypto = require('crypto');
|
|
|
|
|
|
const ObjectId = mongoose.Schema.Types.ObjectId;
|
|
|
|
|
|
@@ -8,18 +9,36 @@ const schema = new mongoose.Schema({
|
|
|
email: { type: String, required: true },
|
|
|
relatedUser: { type: ObjectId, ref: 'User' },
|
|
|
createdAt: { type: Date, default: Date.now, required: true },
|
|
|
- expiredAt: { type: Date, default: Date.now + 600000, required: true },
|
|
|
+ expiredAt: { type: Date, default: Date.now() + 600000, required: true },
|
|
|
});
|
|
|
schema.plugin(uniqueValidator);
|
|
|
|
|
|
class PasswordResetOrder {
|
|
|
|
|
|
static generateOneTimeToken() {
|
|
|
- // TODO: generate unique token by GW-6802
|
|
|
+ const buf = crypto.randomBytes(256);
|
|
|
+ const token = buf.toString('base64');
|
|
|
+
|
|
|
+ return token;
|
|
|
+ }
|
|
|
+
|
|
|
+ static async createPasswordResetOrder(email) {
|
|
|
+ let token;
|
|
|
+ let duplicateToken;
|
|
|
+
|
|
|
+ do {
|
|
|
+ token = this.generateOneTimeToken();
|
|
|
+ // eslint-disable-next-line no-await-in-loop
|
|
|
+ duplicateToken = await this.findOne({ token });
|
|
|
+ } while (duplicateToken != null);
|
|
|
+
|
|
|
+ const passwordResetOrderData = await this.create({ token, email });
|
|
|
+
|
|
|
+ return passwordResetOrderData;
|
|
|
}
|
|
|
|
|
|
- static isExpired() {
|
|
|
- return this.expiredAt.getTime() < new Date().getTime();
|
|
|
+ isExpired() {
|
|
|
+ return this.expiredAt.getTime() < Date.now();
|
|
|
}
|
|
|
|
|
|
}
|