Handler.cs 1.7 KB

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