This commit is contained in:
ct
2025-07-15 02:28:22 +08:00
parent 6838c542f5
commit d245f5f77c
5 changed files with 289 additions and 25 deletions

View File

@@ -55,4 +55,83 @@ public function background(Request $request)
],
]);
}
public function searchMemes(Request $request)
{
$query = $request->input('query', '');
$limit = $request->input('limit', 30);
if (empty($query)) {
// Return random memes if no search query
$memes = MemeMedia::where('type', 'video')->where('sub_type', 'overlay')->take($limit)->inRandomOrder()->get();
} else {
// PostgreSQL full-text search with ranking
$memes = MemeMedia::where('type', 'video')
->where('sub_type', 'overlay')
->where(function ($q) use ($query) {
// Search in name and description using ILIKE for partial matches
$q->where('name', 'ILIKE', "%{$query}%")
->orWhere('description', 'ILIKE', "%{$query}%")
// Search in JSON arrays using PostgreSQL JSON operators
->orWhereRaw("keywords::text ILIKE ?", ["%{$query}%"])
->orWhereRaw("action_keywords::text ILIKE ?", ["%{$query}%"])
->orWhereRaw("emotion_keywords::text ILIKE ?", ["%{$query}%"])
->orWhereRaw("misc_keywords::text ILIKE ?", ["%{$query}%"]);
})
->orderByRaw("
CASE
WHEN name ILIKE ? THEN 1
WHEN description ILIKE ? THEN 2
WHEN keywords::text ILIKE ? THEN 3
WHEN action_keywords::text ILIKE ? THEN 4
WHEN emotion_keywords::text ILIKE ? THEN 5
WHEN misc_keywords::text ILIKE ? THEN 6
ELSE 7
END, name ASC
", ["%{$query}%", "%{$query}%", "%{$query}%", "%{$query}%", "%{$query}%", "%{$query}%"])
->take($limit)
->get();
}
return response()->json([
'success' => [
'data' => [
'memes' => $memes,
'query' => $query,
],
],
]);
}
public function searchBackgrounds(Request $request)
{
$query = $request->input('query', '');
$limit = $request->input('limit', 30);
if (empty($query)) {
// Return random backgrounds if no search query
$backgrounds = BackgroundMedia::where('status', 'completed')->take($limit)->inRandomOrder()->get();
} else {
// Search in prompt field using ILIKE for partial matches
$backgrounds = BackgroundMedia::where('status', 'completed')
->where('prompt', 'ILIKE', "%{$query}%")
->orderByRaw("
CASE
WHEN prompt ILIKE ? THEN 1
ELSE 2
END, prompt ASC
", ["%{$query}%"])
->take($limit)
->get();
}
return response()->json([
'success' => [
'data' => [
'backgrounds' => $backgrounds,
'query' => $query,
],
],
]);
}
}