using SharedKernel.Extensions; using MediatR; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using System.ComponentModel; using System.ComponentModel.DataAnnotations; namespace Admin.Pages.Forum.Posts.List { public class EditModel(IMediator mediator) : PageModel { [BindProperty] public string? QueryString { get; set; } public string? ReturnUrl { get; set; } [BindProperty] public InputModel Input { get; set; } = new(); public string? CurrentThumbnail { get; private set; } public sealed class InputModel { [DisplayName("ID")] [Required(ErrorMessage = "{0}은 필수입니다.")] public int ID { get; set; } public int BoardID { get; set; } [DisplayName("제목")] [Required(ErrorMessage = "{0}은 필수입니다.")] [StringLength(255, ErrorMessage = "{0}은 {1}자 이내로 입력하세요.")] public string Subject { get; set; } = null!; [DisplayName("내용")] [StringLength(8000, ErrorMessage = "{0}은 {1}자 이내로 입력하세요.")] public string? Content { get; set; } [DisplayName("대표 이미지")] public IFormFile? ThumbnailFile { get; set; } [DisplayName("공지")] public bool IsNotice { get; set; } = false; [DisplayName("비밀")] public bool IsSecret { get; set; } = false; [DisplayName("익명")] public bool IsAnonymous { get; set; } = false; public string? ReturnUrl { get; set; } } public async Task OnGetAsync(int id, CancellationToken ct) { var result = await mediator.Send(new GetPost.Query(id), ct); CurrentThumbnail = result.Thumbnail; ReturnUrl = Request.Headers.Referer.ToString(); Input = new InputModel { ID = result.ID, BoardID = result.BoardID, Subject = result.Subject, Content = result.Content, IsNotice = result.IsNotice, IsSecret = result.IsSecret, IsAnonymous = result.IsAnonymous, ReturnUrl = ReturnUrl }; QueryString = Request.QueryString.ToString(); } public async Task OnPostAsync(CancellationToken ct) { try { if (!ModelState.IsValid) { throw new Exception(ModelState.GetErrorMessages()); } await mediator.Send(new UpdatePost.Command( Input.ID, Input.Subject, Input.Content, Input.ThumbnailFile, Input.IsNotice, Input.IsSecret, Input.IsAnonymous ), ct); TempData["SuccessMessage"] = "게시글이 수정되었습니다."; } catch (Exception e) { TempData["ErrorMessages"] = e.Message; } return Redirect($"/Forum/Posts/List/Edit/{Input.ID}{Request.QueryString}"); } public async Task OnPostDeleteAsync(CancellationToken ct) { try { await mediator.Send(new DeletePost.Command([Input.ID]), ct); TempData["SuccessMessage"] = "게시글이 삭제되었습니다."; return RedirectToPage("/Forum/Posts/List/Index"); } catch (Exception e) { TempData["ErrorMessages"] = e.Message; return Redirect($"/Forum/Posts/List/Edit/{Input.ID}{Request.QueryString}"); } } } }