Articles.cshtml.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using SharedKernel.Extensions;
  2. using SharedKernel.Helpers;
  3. using MediatR;
  4. using Microsoft.AspNetCore.Mvc;
  5. using Microsoft.AspNetCore.Mvc.RazorPages;
  6. using Microsoft.AspNetCore.Mvc.Rendering;
  7. using System.ComponentModel;
  8. using System.ComponentModel.DataAnnotations;
  9. namespace Admin.Pages.Crypto.News
  10. {
  11. public class ArticlesModel(IMediator mediator) : PageModel
  12. {
  13. [BindProperty(SupportsGet = true)]
  14. public QueryParams Query { get; set; } = new();
  15. public List<SelectListItem> Sources { get; set; } = [];
  16. public sealed class QueryParams
  17. {
  18. [Range(1, int.MaxValue)]
  19. [DisplayName("페이지 번호")]
  20. public int PageNum { get; set; } = 1;
  21. [Range(1, 100)]
  22. [DisplayName("페이지 당 수")]
  23. public ushort PerPage { get; set; } = 20;
  24. [DisplayName("소스")]
  25. public int? RssFeedSourceID { get; set; }
  26. [DisplayName("검색어")]
  27. public string? Keyword { get; set; }
  28. }
  29. public int Total { get; set; }
  30. public List<(
  31. int Num,
  32. int ID,
  33. string FeedSourceName,
  34. string Title,
  35. string? Author,
  36. string? Link,
  37. string? PublishedAt,
  38. string CreatedAt
  39. )> List { get; set; } = [];
  40. public Pagination? Pagination { get; set; }
  41. public async Task OnGetAsync(CancellationToken ct)
  42. {
  43. if (!ModelState.IsValid)
  44. {
  45. return;
  46. }
  47. var sources = await mediator.Send(new GetAllNewsSources.Query(), ct);
  48. Sources = [..sources.Sources.Select(s => new SelectListItem(s.Name, s.ID.ToString()))];
  49. var result = await mediator.Send(new SearchNewsArticles.Query(
  50. Query.RssFeedSourceID,
  51. Query.Keyword,
  52. Query.PageNum,
  53. Query.PerPage
  54. ), ct);
  55. Total = result.Total;
  56. List = [..result.List.Select(c => (
  57. c.Num,
  58. c.ID,
  59. c.FeedSourceName,
  60. c.Title,
  61. c.Author,
  62. c.Link,
  63. c.PublishedAt.GetDateAt() ?? "-",
  64. c.CreatedAt.GetDateAt()
  65. ))];
  66. Pagination = new Pagination(result.Total, Query.PageNum, Query.PerPage);
  67. }
  68. public async Task<IActionResult> OnPostDeleteAsync(int[] ids, CancellationToken ct)
  69. {
  70. try
  71. {
  72. await mediator.Send(new DeleteNewsArticles.Command(ids), ct);
  73. TempData["SuccessMessage"] = $"{ids.Length}개 기사가 삭제되었습니다.";
  74. }
  75. catch (Exception e)
  76. {
  77. TempData["ErrorMessages"] = e.Message;
  78. }
  79. return RedirectToPage("/Crypto/News/Articles", Query);
  80. }
  81. }
  82. }