user.queries.js 1.8 KB

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