user.queries.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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, increments = []) {
  43. const query = knex("users");
  44. Object.entries(match).forEach(([key, value]) => {
  45. query.andWhere(key, ...(Array.isArray(value) ? value : [value]));
  46. });
  47. let updateQuery = query;
  48. increments.forEach(columnName => {
  49. updateQuery.increment(columnName);
  50. });
  51. await updateQuery.update(
  52. { ...update, updated_at: new Date().toISOString() },
  53. "*"
  54. );
  55. const users = await query.all();
  56. users.forEach(redis.remove.user);
  57. return users;
  58. }
  59. async function remove(user) {
  60. const deletedUser = await knex("users").where("id", user.id).delete();
  61. redis.remove.user(user);
  62. return !!deletedUser;
  63. }
  64. module.exports = {
  65. add,
  66. find,
  67. remove,
  68. update,
  69. }