56 lines
No EOL
1.6 KiB
PHP
56 lines
No EOL
1.6 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Resources\PostResource;
|
|
use App\Services\SearchService;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
|
|
class SearchController extends Controller
|
|
{
|
|
public function __construct(
|
|
protected SearchService $searchService
|
|
) {}
|
|
|
|
public function posts(Request $request): JsonResponse
|
|
{
|
|
$request->validate([
|
|
'q' => 'required|string|min:2',
|
|
'category_id' => 'nullable|exists:categories,id',
|
|
'author_id' => 'nullable|exists:users,id',
|
|
'per_page' => 'nullable|integer|min:1|max:100',
|
|
]);
|
|
|
|
$perPage = $request->input('per_page', 10);
|
|
|
|
$results = $this->searchService->searchPosts(
|
|
$request->input('q'),
|
|
$request->only(['category_id', 'author_id']),
|
|
$perPage
|
|
);
|
|
|
|
return response()->json([
|
|
'data' => PostResource::collection($results),
|
|
'pagination' => [
|
|
'total' => $results->total(),
|
|
'per_page' => $results->perPage(),
|
|
'current_page' => $results->currentPage(),
|
|
'last_page' => $results->lastPage(),
|
|
],
|
|
]);
|
|
}
|
|
|
|
public function relatedPosts(Request $request, int $postId): JsonResponse
|
|
{
|
|
$post = Post::findOrFail($postId);
|
|
$relatedPosts = $this->searchService->getRelatedPosts($post);
|
|
|
|
return response()->json([
|
|
'data' => PostResource::collection($relatedPosts),
|
|
]);
|
|
}
|
|
}
|