using SharedKernel.Extensions; using MediatR; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using System.ComponentModel.DataAnnotations; namespace Admin.Pages.Banner; public class PositionModel(IMediator mediator) : PageModel { public int Total { get; private set; } public List<( int Num, int ID, int Index, string Code, string Subject, char IsActive, int BannerItemRows, string? UpdatedAt, string CreatedAt )> List { get; set; } = []; [BindProperty(Name = "request")] public List Input { get; private set; } = []; public List Data { get; private set; } = []; public sealed class InputModel { public int? ID { get; set; } [Required] [StringLength(30)] public required string Code { get; set; } [Required] [StringLength(255)] public required string Subject { get; set; } public bool IsActive { get; set; } } public async Task OnGetAsync(CancellationToken ct) { if (!ModelState.IsValid) { return; } var result = await mediator.Send(new GetBannerPositions.Query(), ct); Total = result.Total; List = [..result.List.Select(c => ( c.Num, c.ID, c.Index, c.Code, c.Subject, c.IsActive ? 'Y' : 'N', c.BannerItemRows, c.UpdatedAt.GetDateAt() ?? "-", c.CreatedAt.GetDateAt() ))]; Data = [..result.List.Select(x => new InputModel { ID = x.ID, Code = x.Code, Subject = x.Subject, IsActive = x.IsActive })]; } public async Task OnPostAsync(CancellationToken ct) { try { if (!ModelState.IsValid) { throw new Exception(); } var cmd = new SaveBannerPositions.Command( [..Input.Select(x => new SaveBannerPositions.Command.Row( x.ID, x.Code, x.Subject, x.IsActive ))] ); var response = await mediator.Send(cmd, ct); TempData["SuccessMessage"] = $"ÀúÀå ¿Ï·á (Ãß°¡: {response.Inserted}, ¼öÁ¤: {response.Updated}, »èÁ¦: {response.Deleted})"; } catch (Exception e) { TempData["ErrorMessages"] = e.Message; } return RedirectToPage("/Banner/Position"); } }