domain.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import knex from "../knex";
  2. import * as redis from "../redis";
  3. import { getRedisKey } from "../utils";
  4. export const getDomain = async (data: Partial<Domain>): Promise<Domain> => {
  5. const getData = {
  6. ...data,
  7. ...(data.address && { address: data.address.toLowerCase() }),
  8. ...(data.homepage && { homepage: data.homepage.toLowerCase() })
  9. };
  10. const redisKey = getRedisKey.domain(getData.address);
  11. const cachedDomain = await redis.get(redisKey);
  12. if (cachedDomain) return JSON.parse(cachedDomain);
  13. const domain = await knex<Domain>("domains")
  14. .where(getData)
  15. .first();
  16. if (domain) {
  17. redis.set(redisKey, JSON.stringify(domain), "EX", 60 * 60 * 6);
  18. }
  19. return domain;
  20. };
  21. export const setDomain = async (
  22. data: Partial<Domain>,
  23. user: UserJoined,
  24. matchedDomain: Domain
  25. ) => {
  26. // 1. If user has domain, remove it from their possession
  27. await knex<Domain>("domains")
  28. .where({ user_id: user.id })
  29. .update({ user_id: null });
  30. // 2. Create or update the domain with user's ID
  31. let domain;
  32. const updateDate: Partial<Domain> = {
  33. address: data.address.toLowerCase(),
  34. homepage: data.homepage && data.homepage.toLowerCase(),
  35. user_id: user.id,
  36. updated_at: new Date().toISOString()
  37. };
  38. if (matchedDomain) {
  39. const [response]: Domain[] = await knex<Domain>("domains")
  40. .where("id", matchedDomain.id)
  41. .update(updateDate, "*");
  42. domain = response;
  43. } else {
  44. const [response]: Domain[] = await knex<Domain>("domains").insert(
  45. updateDate,
  46. "*"
  47. );
  48. domain = response;
  49. }
  50. redis.del(getRedisKey.user(user.email));
  51. redis.del(getRedisKey.user(user.apikey));
  52. redis.del(getRedisKey.domain(updateDate.address));
  53. return domain;
  54. };
  55. export const deleteDomain = async (user: UserJoined) => {
  56. // Remove user from domain, do not actually delete the domain
  57. const [domain]: Domain[] = await knex<Domain>("domains")
  58. .where({ user_id: user.id })
  59. .update({ user_id: null, updated_at: new Date().toISOString() }, "*");
  60. if (domain) {
  61. redis.del(getRedisKey.domain(domain.address));
  62. }
  63. redis.del(getRedisKey.user(user.email));
  64. redis.del(getRedisKey.user(user.apikey));
  65. return domain;
  66. };
  67. export const banDomain = async (
  68. addressToban: string,
  69. banned_by_id?: number
  70. ): Promise<Domain> => {
  71. const address = addressToban.toLowerCase();
  72. const currentDomain = await getDomain({ address });
  73. let domain;
  74. if (currentDomain) {
  75. const updates: Domain[] = await knex<Domain>("domains")
  76. .where({ address })
  77. .update(
  78. { banned: true, banned_by_id, updated_at: new Date().toISOString() },
  79. "*"
  80. );
  81. domain = updates[0];
  82. } else {
  83. const inserts: Domain[] = await knex<Domain>("domains").insert(
  84. { address, banned: true, banned_by_id },
  85. "*"
  86. );
  87. domain = inserts[0];
  88. }
  89. if (domain) {
  90. redis.del(getRedisKey.domain(domain.address));
  91. }
  92. return domain;
  93. };