user.queries.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. const { addMinutes } = require("date-fns");
  2. const { v4: uuid } = require("uuid");
  3. const utils = require("../utils");
  4. const redis = require("../redis");
  5. const knex = require("../knex");
  6. const env = require("../env");
  7. async function find(match) {
  8. if ((match.email || match.apikey) && env.REDIS_ENABLED) {
  9. const key = redis.key.user(match.email || match.apikey);
  10. const cachedUser = await redis.client.get(key);
  11. if (cachedUser) return JSON.parse(cachedUser);
  12. }
  13. const query = knex("users");
  14. Object.entries(match).forEach(([key, value]) => {
  15. query.andWhere(key, ...(Array.isArray(value) ? value : [value]));
  16. });
  17. const user = await query.first();
  18. if (user && env.REDIS_ENABLED) {
  19. const emailKey = redis.key.user(user.email);
  20. redis.client.set(emailKey, JSON.stringify(user), "EX", 60 * 15);
  21. if (user.apikey) {
  22. const apikeyKey = redis.key.user(user.apikey);
  23. redis.client.set(apikeyKey, JSON.stringify(user), "EX", 60 * 15);
  24. }
  25. }
  26. return user;
  27. }
  28. async function add(params, user) {
  29. const data = {
  30. email: params.email,
  31. password: params.password,
  32. verification_token: uuid(),
  33. verification_expires: utils.dateToUTC(addMinutes(new Date(), 60))
  34. };
  35. if (user) {
  36. await knex("users")
  37. .where("id", user.id)
  38. .update({ ...data, updated_at: utils.dateToUTC(new Date()) });
  39. } else {
  40. await knex("users").insert(data);
  41. }
  42. if (env.REDIS_ENABLED) {
  43. redis.remove.user(user);
  44. }
  45. return {
  46. ...user,
  47. ...data
  48. };
  49. }
  50. async function update(match, update, methods) {
  51. const query = knex("users");
  52. Object.entries(match).forEach(([key, value]) => {
  53. query.andWhere(key, ...(Array.isArray(value) ? value : [value]));
  54. });
  55. const updateQuery = query.clone();
  56. if (methods?.increments) {
  57. methods.increments.forEach(columnName => {
  58. updateQuery.increment(columnName);
  59. });
  60. }
  61. await updateQuery.update({ ...update, updated_at: utils.dateToUTC(new Date()) });
  62. const users = await query.select("*");
  63. if (env.REDIS_ENABLED) {
  64. users.forEach(redis.remove.user);
  65. }
  66. return users;
  67. }
  68. async function remove(user) {
  69. const deletedUser = await knex("users").where("id", user.id).delete();
  70. if (env.REDIS_ENABLED) {
  71. redis.remove.user(user);
  72. }
  73. return !!deletedUser;
  74. }
  75. module.exports = {
  76. add,
  77. find,
  78. remove,
  79. update,
  80. }