From 03b1fcd7e7132dd8da8b9112c5ddebc4e3321510 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Tue, 25 Aug 2026 21:30:16 +0700 Subject: [PATCH] feat: standardize pagination method naming and signatures across services --- .../Academic/CourseRegistrationController.php | 2 +- .../Announcement/AnnouncementController.php | 2 +- .../Manage/Course/CourseClassController.php | 4 +- .../Admin/Manage/Course/CourseController.php | 2 +- .../Finance/TuitionInvoiceController.php | 2 +- .../Admin/Users/AdministratorController.php | 7 ++- .../Admin/Users/LecturerController.php | 11 ++--- .../Admin/Users/StudentController.php | 11 ++--- app/Services/Admin/FeedbackService.php | 2 +- .../Manage/Academic/AssignmentService.php | 2 +- .../Academic/CourseRegistrationService.php | 2 +- .../Admin/Manage/Academic/MaterialService.php | 2 +- .../Announcement/AnnouncementService.php | 2 +- .../Manage/Course/CourseClassService.php | 2 +- .../Admin/Manage/Course/CourseService.php | 4 +- .../Manage/Finance/TuitionInvoiceService.php | 2 +- .../Service/AcademicAdvisingLogService.php | 2 +- .../Manage/Service/LetterRequestService.php | 2 +- .../Admin/Master/AcademicTermService.php | 4 +- .../Admin/Master/DepartmentService.php | 4 +- .../Admin/Users/AdministratorService.php | 8 ++-- app/Services/Admin/Users/LecturerService.php | 8 ++-- app/Services/Admin/Users/StudentService.php | 8 ++-- docs/code-style.md | 47 ++++++++++++++++++- 24 files changed, 92 insertions(+), 50 deletions(-) diff --git a/app/Http/Controllers/Admin/Manage/Academic/CourseRegistrationController.php b/app/Http/Controllers/Admin/Manage/Academic/CourseRegistrationController.php index d31a7f2..7e76e8d 100644 --- a/app/Http/Controllers/Admin/Manage/Academic/CourseRegistrationController.php +++ b/app/Http/Controllers/Admin/Manage/Academic/CourseRegistrationController.php @@ -30,7 +30,7 @@ public function index(PaginatedRequest $request): Response return Inertia::render('admin/manage/course-registrations/index', [ 'registrations' => $this->service->paginated(...$request->validatedWithDefaults()), 'students' => $this->studentService->getAllForSelect(), - 'academicTerms' => $this->academicTermService->getAll(), + 'academicTerms' => $this->academicTermService->getAllForSelect(), 'courseClasses' => $this->courseClassService->getAllForSelect(), 'lecturers' => $this->lecturerService->getAllForSelect(), ]); diff --git a/app/Http/Controllers/Admin/Manage/Announcement/AnnouncementController.php b/app/Http/Controllers/Admin/Manage/Announcement/AnnouncementController.php index 6305d5e..484561a 100644 --- a/app/Http/Controllers/Admin/Manage/Announcement/AnnouncementController.php +++ b/app/Http/Controllers/Admin/Manage/Announcement/AnnouncementController.php @@ -23,7 +23,7 @@ public function index(PaginatedRequest $request): Response { return Inertia::render('admin/manage/announcements/index', [ 'announcements' => $this->service->paginated(...$request->validatedWithDefaults()), - 'departments' => $this->departmentService->getAll(), + 'departments' => $this->departmentService->getAllForSelect(), ]); } diff --git a/app/Http/Controllers/Admin/Manage/Course/CourseClassController.php b/app/Http/Controllers/Admin/Manage/Course/CourseClassController.php index d5cba7d..8fa7625 100644 --- a/app/Http/Controllers/Admin/Manage/Course/CourseClassController.php +++ b/app/Http/Controllers/Admin/Manage/Course/CourseClassController.php @@ -27,9 +27,9 @@ public function index(PaginatedRequest $request): Response { return Inertia::render('admin/manage/course-classes/index', [ 'courseClasses' => $this->service->paginated(...$request->validatedWithDefaults()), - 'courses' => $this->courseService->getAll(), + 'courses' => $this->courseService->getAllForSelect(), 'lecturers' => $this->lecturerService->getAllForSelect(), - 'academicTerms' => $this->academicTermService->getAll(), + 'academicTerms' => $this->academicTermService->getAllForSelect(), ]); } diff --git a/app/Http/Controllers/Admin/Manage/Course/CourseController.php b/app/Http/Controllers/Admin/Manage/Course/CourseController.php index 4a03f5b..4cdf0e9 100644 --- a/app/Http/Controllers/Admin/Manage/Course/CourseController.php +++ b/app/Http/Controllers/Admin/Manage/Course/CourseController.php @@ -23,7 +23,7 @@ public function index(PaginatedRequest $request): Response { return Inertia::render('admin/manage/courses/index', [ 'courses' => $this->service->paginated(...$request->validatedWithDefaults()), - 'departments' => $this->departmentService->getAll(), + 'departments' => $this->departmentService->getAllForSelect(), ]); } diff --git a/app/Http/Controllers/Admin/Manage/Finance/TuitionInvoiceController.php b/app/Http/Controllers/Admin/Manage/Finance/TuitionInvoiceController.php index 149bde5..a95dd8e 100644 --- a/app/Http/Controllers/Admin/Manage/Finance/TuitionInvoiceController.php +++ b/app/Http/Controllers/Admin/Manage/Finance/TuitionInvoiceController.php @@ -26,7 +26,7 @@ public function index(PaginatedRequest $request): Response return Inertia::render('admin/manage/tuition-invoices/index', [ 'invoices' => $this->service->paginated(...$request->validatedWithDefaults()), 'students' => $this->studentService->getAllForSelect(), - 'academicTerms' => $this->academicTermService->getAll(), + 'academicTerms' => $this->academicTermService->getAllForSelect(), ]); } diff --git a/app/Http/Controllers/Admin/Users/AdministratorController.php b/app/Http/Controllers/Admin/Users/AdministratorController.php index 0818188..9fb7a83 100644 --- a/app/Http/Controllers/Admin/Users/AdministratorController.php +++ b/app/Http/Controllers/Admin/Users/AdministratorController.php @@ -4,10 +4,10 @@ use App\Http\Controllers\Controller; use App\Http\Requests\Admin\Users\AdministratorRequest; +use App\Http\Requests\PaginatedRequest; use App\Models\User; use App\Services\Admin\Users\AdministratorService; use Illuminate\Http\RedirectResponse; -use Illuminate\Http\Request; use Inertia\Inertia; use Inertia\Response; use Spatie\Permission\Models\Role; @@ -18,11 +18,10 @@ public function __construct( private readonly AdministratorService $service, ) {} - public function index(Request $request): Response + public function index(PaginatedRequest $request): Response { return Inertia::render('admin/users/administrators/index', [ - 'administrators' => $this->service->getPaginated($request->only(['search', 'per_page'])), - 'filters' => $request->only(['search', 'per_page']), + 'administrators' => $this->service->paginated(...$request->validatedWithDefaults()), ]); } diff --git a/app/Http/Controllers/Admin/Users/LecturerController.php b/app/Http/Controllers/Admin/Users/LecturerController.php index 8c6c1a3..c4ed3e1 100644 --- a/app/Http/Controllers/Admin/Users/LecturerController.php +++ b/app/Http/Controllers/Admin/Users/LecturerController.php @@ -4,11 +4,11 @@ use App\Http\Controllers\Controller; use App\Http\Requests\Admin\Users\LecturerRequest; +use App\Http\Requests\PaginatedRequest; use App\Models\User; use App\Services\Admin\Master\DepartmentService; use App\Services\Admin\Users\LecturerService; use Illuminate\Http\RedirectResponse; -use Illuminate\Http\Request; use Inertia\Inertia; use Inertia\Response; @@ -19,18 +19,17 @@ public function __construct( private readonly DepartmentService $departmentService, ) {} - public function index(Request $request): Response + public function index(PaginatedRequest $request): Response { return Inertia::render('admin/users/lecturers/index', [ - 'lecturers' => $this->service->getPaginated($request->only(['search', 'per_page'])), - 'filters' => $request->only(['search', 'per_page']), + 'lecturers' => $this->service->paginated(...$request->validatedWithDefaults()), ]); } public function create(): Response { return Inertia::render('admin/users/lecturers/create', [ - 'departments' => $this->departmentService->getAll(), + 'departments' => $this->departmentService->getAllForSelect(), ]); } @@ -49,7 +48,7 @@ public function edit(User $user): Response return Inertia::render('admin/users/lecturers/edit', [ 'user' => $user, - 'departments' => $this->departmentService->getAll(), + 'departments' => $this->departmentService->getAllForSelect(), ]); } diff --git a/app/Http/Controllers/Admin/Users/StudentController.php b/app/Http/Controllers/Admin/Users/StudentController.php index a55b6e3..be335eb 100644 --- a/app/Http/Controllers/Admin/Users/StudentController.php +++ b/app/Http/Controllers/Admin/Users/StudentController.php @@ -4,12 +4,12 @@ use App\Http\Controllers\Controller; use App\Http\Requests\Admin\Users\StudentRequest; +use App\Http\Requests\PaginatedRequest; use App\Models\User; use App\Services\Admin\Master\DepartmentService; use App\Services\Admin\Users\LecturerService; use App\Services\Admin\Users\StudentService; use Illuminate\Http\RedirectResponse; -use Illuminate\Http\Request; use Inertia\Inertia; use Inertia\Response; @@ -21,18 +21,17 @@ public function __construct( private readonly LecturerService $lecturerService, ) {} - public function index(Request $request): Response + public function index(PaginatedRequest $request): Response { return Inertia::render('admin/users/students/index', [ - 'students' => $this->service->getPaginated($request->only(['search', 'per_page'])), - 'filters' => $request->only(['search', 'per_page']), + 'students' => $this->service->paginated(...$request->validatedWithDefaults()), ]); } public function create(): Response { return Inertia::render('admin/users/students/create', [ - 'departments' => $this->departmentService->getAll(), + 'departments' => $this->departmentService->getAllForSelect(), 'lecturers' => $this->lecturerService->getAllForSelect(), ]); } @@ -52,7 +51,7 @@ public function edit(User $user): Response return Inertia::render('admin/users/students/edit', [ 'user' => $user, - 'departments' => $this->departmentService->getAll(), + 'departments' => $this->departmentService->getAllForSelect(), 'lecturers' => $this->lecturerService->getAllForSelect(), ]); } diff --git a/app/Services/Admin/FeedbackService.php b/app/Services/Admin/FeedbackService.php index df89d5f..6cfea2e 100644 --- a/app/Services/Admin/FeedbackService.php +++ b/app/Services/Admin/FeedbackService.php @@ -40,7 +40,7 @@ public function __construct() $this->sanitizer = new HtmlSanitizer($config); } - public function paginated(User $user, int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc', array $filters = []): LengthAwarePaginator + public function paginated(User $user, int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc'): LengthAwarePaginator { return Feedback::query() ->where('user_id', $user->id) diff --git a/app/Services/Admin/Manage/Academic/AssignmentService.php b/app/Services/Admin/Manage/Academic/AssignmentService.php index 3e167c0..4cff790 100644 --- a/app/Services/Admin/Manage/Academic/AssignmentService.php +++ b/app/Services/Admin/Manage/Academic/AssignmentService.php @@ -8,7 +8,7 @@ class AssignmentService { - public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc', array $filters = []): LengthAwarePaginator + public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc'): LengthAwarePaginator { return Assignment::query() ->select(['id', 'course_class_id', 'title', 'description', 'deadline']) diff --git a/app/Services/Admin/Manage/Academic/CourseRegistrationService.php b/app/Services/Admin/Manage/Academic/CourseRegistrationService.php index 4a283d6..a68764f 100644 --- a/app/Services/Admin/Manage/Academic/CourseRegistrationService.php +++ b/app/Services/Admin/Manage/Academic/CourseRegistrationService.php @@ -9,7 +9,7 @@ class CourseRegistrationService { - public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc', array $filters = []): LengthAwarePaginator + public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc'): LengthAwarePaginator { return CourseRegistration::query() ->select(['id', 'student_id', 'academic_term_id', 'course_class_id', 'status', 'approved_by', 'created_at']) diff --git a/app/Services/Admin/Manage/Academic/MaterialService.php b/app/Services/Admin/Manage/Academic/MaterialService.php index 864ce14..0532ee9 100644 --- a/app/Services/Admin/Manage/Academic/MaterialService.php +++ b/app/Services/Admin/Manage/Academic/MaterialService.php @@ -8,7 +8,7 @@ class MaterialService { - public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc', array $filters = []): LengthAwarePaginator + public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc'): LengthAwarePaginator { return Material::query() ->select(['id', 'course_class_id', 'title', 'description', 'meeting_number']) diff --git a/app/Services/Admin/Manage/Announcement/AnnouncementService.php b/app/Services/Admin/Manage/Announcement/AnnouncementService.php index f8066be..a1941ab 100644 --- a/app/Services/Admin/Manage/Announcement/AnnouncementService.php +++ b/app/Services/Admin/Manage/Announcement/AnnouncementService.php @@ -7,7 +7,7 @@ class AnnouncementService { - public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc', array $filters = []): LengthAwarePaginator + public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc'): LengthAwarePaginator { return Announcement::query() ->select(['id', 'title', 'content', 'department_id', 'enrollment_year', 'created_by', 'created_at']) diff --git a/app/Services/Admin/Manage/Course/CourseClassService.php b/app/Services/Admin/Manage/Course/CourseClassService.php index d2ea48e..a90e172 100644 --- a/app/Services/Admin/Manage/Course/CourseClassService.php +++ b/app/Services/Admin/Manage/Course/CourseClassService.php @@ -15,7 +15,7 @@ public function getAllForSelect(): Collection ->get(); } - public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc', array $filters = []): LengthAwarePaginator + public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc'): LengthAwarePaginator { return CourseClass::query() ->select(['id', 'course_id', 'lecturer_id', 'academic_term_id', 'class_name', 'method']) diff --git a/app/Services/Admin/Manage/Course/CourseService.php b/app/Services/Admin/Manage/Course/CourseService.php index 1f8b60d..ef8cd20 100644 --- a/app/Services/Admin/Manage/Course/CourseService.php +++ b/app/Services/Admin/Manage/Course/CourseService.php @@ -8,12 +8,12 @@ class CourseService { - public function getAll(): Collection + public function getAllForSelect(): Collection { return Course::select(['id', 'code', 'name', 'department_id'])->get(); } - public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc', array $filters = []): LengthAwarePaginator + public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc'): LengthAwarePaginator { return Course::query() ->select(['id', 'code', 'name', 'credits', 'department_id', 'semester_number']) diff --git a/app/Services/Admin/Manage/Finance/TuitionInvoiceService.php b/app/Services/Admin/Manage/Finance/TuitionInvoiceService.php index 9a172c3..7979729 100644 --- a/app/Services/Admin/Manage/Finance/TuitionInvoiceService.php +++ b/app/Services/Admin/Manage/Finance/TuitionInvoiceService.php @@ -7,7 +7,7 @@ class TuitionInvoiceService { - public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc', array $filters = []): LengthAwarePaginator + public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc'): LengthAwarePaginator { return TuitionInvoice::query() ->select(['id', 'student_id', 'academic_term_id', 'amount_due', 'due_date']) diff --git a/app/Services/Admin/Manage/Service/AcademicAdvisingLogService.php b/app/Services/Admin/Manage/Service/AcademicAdvisingLogService.php index d33153d..d0cee8e 100644 --- a/app/Services/Admin/Manage/Service/AcademicAdvisingLogService.php +++ b/app/Services/Admin/Manage/Service/AcademicAdvisingLogService.php @@ -7,7 +7,7 @@ class AcademicAdvisingLogService { - public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc', array $filters = []): LengthAwarePaginator + public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc'): LengthAwarePaginator { return AcademicAdvisingLog::query() ->select(['id', 'student_id', 'lecturer_id', 'topic', 'notes', 'session_date', 'created_at']) diff --git a/app/Services/Admin/Manage/Service/LetterRequestService.php b/app/Services/Admin/Manage/Service/LetterRequestService.php index f08baf1..c556957 100644 --- a/app/Services/Admin/Manage/Service/LetterRequestService.php +++ b/app/Services/Admin/Manage/Service/LetterRequestService.php @@ -9,7 +9,7 @@ class LetterRequestService { - public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc', array $filters = []): LengthAwarePaginator + public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc'): LengthAwarePaginator { return LetterRequest::query() ->select(['id', 'student_id', 'letter_type', 'purpose', 'status', 'processed_by', 'submitted_at', 'completed_at']) diff --git a/app/Services/Admin/Master/AcademicTermService.php b/app/Services/Admin/Master/AcademicTermService.php index f01a134..6e9e911 100644 --- a/app/Services/Admin/Master/AcademicTermService.php +++ b/app/Services/Admin/Master/AcademicTermService.php @@ -8,12 +8,12 @@ class AcademicTermService { - public function getAll(array $filters = []): Collection + public function getAllForSelect(): Collection { return AcademicTerm::select(['id', 'name', 'semester', 'start_date', 'end_date', 'is_active'])->latest()->get(); } - public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc', array $filters = []): LengthAwarePaginator + public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc'): LengthAwarePaginator { return AcademicTerm::query() ->select(['id', 'name', 'semester', 'start_date', 'end_date', 'is_active']) diff --git a/app/Services/Admin/Master/DepartmentService.php b/app/Services/Admin/Master/DepartmentService.php index e33a389..5676801 100644 --- a/app/Services/Admin/Master/DepartmentService.php +++ b/app/Services/Admin/Master/DepartmentService.php @@ -8,12 +8,12 @@ class DepartmentService { - public function getAll(): Collection + public function getAllForSelect(): Collection { return Department::select(['id', 'code', 'name'])->get(); } - public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc', array $filters = []): LengthAwarePaginator + public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc'): LengthAwarePaginator { return Department::query() ->select(['id', 'code', 'name', 'degree_level']) diff --git a/app/Services/Admin/Users/AdministratorService.php b/app/Services/Admin/Users/AdministratorService.php index 8745c40..6e3520f 100644 --- a/app/Services/Admin/Users/AdministratorService.php +++ b/app/Services/Admin/Users/AdministratorService.php @@ -9,17 +9,17 @@ class AdministratorService { - public function getPaginated(array $filters = []): LengthAwarePaginator + public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc'): LengthAwarePaginator { return User::with(['profile', 'roles']) ->whereHas('roles', fn ($q) => $q->whereIn('name', ['staff-admin', 'staff-keuangan'])) - ->when($filters['search'] ?? null, fn ($q, $search) => $q->where(function ($query) use ($search) { + ->when($search, fn ($q) => $q->where(function ($query) use ($search) { $query->where('username', 'like', "%{$search}%") ->orWhere('email', 'like', "%{$search}%") ->orWhereHas('profile', fn ($q) => $q->where('full_name', 'like', "%{$search}%")); })) - ->latest() - ->paginate($filters['per_page'] ?? 25); + ->orderBy($sort, $direction) + ->paginate($perPage); } public function create(array $data): User diff --git a/app/Services/Admin/Users/LecturerService.php b/app/Services/Admin/Users/LecturerService.php index 8add062..9fceeb0 100644 --- a/app/Services/Admin/Users/LecturerService.php +++ b/app/Services/Admin/Users/LecturerService.php @@ -16,18 +16,18 @@ public function getAllForSelect(): Collection return Lecturer::with('user.profile')->get(); } - public function getPaginated(array $filters = []): LengthAwarePaginator + public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc'): LengthAwarePaginator { return User::with(['profile', 'lecturer.department']) ->whereHas('roles', fn ($q) => $q->where('name', 'dosen')) - ->when($filters['search'] ?? null, fn ($q, $search) => $q->where(function ($query) use ($search) { + ->when($search, fn ($q) => $q->where(function ($query) use ($search) { $query->where('username', 'like', "%{$search}%") ->orWhere('email', 'like', "%{$search}%") ->orWhereHas('profile', fn ($q) => $q->where('full_name', 'like', "%{$search}%")) ->orWhereHas('lecturer', fn ($q) => $q->where('lecturer_number', 'like', "%{$search}%")); })) - ->latest() - ->paginate($filters['per_page'] ?? 25); + ->orderBy($sort, $direction) + ->paginate($perPage); } public function create(array $data): User diff --git a/app/Services/Admin/Users/StudentService.php b/app/Services/Admin/Users/StudentService.php index 9e4923b..f3861d8 100644 --- a/app/Services/Admin/Users/StudentService.php +++ b/app/Services/Admin/Users/StudentService.php @@ -16,18 +16,18 @@ public function getAllForSelect(): Collection return Student::with(['user.profile', 'department'])->get(); } - public function getPaginated(array $filters = []): LengthAwarePaginator + public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc'): LengthAwarePaginator { return User::with(['profile', 'student.department']) ->whereHas('roles', fn ($q) => $q->where('name', 'mahasiswa')) - ->when($filters['search'] ?? null, fn ($q, $search) => $q->where(function ($query) use ($search) { + ->when($search, fn ($q) => $q->where(function ($query) use ($search) { $query->where('username', 'like', "%{$search}%") ->orWhere('email', 'like', "%{$search}%") ->orWhereHas('profile', fn ($q) => $q->where('full_name', 'like', "%{$search}%")) ->orWhereHas('student', fn ($q) => $q->where('student_number', 'like', "%{$search}%")); })) - ->latest() - ->paginate($filters['per_page'] ?? 25); + ->orderBy($sort, $direction) + ->paginate($perPage); } public function create(array $data): User diff --git a/docs/code-style.md b/docs/code-style.md index c932836..b45dfe5 100644 --- a/docs/code-style.md +++ b/docs/code-style.md @@ -163,7 +163,52 @@ ### 4.1 Sub-namespace di dalam `Admin\Manage` --- -## 5. Wayfinder ✅ +## 5. Service ✅ + +**Method listing berpaginasi wajib bernama `paginated()`**, bukan +`getPaginated()` atau nama lain. Signature-nya seragam di seluruh Service +(kecuali ada parameter domain tambahan di depan, seperti `User $user` di +`FeedbackService`): + +```php +public function paginated(int $perPage = 25, string $search = '', string $sort = 'created_at', string $direction = 'desc'): LengthAwarePaginator +``` + +Jangan tambahkan parameter `array $filters = []` kalau tidak benar-benar +dipakai di dalam method — `PaginatedRequest::validatedWithDefaults()` cuma +menghasilkan `perPage`/`search`/`sort`/`direction`, jadi parameter `$filters` +di banyak Service sebelumnya selalu kosong dan tidak pernah terisi oleh +controller manapun. + +Controller yang memanggilnya selalu pakai `PaginatedRequest` + spread: + +```php +'items' => $this->service->paginated(...$request->validatedWithDefaults()), +``` + +**Method yang mengembalikan daftar penuh tanpa paginasi** dibedakan sesuai +kegunaannya: + +- **`getAllForSelect()`** — dipakai kalau hasilnya untuk mengisi dropdown + `