feat: moderation
CI / 🧪 Tests Laravel (push) Successful in 2m11s
CI / 🐳 Build & Push Image (push) Successful in 40s

This commit is contained in:
2026-08-12 09:46:28 +02:00
parent df4f523089
commit eef021fc1f
17 changed files with 593 additions and 1 deletions
+68
View File
@@ -0,0 +1,68 @@
<?php
namespace App\Http\Controllers;
use App\Enums\MealPostVisibility;
use App\Http\Requests\SearchRequest;
use App\Http\Resources\MealPostsResource;
use App\Http\Resources\SearchUserResource;
use App\Models\MealPosts;
use App\Models\User;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
class SearchController extends Controller
{
public function __invoke(SearchRequest $request): AnonymousResourceCollection
{
$query = (string) $request->validated('q');
$perPage = (int) ($request->validated('per_page') ?? 20);
if ($request->validated('type') === 'users') {
$users = User::query()
->whereKeyNot($request->user()->getKey())
->whereNull('suspended_at')
->withoutBlockingRelationshipWith($request->user())
->where(function (Builder $builder) use ($query): void {
$builder
->whereLike('name', "%{$query}%", caseSensitive: false)
->orWhereLike('bio', "%{$query}%", caseSensitive: false);
})
->orderByRaw('CASE WHEN LOWER(name) = LOWER(?) THEN 0 WHEN LOWER(name) LIKE LOWER(?) THEN 1 ELSE 2 END', [
$query,
"{$query}%",
])
->orderBy('name')
->paginate($perPage)
->withQueryString();
return SearchUserResource::collection($users);
}
$meals = MealPosts::query()
->where('visibility', MealPostVisibility::Public)
->whereNull('hidden_at')
->whereHas(
'user',
fn (Builder $builder): Builder => $builder
->whereNull('suspended_at')
->withoutBlockingRelationshipWith($request->user())
)
->where(function (Builder $builder) use ($query): void {
$builder
->whereLike('title', "%{$query}%", caseSensitive: false)
->orWhereLike('caption', "%{$query}%", caseSensitive: false)
->orWhereHas(
'ingredients',
fn (Builder $ingredientQuery): Builder => $ingredientQuery
->whereLike('ingredient', "%{$query}%", caseSensitive: false)
);
})
->with('user:id,name,avatar_url,account_verified_at')
->latest('eaten_at')
->paginate($perPage)
->withQueryString();
return MealPostsResource::collection($meals);
}
}