host.queries.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. const redis = require("../redis");
  2. const utils = require("../utils");
  3. const knex = require("../knex");
  4. async function find(match) {
  5. if (match.address) {
  6. const cachedHost = await redis.client.get(redis.key.host(match.address));
  7. if (cachedHost) return JSON.parse(cachedHost);
  8. }
  9. const host = await knex("hosts")
  10. .where(match)
  11. .first();
  12. if (host) {
  13. redisClient.set(
  14. redis.key.host(host.address),
  15. JSON.stringify(host),
  16. "EX",
  17. 60 * 60 * 6
  18. );
  19. }
  20. return host;
  21. }
  22. async function add(params) {
  23. params.address = params.address.toLowerCase();
  24. const existingHost = await knex("hosts").where("address", params.address).first();
  25. let id = existingHost?.id;
  26. const newHost = {
  27. address: params.address,
  28. banned: !!params.banned,
  29. banned_by_id: params.banned_by_id,
  30. };
  31. if (id) {
  32. await knex("hosts").where("id", id).update({
  33. ...newHost,
  34. updated_at: params.updated_at || utils.dateToUTC(new Date())
  35. });
  36. } else {
  37. // Mysql and sqlite don't support returning but return the inserted id by default
  38. const [createdHost] = await knex("hosts").insert(newHost).returning("id");
  39. id = createdHost.id;
  40. }
  41. // Query domain instead of using returning as sqlite and mysql don't support it
  42. const host = await knex("hosts").where("id", id);
  43. redis.remove.host(host);
  44. return host;
  45. }
  46. module.exports = {
  47. add,
  48. find,
  49. }