feat: update LetterRequestController and LetterRequestService to accept User parameter for improved access control; add letter request permissions in RolePermissionSeeder
This commit is contained in:
parent
1c901e9103
commit
aa50487bfc
@ -23,6 +23,7 @@ public function index(PaginatedRequest $request): Response
|
|||||||
{
|
{
|
||||||
return Inertia::render('admin/services/letter-requests/index', [
|
return Inertia::render('admin/services/letter-requests/index', [
|
||||||
'letterRequests' => $this->service->paginated(
|
'letterRequests' => $this->service->paginated(
|
||||||
|
$request->user(),
|
||||||
...$request->validatedWithDefaults(),
|
...$request->validatedWithDefaults(),
|
||||||
status: $request->validated('status'),
|
status: $request->validated('status'),
|
||||||
),
|
),
|
||||||
|
|||||||
@ -3,26 +3,25 @@
|
|||||||
namespace App\Services\Admin\Services;
|
namespace App\Services\Admin\Services;
|
||||||
|
|
||||||
use App\Enums\LetterStatus;
|
use App\Enums\LetterStatus;
|
||||||
|
use App\Enums\UserRole;
|
||||||
use App\Models\LetterRequest;
|
use App\Models\LetterRequest;
|
||||||
|
use App\Models\User;
|
||||||
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
|
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
|
||||||
use Illuminate\Http\UploadedFile;
|
use Illuminate\Http\UploadedFile;
|
||||||
|
|
||||||
class LetterRequestService
|
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()
|
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'])
|
->with(['user.profile', 'user.student.department', 'processor.profile'])
|
||||||
->when($search, fn ($q) => $q->where('letter_type', 'like', "%{$search}%")
|
->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('user', fn ($q) => $q->whereHas('profile', fn ($q) => $q->where('full_name', 'like', "%{$search}%"))
|
||||||
->orWhereHas('student', fn ($q) => $q->where('student_number', 'like', "%{$search}%"))))
|
->orWhereHas('student', fn ($q) => $q->where('student_number', 'like', "%{$search}%"))))
|
||||||
->when($status, fn ($q) => $q->where('status', $status))
|
->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()
|
->latest()
|
||||||
->paginate($perPage);
|
->paginate($perPage, ['id', 'user_id', 'letter_type', 'purpose', 'status', 'processed_by', 'submitted_at', 'completed_at']);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function create(array $data): LetterRequest
|
public function create(array $data): LetterRequest
|
||||||
@ -38,9 +37,10 @@ public function create(array $data): LetterRequest
|
|||||||
|
|
||||||
public function update(LetterRequest $letterRequest, array $data): LetterRequest
|
public function update(LetterRequest $letterRequest, array $data): LetterRequest
|
||||||
{
|
{
|
||||||
$letterRequest->letter_type = $data['letter_type'];
|
$letterRequest->update([
|
||||||
$letterRequest->purpose = $data['purpose'] ?? null;
|
'letter_type' => $data['letter_type'],
|
||||||
$letterRequest->update();
|
'purpose' => $data['purpose'] ?? null,
|
||||||
|
]);
|
||||||
|
|
||||||
return $letterRequest;
|
return $letterRequest;
|
||||||
}
|
}
|
||||||
@ -54,12 +54,13 @@ public function updateStatus(LetterRequest $letterRequest, ?string $status, ?Upl
|
|||||||
{
|
{
|
||||||
$status = $result ? LetterStatus::Completed->value : $status;
|
$status = $result ? LetterStatus::Completed->value : $status;
|
||||||
|
|
||||||
$letterRequest->status = $status;
|
$letterRequest->update([
|
||||||
$letterRequest->processed_by = $status !== LetterStatus::Submitted->value ? auth()->id() : null;
|
'status' => $status,
|
||||||
$letterRequest->completed_at = $status === LetterStatus::Completed->value
|
'processed_by' => $status !== LetterStatus::Submitted->value ? auth()->id() : null,
|
||||||
|
'completed_at' => $status === LetterStatus::Completed->value
|
||||||
? ($letterRequest->completed_at ?? now())
|
? ($letterRequest->completed_at ?? now())
|
||||||
: null;
|
: null,
|
||||||
$letterRequest->update();
|
]);
|
||||||
|
|
||||||
if ($result) {
|
if ($result) {
|
||||||
$letterRequest->addMedia($result)->toMediaCollection('letter_result');
|
$letterRequest->addMedia($result)->toMediaCollection('letter_result');
|
||||||
|
|||||||
@ -75,6 +75,10 @@ public function run(): void
|
|||||||
'view-attendances',
|
'view-attendances',
|
||||||
'create-attendances',
|
'create-attendances',
|
||||||
'delete-attendances',
|
'delete-attendances',
|
||||||
|
'view-letter-requests',
|
||||||
|
'create-letter-requests',
|
||||||
|
'update-letter-requests',
|
||||||
|
'delete-letter-requests',
|
||||||
...$feedbackSelfService,
|
...$feedbackSelfService,
|
||||||
],
|
],
|
||||||
'staff-admin' => [
|
'staff-admin' => [
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user