@page "/admin/blog" @attribute [Authorize] @inject IBlogBrowserClient BlogClient @inject ISnackbar Snackbar 블로그 관리 새 포스트 작성
@($"검색 결과 {FilteredPosts.Count()}개 / 전체 포스트 {totalPosts}개") 페이지 @currentPage / @totalPages 수정하기 삭제 이전 다음 @code { [CascadingParameter] private Task? AuthStateTask { get; set; } private List posts = []; private string searchQuery = ""; private bool isLoading = true; private int currentPage = 1; private int totalPages = 1; private int totalPosts = 0; private const int PageSize = 20; private IEnumerable FilteredPosts => posts .Where(p => string.IsNullOrEmpty(searchQuery) || p.Title.Contains(searchQuery, StringComparison.OrdinalIgnoreCase) || (p.Content != null && p.Content.Contains(searchQuery, StringComparison.OrdinalIgnoreCase))); protected override async Task OnInitializedAsync() { if (AuthStateTask != null) { var authState = await AuthStateTask; if (authState.User.Identity?.IsAuthenticated == true) { await LoadPosts(); } } } private async Task LoadPosts() { isLoading = true; try { var result = await BlogClient.GetAdminPagedAsync(currentPage, PageSize); posts = result.Items.ToList(); totalPosts = result.Total; totalPages = Math.Max(1, (int)Math.Ceiling(totalPosts / (double)PageSize)); } catch { posts = []; totalPosts = 0; totalPages = 1; } isLoading = false; } private async Task PreviousPage() { if (currentPage <= 1) return; currentPage--; await LoadPosts(); } private async Task NextPage() { if (currentPage >= totalPages) return; currentPage++; await LoadPosts(); } private async Task TogglePublish(TaxBaik.Application.DTOs.BlogPostResponseDto post, bool isPublished) { var previous = post.IsPublished; post.IsPublished = isPublished; var result = await BlogClient.UpdateAsync(post.Id, new TaxBaik.Application.DTOs.CreateBlogPostDto { Title = post.Title, Content = post.Content, CategoryId = post.CategoryId, Tags = post.Tags, SeoTitle = post.SeoTitle, SeoDescription = post.SeoDescription, ThumbnailUrl = post.ThumbnailUrl, IsPublished = isPublished, AuthorId = post.AuthorId }); if (result == null) { post.IsPublished = previous; Snackbar.Add("발행 상태 변경에 실패했습니다.", Severity.Error); return; } Snackbar.Add("발행 상태가 변경되었습니다.", Severity.Success); } private async Task DeletePost(int postId) { var deleted = await BlogClient.DeleteAsync(postId); if (!deleted) { Snackbar.Add("포스트 삭제에 실패했습니다.", Severity.Error); return; } Snackbar.Add("포스트가 삭제되었습니다.", Severity.Success); await LoadPosts(); } }