host.queries.js 1.5 KB

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