password-reset-order.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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('base64');
  17. return token;
  18. }
  19. static async generateUniqueOneTimeToken(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. // this.token = token;
  28. const data = await this.create({ token, email });
  29. console.log('dataHoge', this);
  30. return data;
  31. }
  32. isExpired() {
  33. return this.expiredAt.getTime() < Date.now();
  34. }
  35. }
  36. module.exports = function(crowi) {
  37. PasswordResetOrder.crowi = crowi;
  38. schema.loadClass(PasswordResetOrder);
  39. const model = mongoose.model('PasswordResetOrder', schema);
  40. return model;
  41. };