3153d3c095
## 변경사항
- Program.cs: app.UsePathBase('/taxbaik') 제거
- Blazor 컴포넌트: /taxbaik/admin/* → ./* 상대 경로로 변경
- 모든 내부 링크 절대 경로 → 상대 경로로 전환
## 현황
✅ 빌드: 0 오류, 0 경고
✅ 헬스체크: HTTP 200
✅ 로그인 페이지: 로드 정상
❌ 로그인 API: 400 오류 (DB 오류 - 조사 중)
## 다음 단계
- LoginEndpoint에서 발생하는 DB 오류 원인 파악 필요
- Razor Pages 절대 경로도 상대 경로로 변경 (보류 중)
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
156 lines
4.7 KiB
Plaintext
156 lines
4.7 KiB
Plaintext
@page "/admin/blog/{id:int}/edit"
|
|
@rendermode @(new InteractiveWebAssemblyRenderMode(prerender: false))
|
|
@attribute [Authorize]
|
|
@using TaxBaik.Application.DTOs
|
|
@using TaxBaik.WasmClient.Components.Admin.Pages.Blog
|
|
@inject IBlogBrowserClient BlogClient
|
|
@inject ICategoryBrowserClient CategoryClient
|
|
@inject NavigationManager Navigation
|
|
@inject ISnackbar Snackbar
|
|
@inject IDialogService DialogService
|
|
|
|
<PageTitle>포스트 수정</PageTitle>
|
|
|
|
<AdminCrudPageShell Title="포스트 수정"
|
|
Eyebrow="Content"
|
|
Subtitle="블로그 포스트를 수정합니다."
|
|
Loading="@isLoading"
|
|
SkeletonContent="@EditorSkeleton"
|
|
OnCancel="@GoBack">
|
|
@if (post == null)
|
|
{
|
|
<MudAlert Severity="Severity.Error" Class="mt-4">포스트를 찾을 수 없습니다.</MudAlert>
|
|
}
|
|
else
|
|
{
|
|
<MudPaper Class="pa-4 mt-4" Elevation="1">
|
|
<BlogForm Model="model" Categories="categories" SubmitText="저장" OnSubmit="SavePost" />
|
|
<div class="mt-4">
|
|
<MudButton Variant="Variant.Outlined" Color="Color.Error" @onclick="DeletePost">삭제</MudButton>
|
|
</div>
|
|
</MudPaper>
|
|
}
|
|
</AdminCrudPageShell>
|
|
|
|
@code {
|
|
[Parameter]
|
|
public int Id { get; set; }
|
|
|
|
private TaxBaik.Application.DTOs.BlogPostResponseDto? post;
|
|
private IReadOnlyList<Domain.Entities.Category> categories = [];
|
|
private BlogFormModel model = new();
|
|
private bool isLoading = true;
|
|
|
|
private RenderFragment EditorSkeleton => builder =>
|
|
{
|
|
builder.OpenComponent<AdminSkeletonRows>(0);
|
|
builder.AddAttribute(1, "Rows", 5);
|
|
builder.AddAttribute(2, "Columns", 3);
|
|
builder.CloseComponent();
|
|
};
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
{
|
|
try
|
|
{
|
|
post = await BlogClient.GetByIdAsync(Id);
|
|
if (post != null)
|
|
{
|
|
categories = await CategoryClient.GetAllAsync();
|
|
MapPostToModel(post);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Snackbar.Add($"포스트 로드 실패: {ex.Message}", Severity.Error);
|
|
}
|
|
finally
|
|
{
|
|
isLoading = false;
|
|
}
|
|
}
|
|
|
|
private void MapPostToModel(TaxBaik.Application.DTOs.BlogPostResponseDto post)
|
|
{
|
|
model.Title = post.Title;
|
|
model.Content = post.Content;
|
|
model.CategoryId = post.CategoryId;
|
|
model.Tags = post.Tags;
|
|
model.SeoTitle = post.SeoTitle;
|
|
model.SeoDescription = post.SeoDescription;
|
|
model.IsPublished = post.IsPublished;
|
|
}
|
|
|
|
private void GoBack()
|
|
{
|
|
Navigation.NavigateTo("./blog");
|
|
}
|
|
|
|
private async Task SavePost()
|
|
{
|
|
if (post == null)
|
|
return;
|
|
|
|
try
|
|
{
|
|
var result = await BlogClient.UpdateAsync(post.Id, new CreateBlogPostDto
|
|
{
|
|
Title = model.Title,
|
|
Content = model.Content,
|
|
CategoryId = model.CategoryId,
|
|
Tags = model.Tags,
|
|
SeoTitle = model.SeoTitle,
|
|
SeoDescription = model.SeoDescription,
|
|
IsPublished = model.IsPublished
|
|
});
|
|
|
|
if (result == null)
|
|
{
|
|
Snackbar.Add("저장 실패: 포스트를 저장하지 못했습니다.", Severity.Error);
|
|
return;
|
|
}
|
|
|
|
Snackbar.Add("포스트가 저장되었습니다.", Severity.Success);
|
|
Navigation.NavigateTo("./blog");
|
|
}
|
|
catch (ValidationException ex)
|
|
{
|
|
Snackbar.Add(ex.Message, Severity.Error);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Snackbar.Add($"저장 실패: {ex.Message}", Severity.Error);
|
|
}
|
|
}
|
|
|
|
private async Task DeletePost()
|
|
{
|
|
if (post == null)
|
|
return;
|
|
|
|
var result = await DialogService.ShowMessageBox(
|
|
"포스트 임시 내리기",
|
|
"정말 이 포스트를 임시로 내리시겠습니까? 필요하면 나중에 다시 올릴 수 있습니다.",
|
|
"임시 내리기", "취소");
|
|
|
|
if (result != true)
|
|
return;
|
|
|
|
try
|
|
{
|
|
var deleted = await BlogClient.DeleteAsync(post.Id);
|
|
if (!deleted)
|
|
{
|
|
Snackbar.Add("임시 내리기 실패: 포스트를 내리지 못했습니다.", Severity.Error);
|
|
return;
|
|
}
|
|
Snackbar.Add("포스트를 임시로 내렸습니다.", Severity.Success);
|
|
Navigation.NavigateTo("./blog");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Snackbar.Add($"임시 내리기 실패: {ex.Message}", Severity.Error);
|
|
}
|
|
}
|
|
}
|