refactor: unify artwork card rendering

This commit is contained in:
2026-03-17 14:49:20 +01:00
parent 78151aabfe
commit 980a15f66e
30 changed files with 1145 additions and 656 deletions

View File

@@ -11,6 +11,7 @@ use App\Services\ThumbnailPresenter;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;
use Illuminate\Pagination\AbstractPaginator;
use Illuminate\Pagination\AbstractCursorPaginator;
@@ -180,19 +181,25 @@ class BrowseGalleryController extends \App\Http\Controllers\Controller
abort(404);
}
$catSlug = $category->slug;
$categorySlugs = $this->categoryFilterSlugs($category);
$categoryFilter = collect($categorySlugs)
->map(fn (string $slug) => 'category = "' . addslashes($slug) . '"')
->implode(' OR ');
$artworks = Cache::remember(
"gallery.cat.{$catSlug}.{$sort}.{$page}",
'gallery.cat.' . md5($contentSlug . '|' . implode('|', $categorySlugs)) . ".{$sort}.{$page}",
$ttl,
fn () => Artwork::search('')->options([
'filter' => 'is_public = true AND is_approved = true AND category = "' . $catSlug . '"',
'filter' => 'is_public = true AND is_approved = true AND (' . $categoryFilter . ')',
'sort' => self::SORT_MAP[$sort] ?? ['created_at:desc'],
])->paginate($perPage)
);
$artworks->getCollection()->transform(fn ($a) => $this->presentArtwork($a));
$seo = $this->buildPaginationSeo($request, url('/' . $contentSlug . '/' . strtolower($category->full_slug_path)), $artworks);
$subcategories = $category->children()->orderBy('sort_order')->orderBy('name')->get();
$navigationCategory = $category->parent ?: $category;
$subcategories = $navigationCategory->children()->orderBy('sort_order')->orderBy('name')->get();
if ($subcategories->isEmpty()) {
$subcategories = $rootCategories;
}
@@ -209,6 +216,7 @@ class BrowseGalleryController extends \App\Http\Controllers\Controller
'gallery_type' => 'category',
'mainCategories' => $mainCategories,
'subcategories' => $subcategories,
'subcategory_parent' => $navigationCategory,
'contentType' => $contentType,
'category' => $category,
'artworks' => $artworks,
@@ -298,6 +306,8 @@ class BrowseGalleryController extends \App\Http\Controllers\Controller
return (object) [
'id' => $artwork->id,
'name' => $artwork->title,
'content_type_name' => $primaryCategory?->contentType?->name ?? '',
'content_type_slug' => $primaryCategory?->contentType?->slug ?? '',
'category_name' => $primaryCategory->name ?? '',
'category_slug' => $primaryCategory->slug ?? '',
'thumb_url' => $present['url'],
@@ -311,6 +321,35 @@ class BrowseGalleryController extends \App\Http\Controllers\Controller
];
}
/**
* Build the category slug filter set for a gallery page.
* Includes the current category and all descendant subcategories.
*
* @return array<int, string>
*/
private function categoryFilterSlugs(Category $category): array
{
$category->loadMissing('descendants');
$slugs = [];
$stack = [$category];
while ($stack !== []) {
/** @var Category $current */
$current = array_pop($stack);
if (! empty($current->slug)) {
$slugs[] = Str::lower($current->slug);
}
foreach ($current->children as $child) {
$child->loadMissing('descendants');
$stack[] = $child;
}
}
return array_values(array_unique($slugs));
}
private function resolvePerPage(Request $request): int
{
$limit = (int) $request->query('limit', 0);