161 lines
5.3 KiB
PHP
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,
|
|
];
|
|
}
|
|
}
|