Handler.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using Application.Abstractions.Messaging;
  2. using Application.Abstractions.Data;
  3. using Application.Abstractions.Forum;
  4. using Domain.Entities.Forum.Logs;
  5. using SharedKernel.Results;
  6. using Microsoft.EntityFrameworkCore;
  7. namespace Application.Features.Api.Forum.CommentFile.Download;
  8. public sealed class Handler(IAppDbContext db, IBoardPermissionService permissionService) : ICommandHandler<Command, Result<Response>>
  9. {
  10. public async Task<Result<Response>> Handle(Command request, CancellationToken ct)
  11. {
  12. var file = await db.CommentFile.FirstOrDefaultAsync(x => x.UUID == request.CommentFileUUID && !x.IsDisabled, ct);
  13. if (file is null)
  14. {
  15. return Result.Failure<Response>(Error.NotFound("CommentFile.NotFound", "파일을 찾을 수 없습니다."));
  16. }
  17. // 파일 다운로드 권한 확인
  18. var boardMeta = await db.BoardMeta.AsNoTracking().FirstOrDefaultAsync(x => x.BoardID == file.BoardID, ct);
  19. if (boardMeta is not null && boardMeta.Permission.FileDownload > -1)
  20. {
  21. if (!request.MemberID.HasValue)
  22. {
  23. return Result.Failure<Response>(Error.Forbidden("CommentFile.PermissionDenied", "파일 다운로드 권한이 없습니다."));
  24. }
  25. var member = await db.Member.AsNoTracking().FirstOrDefaultAsync(x => x.ID == request.MemberID.Value, ct);
  26. if (member is null || !await permissionService.HasPermissionAsync(member, file.BoardID, boardMeta.Permission.FileDownload, ct))
  27. {
  28. return Result.Failure<Response>(Error.Forbidden("CommentFile.PermissionDenied", "파일 다운로드 권한이 없습니다."));
  29. }
  30. }
  31. file.Downloads++;
  32. var log = new CommentFileDownLog
  33. {
  34. CommentID = file.CommentID,
  35. CommentFileID = file.ID,
  36. MemberID = request.MemberID,
  37. IpAddress = request.IpAddress,
  38. UserAgent = request.UserAgent
  39. };
  40. await db.CommentFileDownLog.AddAsync(log, ct);
  41. await db.SaveChangesAsync(ct);
  42. return new Response(file.Url, file.FileName);
  43. }
  44. }