|
@@ -1,10 +1,34 @@
|
|
|
-const mongoose = require('mongoose');
|
|
|
|
|
-const uniqueValidator = require('mongoose-unique-validator');
|
|
|
|
|
-const crypto = require('crypto');
|
|
|
|
|
|
|
+import mongoose, {
|
|
|
|
|
+ Schema, Model, Document,
|
|
|
|
|
+} from 'mongoose';
|
|
|
|
|
+
|
|
|
|
|
+import uniqueValidator from 'mongoose-unique-validator';
|
|
|
|
|
+import crypto from 'crypto';
|
|
|
|
|
+import { getOrCreateModel } from '../util/mongoose-utils';
|
|
|
|
|
|
|
|
const ObjectId = mongoose.Schema.Types.ObjectId;
|
|
const ObjectId = mongoose.Schema.Types.ObjectId;
|
|
|
|
|
|
|
|
-const schema = new mongoose.Schema({
|
|
|
|
|
|
|
+export interface IPasswordResetOrder {
|
|
|
|
|
+ token: string,
|
|
|
|
|
+ email: string,
|
|
|
|
|
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
|
|
|
+ relatedUser: any,
|
|
|
|
|
+ isRevoked: boolean,
|
|
|
|
|
+ createdAt: Date,
|
|
|
|
|
+ expiredAt: Date,
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+export interface PasswordResetOrderDocument extends IPasswordResetOrder, Document {
|
|
|
|
|
+ isExpired(): Promise<boolean>
|
|
|
|
|
+ revokeOneTimeToken(): Promise<void>
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+export interface PasswordResetOrderModel extends Model<PasswordResetOrderDocument> {
|
|
|
|
|
+ generateOneTimeToken(): string
|
|
|
|
|
+ createPasswordResetOrder(email: string): PasswordResetOrderDocument
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+const schema = new Schema<PasswordResetOrderDocument, PasswordResetOrderModel>({
|
|
|
token: { type: String, required: true, unique: true },
|
|
token: { type: String, required: true, unique: true },
|
|
|
email: { type: String, required: true },
|
|
email: { type: String, required: true },
|
|
|
relatedUser: { type: ObjectId, ref: 'User' },
|
|
relatedUser: { type: ObjectId, ref: 'User' },
|
|
@@ -14,44 +38,35 @@ const schema = new mongoose.Schema({
|
|
|
});
|
|
});
|
|
|
schema.plugin(uniqueValidator);
|
|
schema.plugin(uniqueValidator);
|
|
|
|
|
|
|
|
-class PasswordResetOrder {
|
|
|
|
|
-
|
|
|
|
|
- static generateOneTimeToken() {
|
|
|
|
|
- const buf = crypto.randomBytes(256);
|
|
|
|
|
- const token = buf.toString('hex');
|
|
|
|
|
|
|
+schema.statics.generateOneTimeToken = function() {
|
|
|
|
|
+ const buf = crypto.randomBytes(256);
|
|
|
|
|
+ const token = buf.toString('hex');
|
|
|
|
|
|
|
|
- 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);
|
|
|
|
|
|
|
+ return token;
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
- const passwordResetOrderData = await this.create({ token, email });
|
|
|
|
|
|
|
+schema.statics.createPasswordResetOrder = async function(email) {
|
|
|
|
|
+ let token;
|
|
|
|
|
+ let duplicateToken;
|
|
|
|
|
|
|
|
- return passwordResetOrderData;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ do {
|
|
|
|
|
+ token = this.generateOneTimeToken();
|
|
|
|
|
+ // eslint-disable-next-line no-await-in-loop
|
|
|
|
|
+ duplicateToken = await this.findOne({ token });
|
|
|
|
|
+ } while (duplicateToken != null);
|
|
|
|
|
|
|
|
- isExpired() {
|
|
|
|
|
- return this.expiredAt.getTime() < Date.now();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ const passwordResetOrderData = await this.create({ token, email });
|
|
|
|
|
|
|
|
- async revokeOneTimeToken() {
|
|
|
|
|
- this.isRevoked = true;
|
|
|
|
|
- return this.save();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ return passwordResetOrderData;
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
-}
|
|
|
|
|
|
|
+schema.methods.isExpired = function() {
|
|
|
|
|
+ return this.expiredAt.getTime() < Date.now();
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
-module.exports = function(crowi) {
|
|
|
|
|
- PasswordResetOrder.crowi = crowi;
|
|
|
|
|
- schema.loadClass(PasswordResetOrder);
|
|
|
|
|
- const model = mongoose.model('PasswordResetOrder', schema);
|
|
|
|
|
- return model;
|
|
|
|
|
|
|
+schema.methods.revokeOneTimeToken = async function() {
|
|
|
|
|
+ this.isRevoked = true;
|
|
|
|
|
+ return this.save();
|
|
|
};
|
|
};
|
|
|
|
|
+
|
|
|
|
|
+export default getOrCreateModel<PasswordResetOrderDocument, PasswordResetOrderModel>('PasswordResetOrder', schema);
|