Files
law-api/app/Http/Controllers/api/JudicialPrecedentApiController.php
2026-07-04 17:05:50 +03:30

161 lines
5.3 KiB
PHP

<?php
namespace App\Http\Controllers\api;
use App\Http\Controllers\Controller;
use App\Models\JudicialPrecedent;
use App\Models\JudicialPrecedentCategory;
use App\Traits\BaseApiResponse;
use Illuminate\Http\Request;
class JudicialPrecedentApiController extends Controller
{
use BaseApiResponse;
public function categories()
{
$categories = JudicialPrecedentCategory::all()->map(function ($category) {
return [
'id' => $category->id,
'name' => $category->name,
];
});
return $this->success($categories, 'Success', 'Categories List');
}
public function index(Request $request)
{
$request->validate([
'category_id' => 'nullable|exists:judicial_precedent_categories,id',
'sort' => 'nullable|in:asc,desc',
'per_page' => 'nullable|integer|min:1|max:100',
]);
$query = JudicialPrecedent::query();
if ($request->filled('category_id')) {
$query->where('category_id', $request->category_id);
}
$sortOrder = $request->input('sort', 'desc');
$query->orderBy('ruling_date', $sortOrder);
$perPage = min(max((int) $request->input('per_page', 15), 10), 100);
$paginator = $query->paginate($perPage);
$items = collect($paginator->items())->map(function ($item) {
return $this->formatItem($item);
});
$responseData = [
'items' => $items,
'current_page' => $paginator->currentPage(),
'last_page' => $paginator->lastPage(),
'per_page' => $paginator->perPage(),
'total' => $paginator->total(),
];
return $this->success($responseData, 'Success', 'Judicial Precedents Fetched');
}
/**
* Search Judicial Precedents by Keyword
*/
public function search(Request $request)
{
$request->validate([
'search' => 'nullable|string',
'per_page' => 'nullable|integer|min:1|max:100',
]);
$query = JudicialPrecedent::query();
if ($request->filled('search')) {
$searchTerm = $request->input('search');
$query->where(function ($q) use ($searchTerm) {
$q->where('ruling_number', 'LIKE', "%{$searchTerm}%")
->orWhere('subject', 'LIKE', "%{$searchTerm}%")
->orWhere('full_text', 'LIKE', "%{$searchTerm}%");
});
}
$perPage = min(max((int) $request->input('per_page', 15), 10), 100);
$paginator = $query->orderBy('ruling_date', 'desc')->paginate($perPage);
$items = collect($paginator->items())->map(function ($item) {
return $this->formatItem($item);
});
$responseData = [
'items' => $items,
'current_page' => $paginator->currentPage(),
'last_page' => $paginator->lastPage(),
'per_page' => $paginator->perPage(),
'total' => $paginator->total(),
];
return $this->success($responseData, 'Success', 'Search Results Fetched');
}
public function pager($id)
{
$current = JudicialPrecedent::find($id);
if (!$current) {
return $this->failed([], [
'title' => 'خطا',
'message' => 'رأی وحدت رویه مورد نظر یافت نشد.'
], 404);
}
$previousItem = JudicialPrecedent::where(function ($query) use ($current) {
$query->where('ruling_date', '<', $current->ruling_date)
->orWhere(function ($subQuery) use ($current) {
$subQuery->where('ruling_date', '=', $current->ruling_date)
->where('id', '<', $current->id);
});
})
->orderBy('ruling_date', 'desc')
->orderBy('id', 'desc')
->first();
$nextItem = JudicialPrecedent::where(function ($query) use ($current) {
$query->where('ruling_date', '>', $current->ruling_date)
->orWhere(function ($subQuery) use ($current) {
$subQuery->where('ruling_date', '=', $current->ruling_date)
->where('id', '>', $current->id);
});
})
->orderBy('ruling_date', 'asc')
->orderBy('id', 'asc')
->first();
$results = array_values(array_filter([
$previousItem ? $this->formatItem($previousItem) : null,
$this->formatItem($current),
$nextItem ? $this->formatItem($nextItem) : null
]));
return $this->success($results, 'Success', 'Pager Window Details');
}
/**
* Helper method to format payload uniformly
*/
private function formatItem($item)
{
return [
'id' => $item->id,
'ruling_number' => $item->ruling_number,
'ruling_date' => $item->ruling_date,
'subject' => $item->subject,
'full_text' => $item->full_text,
'issuing_authority' => $item->issuing_authority,
'category_id' => $item->category_id,
'category_name' => optional($item->category)->name,
];
}
}