Handler.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using Application.Abstractions.Messaging;
  2. using Application.Abstractions.Data;
  3. using SharedKernel.Results;
  4. using Domain.Entities.Forum.ValueObject;
  5. using Microsoft.EntityFrameworkCore;
  6. namespace Application.Features.Admin.Forum.Post.Get;
  7. public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Result<Response>>
  8. {
  9. public async Task<Result<Response>> Handle(Query request, CancellationToken ct)
  10. {
  11. var item = await db.Post.AsNoTracking().Include(c => c.Board).ThenInclude(c => c.BoardMeta).Include(c => c.BoardPrefix).Include(c => c.PostFile).Include(c => c.PostImage).Include(c => c.PostTag).ThenInclude(c => c.Tag).FirstOrDefaultAsync(x => x.ID == request.ID, ct);
  12. if (item is null)
  13. {
  14. return Result.Failure<Response>(Error.NotFound("Post.NotFound", "게시글을 찾을 수 없습니다."));
  15. }
  16. return Result.Success(new Response(
  17. item.ID,
  18. item.BoardID,
  19. item.Board.Name,
  20. item.BoardPrefixID,
  21. item.BoardPrefix?.Name,
  22. item.BoardPrefix?.Color,
  23. item.Subject,
  24. item.Content,
  25. item.Thumbnail,
  26. item.Name,
  27. item.SID,
  28. item.IsNotice,
  29. item.IsSecret,
  30. item.IsAnonymous,
  31. item.IsSpeaker,
  32. item.IsDeleted,
  33. item.Views,
  34. item.Likes,
  35. item.Dislikes,
  36. item.Comments,
  37. item.Images,
  38. item.Medias,
  39. item.Files,
  40. item.Tags,
  41. [..item.PostFile.OrderByDescending(f => f.ID).Select(f => new Response.FileItem(
  42. f.ID, f.FileName, f.Url, f.Extension, f.Size, f.Downloads, f.IsDisabled, f.CreatedAt
  43. ))],
  44. [..item.PostImage.OrderByDescending(f => f.ID).Select(f => new Response.ImageItem(
  45. f.ID, f.FileName, f.Url, f.Extension, f.Size, f.IsDisabled
  46. ))],
  47. [..item.PostTag.Select(t => new Response.TagItem(
  48. t.TagID, t.Tag.Name, t.Tag.Slug
  49. ))],
  50. item.Board.BoardMeta.List.Layout == BoardLayout.QnA,
  51. item.UpdatedAt,
  52. item.CreatedAt
  53. ));
  54. }
  55. }