using Elternbeirat.Contracts; using Elternbeirat.PocketBase; using Elternbeirat.Web.Shared; using Microsoft.AspNetCore.Components; namespace Elternbeirat.Web.Features.Pages; public partial class ContentPage { [LoggerMessage( Level = LogLevel.Warning, Message = "Could not load page '{slug}' from PocketBase.")] private static partial void LogLoadFailed( ILogger logger, string slug, Exception exception); [Parameter] public string Slug { get; set; } = string.Empty; [Inject] private PocketBaseClient PocketBase { get; set; } = null!; [Inject] private ILogger Logger { get; set; } = null!; [CascadingParameter] private HttpContext? HttpContext { get; set; } private Page? _page; // The page body rendered from Markdown to HTML, ready to emit as a // MarkupString in the markup. private MarkupString Body => (MarkupString)Markdown.ToHtml(_page?.Body); protected override async Task OnParametersSetAsync() { try { var pages = await PocketBase.GetPagesAsync(); _page = pages.FirstOrDefault( p => string.Equals(p.Slug, Slug, StringComparison.OrdinalIgnoreCase)); } catch (HttpRequestException ex) { // Source unreachable -> treat as "not found" rather than a 500. The // 404 branch below serves the friendly /not-found page. LogLoadFailed(Logger, Slug, ex); _page = null; } // Unknown slug (or unreachable source) -> 404, so // UseStatusCodePagesWithReExecute serves the /not-found page instead of an // empty 200 response. if (_page is null && HttpContext is not null) { HttpContext.Response.StatusCode = StatusCodes.Status404NotFound; } } }