using SharedKernel.Extensions; using MediatR; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using System.ComponentModel.DataAnnotations; using GetGameLanguages = Application.Features.Admin.Store.GameLanguage.GetAll; using SaveGameLanguages = Application.Features.Admin.Store.GameLanguage.Save; namespace Admin.Pages.Store; public class GameLanguageModel(IMediator mediator) : PageModel { public int Total { get; private set; } public List<( int Num, int ID, int Index, string KorName, string? EngName, int Order, char IsActive, int GameCount, 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(100)] public required string KorName { get; set; } [StringLength(100)] public string? EngName { get; set; } [Range(-9999, 9999)] public int Order { get; set; } public bool IsActive { get; set; } = false; } public async Task OnGetAsync(CancellationToken ct) { if (!ModelState.IsValid) { return; } var result = await mediator.Send(new GetGameLanguages.Query(), ct); Total = result.Total; List = [.. result.List.Select(c => ( c.Num, c.ID, c.Index, c.KorName, c.EngName, c.Order, c.IsActive ? 'Y' : 'N', c.GameCount, c.UpdatedAt.GetDateAt() ?? "-", c.CreatedAt.GetDateAt() ))]; Data = [.. result.List.Select(x => new InputModel { ID = x.ID, KorName = x.KorName, EngName = x.EngName, Order = x.Order, IsActive = x.IsActive })]; } public async Task OnPostAsync(CancellationToken ct) { if (!ModelState.IsValid) { TempData["ErrorMessages"] = ModelState.GetErrorMessages(); return RedirectToPage("/Store/GameLanguage"); } var cmd = new SaveGameLanguages.Command( [.. Input.Select(x => new SaveGameLanguages.Command.Row( x.ID, x.KorName, x.EngName, x.Order, x.IsActive ))] ); var result = await mediator.Send(cmd, ct); if (result.IsFailure) { TempData["ErrorMessages"] = result.Error.Description; } else { var response = result.Value; TempData["SuccessMessage"] = $"저장 완료 (추가: {response.Inserted}, 수정: {response.Updated}, 삭제: {response.Deleted})"; } return RedirectToPage("/Store/GameLanguage"); } }