115 lines
3.5 KiB
PHP
115 lines
3.5 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\MemeMedia;
|
|
use Illuminate\Http\Request;
|
|
use Inertia\Inertia;
|
|
use Inertia\Response;
|
|
|
|
class FrontMemeController extends Controller
|
|
{
|
|
public function index(Request $request): Response
|
|
{
|
|
return $this->getMemes($request->input('search'));
|
|
}
|
|
|
|
public function search(string $search): Response
|
|
{
|
|
// Convert + back to spaces for search
|
|
$searchTerm = str_replace('+', ' ', $search);
|
|
return $this->getMemes($searchTerm);
|
|
}
|
|
|
|
private function getMemes(?string $search = null): Response
|
|
{
|
|
$query = MemeMedia::query()
|
|
->where('is_enabled', true)
|
|
->orderBy('id', 'desc');
|
|
|
|
// Search functionality
|
|
if ($search) {
|
|
$query->where(function ($q) use ($search) {
|
|
$q->where('name', 'ilike', "%{$search}%")
|
|
->orWhere('description', 'ilike', "%{$search}%")
|
|
->orWhereJsonContains('keywords', $search)
|
|
->orWhereJsonContains('action_keywords', $search)
|
|
->orWhereJsonContains('emotion_keywords', $search)
|
|
->orWhereJsonContains('misc_keywords', $search);
|
|
});
|
|
}
|
|
|
|
$memes = $query->cursorPaginate(24);
|
|
|
|
// Get available types for filter
|
|
$types = MemeMedia::where('is_enabled', true)
|
|
->distinct()
|
|
->pluck('type')
|
|
->filter();
|
|
|
|
// Get popular keywords for filter
|
|
$popularKeywords = MemeMedia::where('is_enabled', true)
|
|
->get()
|
|
->pluck('keywords')
|
|
->flatten()
|
|
->countBy()
|
|
->sort()
|
|
->reverse()
|
|
->take(20)
|
|
->keys();
|
|
|
|
return Inertia::render('memes/index', [
|
|
'memes' => $memes,
|
|
'types' => $types,
|
|
'popularKeywords' => $popularKeywords,
|
|
'filters' => [
|
|
'search' => $search,
|
|
],
|
|
]);
|
|
}
|
|
|
|
public function show(string $slug): Response
|
|
{
|
|
$meme = MemeMedia::where('slug', $slug)
|
|
->where('is_enabled', true)
|
|
->firstOrFail();
|
|
|
|
// Get related memes based on similar keywords
|
|
$relatedMemes = MemeMedia::where('is_enabled', true)
|
|
->where('id', '!=', $meme->id)
|
|
->where(function ($query) use ($meme) {
|
|
if ($meme->keywords) {
|
|
foreach ($meme->keywords as $keyword) {
|
|
$query->orWhereJsonContains('keywords', $keyword)
|
|
->orWhereJsonContains('action_keywords', $keyword)
|
|
->orWhereJsonContains('emotion_keywords', $keyword)
|
|
->orWhereJsonContains('misc_keywords', $keyword);
|
|
}
|
|
}
|
|
})
|
|
->limit(6)
|
|
->get();
|
|
|
|
// If we have less than 6 related memes, fill up with random ones
|
|
if ($relatedMemes->count() < 6) {
|
|
$excludeIds = $relatedMemes->pluck('id')->push($meme->id)->toArray();
|
|
$needed = 6 - $relatedMemes->count();
|
|
|
|
$randomMemes = MemeMedia::where('is_enabled', true)
|
|
->whereNotIn('id', $excludeIds)
|
|
->inRandomOrder()
|
|
->limit($needed)
|
|
->get();
|
|
|
|
$relatedMemes = $relatedMemes->merge($randomMemes);
|
|
}
|
|
|
|
//dd($meme);
|
|
|
|
return Inertia::render('memes/show', [
|
|
'meme' => $meme,
|
|
'relatedMemes' => $relatedMemes,
|
|
]);
|
|
}
|
|
}
|