Create.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using MediatR;
  2. using Web.Api.Common;
  3. using Web.Api.Extensions;
  4. using Microsoft.AspNetCore.Mvc;
  5. using System.Security.Claims;
  6. namespace Web.Api.Endpoints.Forum.Comment;
  7. internal sealed class Create : IEndpoint
  8. {
  9. public sealed class Request
  10. {
  11. public int PostID { get; set; }
  12. public int? ParentID { get; set; }
  13. public string? Mention { get; set; }
  14. public string Content { get; set; } = "";
  15. public bool IsSecret { get; set; }
  16. public List<string>? Medias { get; set; }
  17. }
  18. public void MapEndpoint(IEndpointRouteBuilder app)
  19. {
  20. app.MapPost("api/forum/comments", async (
  21. ClaimsPrincipal user,
  22. [FromForm] Request request,
  23. HttpRequest httpRequest,
  24. ISender sender,
  25. CancellationToken ct
  26. ) => {
  27. var memberID = user.GetMemberID();
  28. if (memberID is null)
  29. {
  30. return ApiResponse.Fail(StatusCodes.Status401Unauthorized, "Invalid token");
  31. }
  32. var images = httpRequest.Form.Files.GetFiles("images").ToList();
  33. var files = httpRequest.Form.Files.GetFiles("files").ToList();
  34. var command = new Application.Features.Api.Forum.Comment.Create.Command(
  35. memberID.Value,
  36. request.PostID,
  37. request.ParentID,
  38. request.Mention,
  39. request.Content,
  40. request.IsSecret,
  41. images.Count > 0 ? images : null,
  42. request.Medias,
  43. files.Count > 0 ? files : null
  44. );
  45. var result = await sender.Send(command, ct);
  46. return result.Match(
  47. commentID => ApiResponse.Created(new { id = commentID }),
  48. CustomResults.Problem
  49. );
  50. })
  51. .WithTags("Forum")
  52. .RequireAuthorization()
  53. .DisableAntiforgery();
  54. }
  55. }