Create.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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.Post;
  7. internal sealed class Create : IEndpoint
  8. {
  9. public sealed class Request
  10. {
  11. public int BoardID { get; set; }
  12. public string? BoardCode { get; set; }
  13. public int? BoardPrefixID { get; set; }
  14. public string Subject { get; set; } = "";
  15. public string Content { get; set; } = "";
  16. public bool IsSecret { get; set; }
  17. public bool IsNotice { get; set; }
  18. public bool IsSpeaker { get; set; }
  19. public List<string>? Tags { get; set; }
  20. public List<string>? Medias { get; set; }
  21. }
  22. public void MapEndpoint(IEndpointRouteBuilder app)
  23. {
  24. app.MapPost("api/forum/posts", async (
  25. ClaimsPrincipal user,
  26. [FromForm] Request request,
  27. HttpRequest httpRequest,
  28. ISender sender,
  29. CancellationToken ct
  30. ) => {
  31. var memberID = user.GetMemberID();
  32. if (memberID is null)
  33. {
  34. return ApiResponse.Fail(StatusCodes.Status401Unauthorized, "Invalid token");
  35. }
  36. var images = httpRequest.Form.Files.GetFiles("images").ToList();
  37. var files = httpRequest.Form.Files.GetFiles("files").ToList();
  38. var command = new Application.Features.Api.Forum.Post.Create.Command(
  39. memberID.Value,
  40. request.BoardID,
  41. request.BoardPrefixID,
  42. request.Subject,
  43. request.Content,
  44. request.IsSecret,
  45. request.IsNotice,
  46. request.IsSpeaker,
  47. request.Tags,
  48. images.Count > 0 ? images : null,
  49. request.Medias,
  50. files.Count > 0 ? files : null
  51. );
  52. var result = await sender.Send(command, ct);
  53. return result.Match(
  54. postID => ApiResponse.Created(new { ID = postID }),
  55. CustomResults.Problem
  56. );
  57. })
  58. .WithTags("Forum")
  59. .RequireAuthorization()
  60. .DisableAntiforgery();
  61. }
  62. }