Index.cshtml.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. using SharedKernel.Extensions;
  2. using SharedKernel.Helpers;
  3. using MediatR;
  4. using Microsoft.AspNetCore.Mvc;
  5. using Microsoft.AspNetCore.Mvc.RazorPages;
  6. using System.ComponentModel;
  7. using System.ComponentModel.DataAnnotations;
  8. namespace Admin.Pages.Crypto.News
  9. {
  10. public class IndexModel(IMediator mediator) : PageModel
  11. {
  12. [BindProperty(SupportsGet = true)]
  13. public QueryParams Query { get; set; } = new();
  14. public sealed class QueryParams
  15. {
  16. [Range(1, int.MaxValue)]
  17. [DisplayName("페이지 번호")]
  18. public int PageNum { get; set; } = 1;
  19. [Range(1, 100)]
  20. [DisplayName("페이지 당 수")]
  21. public ushort PerPage { get; set; } = 20;
  22. }
  23. public int Total { get; set; }
  24. public List<(
  25. int Num,
  26. int ID,
  27. string Name,
  28. string Url,
  29. string? Description,
  30. int IntervalMinutes,
  31. char IsActive,
  32. string? LastFetchedAt,
  33. string CreatedAt,
  34. string EditURL
  35. )> List { get; set; } = [];
  36. public Pagination? Pagination { get; set; }
  37. public async Task OnGetAsync(CancellationToken ct)
  38. {
  39. if (!ModelState.IsValid)
  40. {
  41. return;
  42. }
  43. var result = await mediator.Send(new SearchNewsSources.Query(
  44. Query.PageNum,
  45. Query.PerPage
  46. ), ct);
  47. Total = result.Total;
  48. List = [..result.List.Select(c => (
  49. c.Num,
  50. c.ID,
  51. c.Name,
  52. c.Url,
  53. c.Description,
  54. c.IntervalMinutes,
  55. c.IsActive ? 'Y' : 'N',
  56. c.LastFetchedAt.GetDateAt() ?? "-",
  57. c.CreatedAt.GetDateAt(),
  58. EditURL: $"/Crypto/News/Edit/{c.ID}{Request.QueryString}"
  59. ))];
  60. Pagination = new Pagination(result.Total, Query.PageNum, Query.PerPage);
  61. }
  62. public async Task<IActionResult> OnPostDeleteAsync(int[] ids, CancellationToken ct)
  63. {
  64. try
  65. {
  66. await mediator.Send(new DeleteNewsSource.Command(ids), ct);
  67. TempData["SuccessMessage"] = $"{ids.Length}개 소스가 삭제되었습니다.";
  68. }
  69. catch (Exception e)
  70. {
  71. TempData["ErrorMessages"] = e.Message;
  72. }
  73. return RedirectToPage("/Crypto/News/Index", Query);
  74. }
  75. public async Task<IActionResult> OnPostForceFetchAsync(int id, CancellationToken ct)
  76. {
  77. try
  78. {
  79. var count = await mediator.Send(new ForceFetchNewsSource.Command(id), ct);
  80. TempData["SuccessMessage"] = $"강제 수집 완료: {count}건 수집되었습니다.";
  81. }
  82. catch (Exception e)
  83. {
  84. TempData["ErrorMessages"] = e.Message;
  85. }
  86. return RedirectToPage("/Crypto/News/Index", Query);
  87. }
  88. }
  89. }