using SharedKernel.Extensions; using Application.Abstractions.Messaging; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using System.ComponentModel; using System.ComponentModel.DataAnnotations; namespace Admin.Pages.Store.Coupon; public class EditModel(IMediator mediator) : PageModel { [BindProperty] public string? QueryString { get; set; } public string GameName { get; private set; } = ""; public string ProductName { get; private set; } = ""; public string UsagePolicyText { get; private set; } = ""; public int GeneratedCount { get; private set; } public int UsedCount { get; private set; } public int AvailableCount { get; private set; } [BindProperty] public InputModel Input { get; set; } = new(); public sealed class InputModel { [Required] public int ID { get; set; } [DisplayName("쿠폰명")] [Required(ErrorMessage = "{0}은(는) 필수입니다.")] [StringLength(200)] public string Name { get; set; } = null!; [DisplayName("만료 일시")] [DataType(DataType.DateTime)] public DateTime? ExpiresAt { get; set; } [DisplayName("재고 부족 알림 임계치")] [Range(0, int.MaxValue)] public int LowStockThreshold { get; set; } } public async Task OnGetAsync(int id, CancellationToken ct) { var result = await mediator.Send(new GetCoupon.Query(id), ct); if (result.IsFailure) { TempData["ErrorMessages"] = result.Error.Description; QueryString = Request.QueryString.ToString(); return; } var data = result.Value; GameName = data.GameName; ProductName = data.ProductName; UsagePolicyText = data.UsagePolicy == Domain.Entities.Store.ValueObject.CouponUsagePolicy.SingleUse ? "1회 사용 후 소진" : "재사용 가능"; GeneratedCount = data.GeneratedCount; UsedCount = data.UsedCount; AvailableCount = data.AvailableCount; Input = new InputModel { ID = data.ID, Name = data.Name, ExpiresAt = data.ExpiresAt, LowStockThreshold = data.LowStockThreshold }; QueryString = Request.QueryString.ToString(); } public async Task OnPostAsync(CancellationToken ct) { if (!ModelState.IsValid) { TempData["ErrorMessages"] = ModelState.GetErrorMessages(); return Redirect($"/Store/Coupon/Edit/{Input.ID}{Request.QueryString}"); } var result = await mediator.Send(new UpdateCoupon.Command( Input.ID, Input.Name, Input.ExpiresAt, Input.LowStockThreshold ), ct); if (result.IsFailure) { TempData["ErrorMessages"] = result.Error.Description; } else { TempData["SuccessMessage"] = $"{Input.Name} 쿠폰이 수정되었습니다."; } return Redirect($"/Store/Coupon/Edit/{Input.ID}{Request.QueryString}"); } }