Handler.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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.AsNoTracking().FirstOrDefaultAsync(x => x.ID == request.BoardID, ct);
  18. if (board is null)
  19. {
  20. return Result.Failure<Response>(Error.NotFound("BoardMeta.NotFound", "게시판을 찾을 수 없습니다."));
  21. }
  22. var meta = await db.BoardMeta.FirstOrDefaultAsync(x => x.BoardID == request.BoardID, ct);
  23. if (meta is null)
  24. {
  25. meta = new Domain.Entities.Forum.Boards.BoardMeta {
  26. BoardID = request.BoardID
  27. };
  28. await db.BoardMeta.AddAsync(meta, ct);
  29. await db.SaveChangesAsync(ct);
  30. }
  31. var response = new Response(
  32. meta.ID,
  33. meta.BoardID,
  34. board.Code,
  35. board.Name,
  36. meta.List,
  37. meta.View,
  38. meta.Write,
  39. meta.Comment,
  40. meta.General,
  41. meta.Permission,
  42. meta.Notify,
  43. meta.NotifyTemplate,
  44. meta.Exp);
  45. await cache.SetAsync(cacheKey, response, ct);
  46. return response;
  47. }
  48. }