Added new api
This commit is contained in:
160
app/Http/Controllers/api/JudicialPrecedentApiController.php
Normal file
160
app/Http/Controllers/api/JudicialPrecedentApiController.php
Normal file
@@ -0,0 +1,160 @@
|
||||
<?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,
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user