feat: moderation
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user