69 lines
2.6 KiB
PHP
69 lines
2.6 KiB
PHP
<?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);
|
|
}
|
|
}
|