using SharedKernel.Attributes; using SharedKernel.Extensions; using MediatR; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using System.ComponentModel; using System.ComponentModel.DataAnnotations; namespace Admin.Pages.Member.Grade { public class WriteModel(IMediator mediator) : PageModel { [BindProperty] public InputModel Input { get; set; } = new(); public sealed class InputModel { [DisplayName("이미지")] [AllowedExtensions("jpg,jpeg,png,gif,webp", ErrorMessage = "이미지 형식은 jpg, jpeg, png, gif, webp 파일이어야 합니다.")] public IFormFile? ImageFile { get; set; } [DisplayName("한글 명")] [DataType(DataType.Text)] [Required(ErrorMessage = "{0}은(는) 필수입니다.")] [StringLength(240, ErrorMessage = "{0}은(는) {1}자 이하로 입력하세요.")] public string KorName { get; set; } = default!; [DisplayName("영문 명")] [DataType(DataType.Text)] [Required(ErrorMessage = "{0}은(는) 필수입니다.")] [StringLength(120, ErrorMessage = "{0}은(는) {1}자 이하로 입력하세요.")] public string EngName { get; set; } = default!; [DisplayName("내용")] [DataType(DataType.Text)] [StringLength(1000, ErrorMessage = "{0}은(는) {1}자 이하로 입력하세요.")] public string? Description { get; set; } [DisplayName("순서")] [Required(ErrorMessage = "{0}은(는) 필수입니다.")] [Range(-9999, 9999, ErrorMessage = "{0} 입력 범위는 {1} ~ {2} 입니다.")] public short Order { get; set; } = 0; [DisplayName("누적 후원 횟수")] [Required(ErrorMessage = "{0}은(는) 필수입니다.")] [Range(0, 1000000000, ErrorMessage = "{0} 입력 범위는 {1} ~ {2} 입니다.")] public long TotalDonationCount { get; set; } = 0; [DisplayName("누적 후원 금액")] [Required(ErrorMessage = "{0}은(는) 필수입니다.")] [Range(0, 1000000000, ErrorMessage = "{0} 입력 범위는 {1} ~ {2} 입니다.")] public int TotalDonationAmount { get; set; } = 0; [DisplayName("표시 색상")] [Required(ErrorMessage = "{0}은(는) 필수입니다.")] [StringLength(7, MinimumLength = 4, ErrorMessage = "{0}은(는) {2}자 이상 {1}자 이하로 입력하세요.")] public string TextColor { get; set; } = "#000000"; [DisplayName("사용 여부")] public bool IsActive { get; set; } = false; } public void OnGet() { } public async Task OnPostAsync(CancellationToken ct) { try { if (!ModelState.IsValid) { throw new Exception(ModelState.GetErrorMessages()); } await mediator.Send(new CreateMemberGrade.Command( Input.KorName, Input.EngName, Input.Description, Input.Order, Input.ImageFile, Input.TextColor, Input.TotalDonationAmount, Input.TotalDonationCount, Input.IsActive ), ct); TempData["SuccessMessage"] = $"{Input.KorName} 회원등급이 등록되었습니다."; return RedirectToPage("/Member/Grade/Index"); } catch (Exception e) { TempData["ErrorMessages"] = e.Message; return Redirect("/Member/Grade/Write"); } } } }