@page "/" @page "/Gallery" @inject IDbContextFactory dbFactory @inject ITagService tagService @inject ISearchService searchService @inject IUserService userService @(Query is null ? "Gallery" : "Search Results") @foreach(var media in Media) { } @code { [Parameter] [SupplyParameterFromQuery(Name = "q")] public string? Query { get; set; } [Parameter] [SupplyParameterFromQuery] public bool Ingest { get; set; } = false; private Media[] Media; protected override void OnInitialized() => userService.ShowNsfwChanged += ShowNsfwChanged; protected override void OnParametersSet() => LoadMedia(); private void LoadMedia() { using var db = dbFactory.CreateDbContext(); IEnumerable media = db.Media .Include(m => m.Tags) .OrderByDescending(m => m.ObjectId) .ToArray(); if(Query is not null) media = searchService.Search(Query) .OrderByDescending(m => m.ObjectId); if(Ingest) media = media .AsEnumerable() .Where(m => m.IsIngest); // Filter both NSFW AND ingest images if we're not showing NSFW if(!userService.ShowNsfw) { var nsfwTags = tagService.TagsThatImply(HBContext.NsfwTag) .Select(td => td.ObjectId) .ToArray(); media = media .AsEnumerable() .Where(m => !m.Tags.Select(t => t.TagDefinitionId).Intersect(nsfwTags).Any()) .Where(m => !m.IsIngest); } Media = media.ToArray(); } private async void ShowNsfwChanged(object? sender, bool showNsfw) { await InvokeAsync(() => { LoadMedia(); StateHasChanged(); }); } }