Write.cshtml.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using SharedKernel.Extensions;
  2. using MediatR;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Microsoft.AspNetCore.Mvc.RazorPages;
  5. using System.ComponentModel.DataAnnotations;
  6. namespace Admin.Pages.Crypto.News
  7. {
  8. public class WriteModel(IMediator mediator) : PageModel
  9. {
  10. [BindProperty]
  11. public InputModel Input { get; set; } = new();
  12. public sealed class InputModel
  13. {
  14. [Required(ErrorMessage = "이름은 필수입니다.")]
  15. [StringLength(200, ErrorMessage = "이름은 {1}자 이하로 입력하세요.")]
  16. public string Name { get; set; } = null!;
  17. [Required(ErrorMessage = "URL은 필수입니다.")]
  18. [StringLength(2048, ErrorMessage = "URL은 {1}자 이하로 입력하세요.")]
  19. [DataType(DataType.Url)]
  20. public string Url { get; set; } = null!;
  21. [StringLength(500, ErrorMessage = "설명은 {1}자 이하로 입력하세요.")]
  22. public string? Description { get; set; }
  23. [Range(1, 1440, ErrorMessage = "수집주기는 1~1440분 사이로 입력하세요.")]
  24. public int IntervalMinutes { get; set; } = 10;
  25. }
  26. public void OnGet()
  27. {
  28. }
  29. public async Task<IActionResult> OnPostAsync(CancellationToken ct)
  30. {
  31. try
  32. {
  33. if (!ModelState.IsValid)
  34. {
  35. throw new Exception(ModelState.GetErrorMessages());
  36. }
  37. await mediator.Send(new CreateNewsSource.Command(
  38. Input.Name,
  39. Input.Url,
  40. Input.Description,
  41. Input.IntervalMinutes
  42. ), ct);
  43. TempData["SuccessMessage"] = $"{Input.Name} 소스가 등록되었습니다.";
  44. return RedirectToPage("/Crypto/News/Index");
  45. }
  46. catch (Exception e)
  47. {
  48. TempData["ErrorMessages"] = e.Message;
  49. return RedirectToPage("/Crypto/News/Write");
  50. }
  51. }
  52. }
  53. }