domain.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import { Types } from 'mongoose';
  2. import Domain, { IDomain } from '../models/domain';
  3. import User from '../models/user';
  4. import * as redis from '../redis';
  5. export const getDomain = async (data: Partial<IDomain>) => {
  6. const redisKey = `${data.name}-${data.banned ? 'y' : 'n'}`;
  7. const cachedDomain = await redis.get(redisKey);
  8. if (cachedDomain) return JSON.parse(cachedDomain);
  9. const domain = await Domain.findOne(data);
  10. redis.set(redisKey, JSON.stringify(domain), 'EX', 60 * 60 * 6);
  11. return domain;
  12. };
  13. export const setDomain = async (data: Partial<IDomain>) => {
  14. const [domain] = await Promise.all([
  15. Domain.create({
  16. name: data.name,
  17. homepage: data.homepage,
  18. user: data.user,
  19. }),
  20. Domain.findOneAndUpdate({ user: data.user }, { user: undefined }),
  21. ]);
  22. await User.findByIdAndUpdate(data.user, { domain });
  23. return domain;
  24. };
  25. export const deleteDomain = async (user: Types.ObjectId) => {
  26. const [domain] = await Promise.all([
  27. Domain.findOneAndUpdate({ user }, { user: undefined }),
  28. User.findByIdAndUpdate(user, { domain: undefined }),
  29. ]);
  30. if (domain) {
  31. redis.del(`${domain.name}-${domain.banned ? 'y' : 'n'}`);
  32. }
  33. return domain;
  34. };
  35. export const banDomain = async (name: string, bannedBy?: Types.ObjectId) => {
  36. const domain = await Domain.findOneAndUpdate(
  37. { name },
  38. { banned: true, bannedBy },
  39. { upsert: true }
  40. );
  41. if (domain) {
  42. redis.del(`${domain.name}-${domain.banned ? 'y' : 'n'}`);
  43. }
  44. return domain;
  45. };