user.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. const bcrypt = require('bcryptjs');
  2. const nanoid = require('nanoid');
  3. const uuid = require('uuid/v4');
  4. const subMinutes = require('date-fns/sub_minutes');
  5. const addMinutes = require('date-fns/add_minutes');
  6. const User = require('../models/user');
  7. const Ip = require('../models/ip');
  8. exports.getUser = async (emailOrKey = '') => {
  9. const user = await User.findOne({
  10. $or: [{ email: emailOrKey }, { apikey: emailOrKey }],
  11. }).lean();
  12. // TODO: Get domains
  13. // const session = driver.session();
  14. // const { records = [] } = await session.readTransaction(tx =>
  15. // tx.run(
  16. // 'MATCH (u:USER) WHERE u.email = $email OR u.apikey = $apikey ' +
  17. // 'OPTIONAL MATCH (u)-[r:RECEIVED]->(c) WITH u, collect(c.date) as cooldowns ' +
  18. // 'OPTIONAL MATCH (u)-[:OWNS]->(d) RETURN u, d, cooldowns',
  19. // {
  20. // apikey,
  21. // email,
  22. // }
  23. // )
  24. // );
  25. // session.close();
  26. // const user = records.length && records[0].get('u').properties;
  27. // const cooldowns = records.length && records[0].get('cooldowns');
  28. // const domainProps = records.length && records[0].get('d');
  29. // const domain = domainProps ? domainProps.properties.name : '';
  30. // const homepage = domainProps ? domainProps.properties.homepage : '';
  31. // const useHttps = domainProps ? domainProps.properties.useHttps : '';
  32. // return user && { ...user, cooldowns, domain, homepage, useHttps };
  33. return user;
  34. };
  35. exports.createUser = async (email, password) => {
  36. const salt = await bcrypt.genSalt(12);
  37. const hashedPassword = await bcrypt.hash(password, salt);
  38. const user = await User.findOneAndUpdate(
  39. { email },
  40. {
  41. email,
  42. password: hashedPassword,
  43. verificationToken: uuid(),
  44. verificationExpires: addMinutes(new Date(), 60),
  45. },
  46. { new: true, upsert: true, runValidators: true, setDefaultsOnInsert: true }
  47. );
  48. return user;
  49. };
  50. exports.verifyUser = async verificationToken => {
  51. const user = await User.findOneAndUpdate(
  52. { verificationToken, verificationExpires: { $gt: new Date() } },
  53. {
  54. verified: true,
  55. verificationToken: undefined,
  56. verificationExpires: undefined,
  57. },
  58. { new: true }
  59. );
  60. return user;
  61. };
  62. exports.changePassword = async (id, newPassword) => {
  63. const salt = await bcrypt.genSalt(12);
  64. const password = await bcrypt.hash(newPassword, salt);
  65. const user = await User.findByIdAndUpdate(id, { password }, { new: true });
  66. return user;
  67. };
  68. exports.generateApiKey = async id => {
  69. const apikey = nanoid(40);
  70. const user = await User.findByIdAndUpdate(id, { apikey }, { new: true });
  71. return user;
  72. };
  73. exports.requestPasswordReset = async email => {
  74. const resetPasswordToken = uuid();
  75. const user = await User.findOneAndUpdate(
  76. { email },
  77. {
  78. resetPasswordToken,
  79. resetPasswordExpires: addMinutes(new Date(), 30),
  80. },
  81. { new: true }
  82. );
  83. return user;
  84. };
  85. exports.resetPassword = async resetPasswordToken => {
  86. const user = await User.findOneAndUpdate(
  87. { resetPasswordToken, resetPasswordExpires: { $gt: new Date() } },
  88. { resetPasswordExpires: undefined, resetPasswordToken: undefined },
  89. { new: true }
  90. );
  91. return user;
  92. };
  93. exports.addCooldown = async id => {
  94. const user = await User.findByIdAndUpdate(
  95. id,
  96. { $push: { cooldowns: new Date() } },
  97. { new: true }
  98. );
  99. return user;
  100. };
  101. exports.banUser = async id => {
  102. const user = await User.findByIdAndUpdate(
  103. id,
  104. {
  105. banned: true,
  106. },
  107. { new: true }
  108. );
  109. return user;
  110. };
  111. exports.addIp = async newIp => {
  112. const ip = await Ip.findOneAndUpdate(
  113. { ip: newIp },
  114. { ip: newIp, createdAt: new Date() },
  115. { new: true, upsert: true, runValidators: true }
  116. );
  117. return ip;
  118. };
  119. exports.getIp = async ip => {
  120. const matchedIp = await Ip.findOne({
  121. ip,
  122. createdAt: { $gt: subMinutes(new Date(), Number(process.env.NON_USER_COOLDOWN)) },
  123. });
  124. return matchedIp;
  125. };
  126. exports.clearIps = async () =>
  127. Ip.deleteMany({
  128. createdAt: { $lt: subMinutes(new Date(), Number(process.env.NON_USER_COOLDOWN)) },
  129. });