Update
This commit is contained in:
51
app/Console/Commands/PopulateMemeMediaSlugs.php
Normal file
51
app/Console/Commands/PopulateMemeMediaSlugs.php
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Models\MemeMedia;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class PopulateMemeMediaSlugs extends Command
|
||||
{
|
||||
protected $signature = 'memes:populate-slugs';
|
||||
|
||||
protected $description = 'Populate slug field for existing MemeMedia records';
|
||||
|
||||
public function handle()
|
||||
{
|
||||
$this->info('Starting to populate MemeMedia slugs...');
|
||||
|
||||
$memes = MemeMedia::whereNull('slug')->get();
|
||||
|
||||
if ($memes->isEmpty()) {
|
||||
$this->info('No memes found without slugs.');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$this->info("Found {$memes->count()} memes without slugs.");
|
||||
|
||||
$bar = $this->output->createProgressBar($memes->count());
|
||||
$bar->start();
|
||||
|
||||
foreach ($memes as $meme) {
|
||||
$baseSlug = Str::slug($meme->name);
|
||||
$slug = $baseSlug;
|
||||
$counter = 1;
|
||||
|
||||
// Ensure slug is unique
|
||||
while (MemeMedia::where('slug', $slug)->exists()) {
|
||||
$slug = $baseSlug.'-'.$counter;
|
||||
$counter++;
|
||||
}
|
||||
|
||||
$meme->update(['slug' => $slug]);
|
||||
$bar->advance();
|
||||
}
|
||||
|
||||
$bar->finish();
|
||||
$this->newLine();
|
||||
$this->info('Successfully populated all MemeMedia slugs!');
|
||||
}
|
||||
}
|
||||
98
app/Http/Controllers/FrontMemeController.php
Normal file
98
app/Http/Controllers/FrontMemeController.php
Normal file
@@ -0,0 +1,98 @@
|
||||
<?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('created_at', '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->paginate(12);
|
||||
|
||||
// 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();
|
||||
|
||||
return Inertia::render('memes/show', [
|
||||
'meme' => $meme,
|
||||
'relatedMemes' => $relatedMemes,
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -53,6 +53,7 @@ class MemeMedia extends Model
|
||||
'sub_type',
|
||||
'original_id',
|
||||
'name',
|
||||
'slug',
|
||||
'description',
|
||||
'keywords',
|
||||
'group',
|
||||
|
||||
Reference in New Issue
Block a user