user.queries.js 2.2 KB

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