Handler.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Cache;
  3. using Application.Abstractions.Messaging;
  4. using Microsoft.EntityFrameworkCore;
  5. namespace Application.Features.Admin.Forum.BoardMeta.Get;
  6. public sealed class Handler(IAppDbContext db, ICacheService cache) : IQueryHandler<Query, Response>
  7. {
  8. public async Task<Response> Handle(Query request, CancellationToken ct)
  9. {
  10. var cacheKey = CacheKeys.BoardMeta(request.BoardID);
  11. var cached = await cache.GetAsync<Response>(cacheKey, ct);
  12. if (cached is not null)
  13. {
  14. return cached;
  15. }
  16. var board = await db.Board
  17. .AsNoTracking()
  18. .FirstOrDefaultAsync(x => x.ID == request.BoardID, ct)
  19. ?? throw new KeyNotFoundException("게시판을 찾을 수 없습니다.");
  20. var meta = await db.BoardMeta
  21. .FirstOrDefaultAsync(x => x.BoardID == request.BoardID, ct);
  22. if (meta is null)
  23. {
  24. meta = new Domain.Entities.Forum.Boards.BoardMeta { BoardID = request.BoardID };
  25. db.BoardMeta.Add(meta);
  26. await db.SaveChangesAsync(ct);
  27. }
  28. var response = new Response(
  29. meta.ID,
  30. meta.BoardID,
  31. board.Code,
  32. board.Name,
  33. meta.List,
  34. meta.View,
  35. meta.Write,
  36. meta.Comment,
  37. meta.General,
  38. meta.Permission,
  39. meta.Notify,
  40. meta.NotifyTemplate,
  41. meta.Exp);
  42. await cache.SetAsync(cacheKey, response, ct);
  43. return response;
  44. }
  45. }