host.ts 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import * as redis from "../redis";
  2. import knex from "../knex";
  3. interface Add extends Partial<Host> {
  4. address: string;
  5. }
  6. export const find = async (match: Partial<Host>): Promise<Host> => {
  7. if (match.address) {
  8. const cachedHost = await redis.get(redis.key.host(match.address));
  9. if (cachedHost) return JSON.parse(cachedHost);
  10. }
  11. const host = await knex<Domain>("hosts")
  12. .where(match)
  13. .first();
  14. if (host) {
  15. redis.set(
  16. redis.key.host(host.address),
  17. JSON.stringify(host),
  18. "EX",
  19. 60 * 60 * 6
  20. );
  21. }
  22. return host;
  23. };
  24. export const add = async (params: Add) => {
  25. params.address = params.address.toLowerCase();
  26. const exists = await knex<Domain>("domains")
  27. .where("address", params.address)
  28. .first();
  29. const newHost = {
  30. address: params.address,
  31. banned: !!params.banned
  32. };
  33. let host: Host;
  34. if (exists) {
  35. const [response] = await knex<Host>("hosts")
  36. .where("id", exists.id)
  37. .update(
  38. {
  39. ...newHost,
  40. updated_at: params.updated_at || new Date().toISOString()
  41. },
  42. "*"
  43. );
  44. host = response;
  45. } else {
  46. const [response] = await knex<Host>("hosts").insert(newHost, "*");
  47. host = response;
  48. }
  49. redis.remove.host(host);
  50. return host;
  51. };