domain.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import redisClient, * as redis from "../redis";
  2. import knex from "../knex";
  3. export const find = async (match: Partial<Domain>): Promise<Domain> => {
  4. if (match.address) {
  5. const cachedDomain = await redisClient.get(redis.key.domain(match.address));
  6. if (cachedDomain) return JSON.parse(cachedDomain);
  7. }
  8. const domain = await knex<Domain>("domains")
  9. .where(match)
  10. .first();
  11. if (domain) {
  12. redisClient.set(
  13. redis.key.domain(domain.address),
  14. JSON.stringify(domain),
  15. "EX",
  16. 60 * 60 * 6
  17. );
  18. }
  19. return domain;
  20. };
  21. export const get = async (match: Partial<Domain>): Promise<Domain[]> => {
  22. return knex<Domain>("domains").where(match);
  23. };
  24. interface Add extends Partial<Domain> {
  25. address: string;
  26. }
  27. export const add = async (params: Add) => {
  28. params.address = params.address.toLowerCase();
  29. const exists = await knex<Domain>("domains")
  30. .where("address", params.address)
  31. .first();
  32. const newDomain = {
  33. address: params.address,
  34. homepage: params.homepage || null,
  35. user_id: params.user_id || null,
  36. banned: !!params.banned
  37. };
  38. let domain: Domain;
  39. if (exists) {
  40. const [response]: Domain[] = await knex<Domain>("domains")
  41. .where("id", exists.id)
  42. .update(
  43. {
  44. ...newDomain,
  45. updated_at: params.updated_at || new Date().toISOString()
  46. },
  47. "*"
  48. );
  49. domain = response;
  50. } else {
  51. const [response]: Domain[] = await knex<Domain>("domains").insert(
  52. newDomain,
  53. "*"
  54. );
  55. domain = response;
  56. }
  57. redis.remove.domain(domain);
  58. return domain;
  59. };
  60. export const update = async (
  61. match: Partial<Domain>,
  62. update: Partial<Domain>
  63. ) => {
  64. const domains = await knex<Domain>("domains")
  65. .where(match)
  66. .update({ ...update, updated_at: new Date().toISOString() }, "*");
  67. domains.forEach(redis.remove.domain);
  68. return domains;
  69. };