'xs', 1 => 'xs', 2 => 'xs', 3 => 'sm', 4 => 'sm', 5 => 'sm', 6 => 'md', ]; private static ?bool $hasLegacyIdColumn = null; public function __invoke(string $encoded, string $size, string $extension): RedirectResponse|Response { $artworkId = $this->decodeBase62($encoded); $sizeCode = (int) $size; if ($artworkId === null || $artworkId < 1) { return $this->notFound(); } $artwork = $this->resolveArtwork($artworkId); if ($artwork === null) { return $this->notFound(); } $targetUrl = $sizeCode === 7 ? $this->resolveOriginalUrl($artwork) : $artwork->thumbUrl(self::THUMB_SIZE_MAP[$sizeCode] ?? 'md'); if ($targetUrl === null || $targetUrl === '') { return $this->notFound(); } return redirect()->away($targetUrl, 301); } private function notFound(): Response { return response('', 404, [ 'Content-Type' => 'text/plain; charset=UTF-8', 'Cache-Control' => 'no-store', ]); } private function decodeBase62(string $value): ?int { if ($value === '') { return null; } $alphabet = array_flip(str_split(self::BASE62_CHARS)); $decoded = 0; foreach (str_split($value) as $character) { if (! array_key_exists($character, $alphabet)) { return null; } $decoded = ($decoded * 62) + $alphabet[$character]; } return $decoded; } private function resolveArtwork(int $artworkId): ?Artwork { return Artwork::query() ->select(['id', 'hash', 'thumb_ext', 'file_ext', 'file_path', 'is_public', 'is_approved', 'published_at']) ->where(function (Builder $query) use ($artworkId): void { $query->where('id', $artworkId); if ($this->hasLegacyIdColumn()) { $query->orWhere('legacy_id', $artworkId); } }) ->where('is_public', true) ->where('is_approved', true) ->whereNotNull('published_at') ->first(); } private function resolveOriginalUrl(Artwork $artwork): ?string { $cdn = rtrim((string) config('cdn.files_url', 'https://cdn.skinbase.org'), '/'); $filePath = trim((string) ($artwork->file_path ?? ''), '/'); $hash = strtolower((string) preg_replace('/[^a-f0-9]/i', '', (string) ($artwork->hash ?? ''))); $ext = ltrim((string) ($artwork->file_ext ?: $artwork->thumb_ext ?: 'webp'), '.'); if ($hash === '') { return $artwork->thumbUrl('xl') ?? $artwork->thumbUrl('lg') ?? $artwork->thumbUrl('md'); } if ($filePath !== '') { return $cdn . '/' . $filePath; } $prefix = trim((string) config('uploads.object_storage.prefix', 'artworks'), '/'); $firstDir = substr($hash, 0, 2); $secondDir = substr($hash, 2, 2); return sprintf('%s/%s/original/%s/%s/%s.%s', $cdn, $prefix, $firstDir, $secondDir, $hash, $ext); } private function hasLegacyIdColumn(): bool { if (self::$hasLegacyIdColumn === null) { self::$hasLegacyIdColumn = Schema::hasColumn('artworks', 'legacy_id'); } return self::$hasLegacyIdColumn; } }