feat: update LetterRequestController and LetterRequestService to accept User parameter for improved access control; add letter request permissions in RolePermissionSeeder

This commit is contained in:
Yoga Pangestu 2026-09-03 13:58:04 +07:00
parent 1c901e9103
commit aa50487bfc
3 changed files with 21 additions and 15 deletions

View File

@ -23,6 +23,7 @@ public function index(PaginatedRequest $request): Response
{
return Inertia::render('admin/services/letter-requests/index', [
'letterRequests' => $this->service->paginated(
$request->user(),
...$request->validatedWithDefaults(),
status: $request->validated('status'),
),

View File

@ -3,26 +3,25 @@
namespace App\Services\Admin\Services;
use App\Enums\LetterStatus;
use App\Enums\UserRole;
use App\Models\LetterRequest;
use App\Models\User;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Http\UploadedFile;
class LetterRequestService
{
public function paginated(int $perPage = 25, string $search = '', ?string $status = null): LengthAwarePaginator
public function paginated(User $user, int $perPage = 25, string $search = '', ?string $status = null): LengthAwarePaginator
{
$user = auth()->user();
return LetterRequest::query()
->select(['id', 'user_id', 'letter_type', 'purpose', 'status', 'processed_by', 'submitted_at', 'completed_at'])
->with(['user.profile', 'user.student.department', 'processor.profile'])
->when($search, fn ($q) => $q->where('letter_type', 'like', "%{$search}%")
->orWhereHas('user', fn ($q) => $q->whereHas('profile', fn ($q) => $q->where('full_name', 'like', "%{$search}%"))
->orWhereHas('student', fn ($q) => $q->where('student_number', 'like', "%{$search}%"))))
->when($status, fn ($q) => $q->where('status', $status))
->when($user->hasRole('mahasiswa'), fn ($q) => $q->where('user_id', $user->id))
->when($user->hasRole(UserRole::Mahasiswa->value) || $user->hasRole(UserRole::Dosen->value), fn ($q) => $q->where('user_id', $user->id))
->latest()
->paginate($perPage);
->paginate($perPage, ['id', 'user_id', 'letter_type', 'purpose', 'status', 'processed_by', 'submitted_at', 'completed_at']);
}
public function create(array $data): LetterRequest
@ -38,9 +37,10 @@ public function create(array $data): LetterRequest
public function update(LetterRequest $letterRequest, array $data): LetterRequest
{
$letterRequest->letter_type = $data['letter_type'];
$letterRequest->purpose = $data['purpose'] ?? null;
$letterRequest->update();
$letterRequest->update([
'letter_type' => $data['letter_type'],
'purpose' => $data['purpose'] ?? null,
]);
return $letterRequest;
}
@ -54,12 +54,13 @@ public function updateStatus(LetterRequest $letterRequest, ?string $status, ?Upl
{
$status = $result ? LetterStatus::Completed->value : $status;
$letterRequest->status = $status;
$letterRequest->processed_by = $status !== LetterStatus::Submitted->value ? auth()->id() : null;
$letterRequest->completed_at = $status === LetterStatus::Completed->value
? ($letterRequest->completed_at ?? now())
: null;
$letterRequest->update();
$letterRequest->update([
'status' => $status,
'processed_by' => $status !== LetterStatus::Submitted->value ? auth()->id() : null,
'completed_at' => $status === LetterStatus::Completed->value
? ($letterRequest->completed_at ?? now())
: null,
]);
if ($result) {
$letterRequest->addMedia($result)->toMediaCollection('letter_result');

View File

@ -75,6 +75,10 @@ public function run(): void
'view-attendances',
'create-attendances',
'delete-attendances',
'view-letter-requests',
'create-letter-requests',
'update-letter-requests',
'delete-letter-requests',
...$feedbackSelfService,
],
'staff-admin' => [