user.ts 1.7 KB

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