fixed gallery from legacy into one
This commit is contained in:
181
app/Http/Controllers/BrowseGalleryController.php
Normal file
181
app/Http/Controllers/BrowseGalleryController.php
Normal file
@@ -0,0 +1,181 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Category;
|
||||
use App\Models\ContentType;
|
||||
use App\Services\ArtworkService;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Collection;
|
||||
|
||||
class BrowseGalleryController extends Controller
|
||||
{
|
||||
private const CONTENT_TYPE_SLUGS = ['photography', 'wallpapers', 'skins', 'other'];
|
||||
|
||||
public function __construct(private ArtworkService $artworks)
|
||||
{
|
||||
}
|
||||
|
||||
public function browse(Request $request)
|
||||
{
|
||||
$sort = (string) $request->query('sort', 'latest');
|
||||
$perPage = $this->resolvePerPage($request);
|
||||
|
||||
$artworks = $this->artworks->browsePublicArtworks($perPage, $sort);
|
||||
|
||||
$mainCategories = $this->mainCategories();
|
||||
|
||||
return view('gallery.index', [
|
||||
'gallery_type' => 'browse',
|
||||
'mainCategories' => $mainCategories,
|
||||
'subcategories' => $mainCategories,
|
||||
'contentType' => null,
|
||||
'category' => null,
|
||||
'artworks' => $artworks,
|
||||
'hero_title' => 'Browse Artworks',
|
||||
'hero_description' => 'List of all uploaded artworks across Skins, Wallpapers, Photography, and Other.',
|
||||
'breadcrumbs' => collect(),
|
||||
'page_title' => 'Browse Uploaded Artworks - Photography, Wallpapers and Skins at SkinBase',
|
||||
'page_meta_description' => "Browse Uploaded Photography, Wallpapers and Skins to one of the world's oldest online social community for artists and art enthusiasts.",
|
||||
'page_meta_keywords' => 'photography, wallpapers, skins, stock, browse, social, community, artist, picture, photo',
|
||||
'page_canonical' => url('/browse'),
|
||||
]);
|
||||
}
|
||||
|
||||
public function content(Request $request, string $contentTypeSlug, ?string $path = null)
|
||||
{
|
||||
$contentSlug = strtolower($contentTypeSlug);
|
||||
if (! in_array($contentSlug, self::CONTENT_TYPE_SLUGS, true)) {
|
||||
abort(404);
|
||||
}
|
||||
|
||||
$contentType = ContentType::where('slug', $contentSlug)->first();
|
||||
if (! $contentType) {
|
||||
abort(404);
|
||||
}
|
||||
|
||||
$sort = (string) $request->query('sort', 'latest');
|
||||
$perPage = $this->resolvePerPage($request);
|
||||
|
||||
$mainCategories = $this->mainCategories();
|
||||
$rootCategories = $contentType->rootCategories()->orderBy('sort_order')->orderBy('name')->get();
|
||||
|
||||
$normalizedPath = trim((string) $path, '/');
|
||||
if ($normalizedPath === '') {
|
||||
$artworks = $this->artworks->getArtworksByContentType($contentSlug, $perPage, $sort);
|
||||
|
||||
return view('gallery.index', [
|
||||
'gallery_type' => 'content-type',
|
||||
'mainCategories' => $mainCategories,
|
||||
'subcategories' => $rootCategories,
|
||||
'contentType' => $contentType,
|
||||
'category' => null,
|
||||
'artworks' => $artworks,
|
||||
'hero_title' => $contentType->name,
|
||||
'hero_description' => $contentType->description ?? ($contentType->name . ' artworks on Skinbase.'),
|
||||
'breadcrumbs' => collect([(object) ['name' => $contentType->name, 'url' => '/' . $contentSlug]]),
|
||||
'page_title' => $contentType->name,
|
||||
'page_meta_description' => $contentType->description ?? ($contentType->name . ' artworks on Skinbase'),
|
||||
'page_meta_keywords' => strtolower($contentType->slug) . ', skinbase, artworks, wallpapers, skins, photography',
|
||||
'page_canonical' => url('/' . $contentSlug),
|
||||
]);
|
||||
}
|
||||
|
||||
$segments = array_values(array_filter(explode('/', $normalizedPath)));
|
||||
$category = Category::findByPath($contentSlug, $segments);
|
||||
if (! $category) {
|
||||
abort(404);
|
||||
}
|
||||
|
||||
$artworks = $this->artworks->getArtworksByCategoryPath(array_merge([$contentSlug], $segments), $perPage, $sort);
|
||||
|
||||
$subcategories = $category->children()->orderBy('sort_order')->orderBy('name')->get();
|
||||
if ($subcategories->isEmpty()) {
|
||||
$subcategories = $rootCategories;
|
||||
}
|
||||
|
||||
$breadcrumbs = collect($category->breadcrumbs)
|
||||
->map(function (Category $crumb) {
|
||||
return (object) [
|
||||
'name' => $crumb->name,
|
||||
'url' => $crumb->url,
|
||||
];
|
||||
});
|
||||
|
||||
return view('gallery.index', [
|
||||
'gallery_type' => 'category',
|
||||
'mainCategories' => $mainCategories,
|
||||
'subcategories' => $subcategories,
|
||||
'contentType' => $contentType,
|
||||
'category' => $category,
|
||||
'artworks' => $artworks,
|
||||
'hero_title' => $category->name,
|
||||
'hero_description' => $category->description ?? ($contentType->name . ' artworks on Skinbase.'),
|
||||
'breadcrumbs' => $breadcrumbs,
|
||||
'page_title' => $category->name,
|
||||
'page_meta_description' => $category->description ?? ($contentType->name . ' artworks on Skinbase'),
|
||||
'page_meta_keywords' => strtolower($contentType->slug) . ', skinbase, artworks, wallpapers, skins, photography',
|
||||
'page_canonical' => url('/' . $contentSlug . '/' . strtolower($category->full_slug_path)),
|
||||
]);
|
||||
}
|
||||
|
||||
public function showArtwork(Request $request, string $contentTypeSlug, string $categoryPath, string $artwork)
|
||||
{
|
||||
return app(ArtworkController::class)->show(
|
||||
$request,
|
||||
strtolower($contentTypeSlug),
|
||||
trim($categoryPath, '/'),
|
||||
$artwork
|
||||
);
|
||||
}
|
||||
|
||||
public function legacyCategory(Request $request, ?string $group = null, ?string $slug = null, ?string $id = null)
|
||||
{
|
||||
if ($id !== null && ctype_digit((string) $id)) {
|
||||
$category = Category::with('contentType')->find((int) $id);
|
||||
if (! $category || ! $category->contentType) {
|
||||
abort(404);
|
||||
}
|
||||
|
||||
return redirect($category->url, 301);
|
||||
}
|
||||
|
||||
$contentSlug = strtolower((string) $group);
|
||||
if (! in_array($contentSlug, self::CONTENT_TYPE_SLUGS, true)) {
|
||||
abort(404);
|
||||
}
|
||||
|
||||
$target = '/' . $contentSlug;
|
||||
$normalizedSlug = trim((string) $slug, '/');
|
||||
if ($normalizedSlug !== '') {
|
||||
$target .= '/' . strtolower($normalizedSlug);
|
||||
}
|
||||
|
||||
if ($request->query()) {
|
||||
$target .= '?' . http_build_query($request->query());
|
||||
}
|
||||
|
||||
return redirect($target, 301);
|
||||
}
|
||||
|
||||
private function resolvePerPage(Request $request): int
|
||||
{
|
||||
$value = (int) $request->query('per_page', 40);
|
||||
|
||||
return max(12, min($value, 80));
|
||||
}
|
||||
|
||||
private function mainCategories(): Collection
|
||||
{
|
||||
return ContentType::orderBy('id')
|
||||
->get(['name', 'slug'])
|
||||
->map(function (ContentType $type) {
|
||||
return (object) [
|
||||
'id' => $type->id,
|
||||
'name' => $type->name,
|
||||
'slug' => $type->slug,
|
||||
'url' => '/' . strtolower($type->slug),
|
||||
];
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user