user.queries.js 2.1 KB

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