password-reset-order.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. const mongoose = require('mongoose');
  2. const uniqueValidator = require('mongoose-unique-validator');
  3. const crypto = require('crypto');
  4. const ObjectId = mongoose.Schema.Types.ObjectId;
  5. const schema = new mongoose.Schema({
  6. token: { type: String, required: true, unique: true },
  7. email: { type: String, required: true },
  8. relatedUser: { type: ObjectId, ref: 'User' },
  9. createdAt: { type: Date, default: Date.now, required: true },
  10. expiredAt: { type: Date, default: Date.now() + 600000, required: true },
  11. });
  12. schema.plugin(uniqueValidator);
  13. class PasswordResetOrder {
  14. static generateOneTimeToken() {
  15. const buf = crypto.randomBytes(256);
  16. const token = buf.toString('hex');
  17. return token;
  18. }
  19. static async createPasswordResetOrder(email) {
  20. let token;
  21. let duplicateToken;
  22. do {
  23. token = this.generateOneTimeToken();
  24. // eslint-disable-next-line no-await-in-loop
  25. duplicateToken = await this.findOne({ token });
  26. } while (duplicateToken != null);
  27. const passwordResetOrderData = await this.create({ token, email });
  28. return passwordResetOrderData;
  29. }
  30. isExpired() {
  31. return this.expiredAt.getTime() < Date.now();
  32. }
  33. }
  34. module.exports = function(crowi) {
  35. PasswordResetOrder.crowi = crowi;
  36. schema.loadClass(PasswordResetOrder);
  37. const model = mongoose.model('PasswordResetOrder', schema);
  38. return model;
  39. };