From b917c53a592e75adfb116d5d3f54ca597a4bd46f Mon Sep 17 00:00:00 2001 From: br0kenpixel <23280129+br0kenpixel@users.noreply.github.com> Date: Thu, 6 Nov 2025 10:11:34 +0100 Subject: [PATCH] fix: restrict `DEFENDED` and `NOT_DEFENDED` status for admins based on report confirmation --- .../InternshipStatusController.php | 32 ++++++++++++------- .../app/components/InternshipStatusEditor.vue | 3 ++ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/backend/app/Http/Controllers/InternshipStatusController.php b/backend/app/Http/Controllers/InternshipStatusController.php index 2621faa..f02784b 100644 --- a/backend/app/Http/Controllers/InternshipStatusController.php +++ b/backend/app/Http/Controllers/InternshipStatusController.php @@ -9,11 +9,12 @@ use Illuminate\Http\Request; class InternshipStatusController extends Controller { - public function get(int $id) { + public function get(int $id) + { $user = auth()->user(); $internship_statuses = InternshipStatus::whereInternshipId($id)->orderByDesc('changed')->get()->makeHidden(['created_at', 'updated_at', 'id']); - if(!$internship_statuses) { + if (!$internship_statuses) { return response()->json([ 'message' => 'No such internship exists.' ], 400); @@ -31,11 +32,12 @@ class InternshipStatusController extends Controller return response()->json($internship_statuses); } - public function get_next_states(int $id) { + public function get_next_states(int $id) + { $user = auth()->user(); $internship = Internship::find($id); - if(!$internship) { + if (!$internship) { return response()->json([ 'message' => 'No such internship exists.' ], 400); @@ -46,7 +48,7 @@ class InternshipStatusController extends Controller } $currentStatus = $this->currentInternshipStatus($internship); - $nextPossibleStatuses = $this->possibleNewStatuses($currentStatus->status, $user->role); + $nextPossibleStatuses = $this->possibleNewStatuses($currentStatus->status, $user->role, $internship->report_confirmed); return response()->json($nextPossibleStatuses); } @@ -99,7 +101,7 @@ class InternshipStatusController extends Controller $user = auth()->user(); $internship = Internship::find($id); - if(!$internship) { + if (!$internship) { return response()->json([ 'message' => 'No such internship exists.' ], 400); @@ -110,7 +112,7 @@ class InternshipStatusController extends Controller } $internshipStatus = $this->currentInternshipStatus($internship); - $newStatusValidator = 'in:' . implode(',', $this->possibleNewStatuses($internshipStatus->status, $user->role)); + $newStatusValidator = 'in:' . implode(',', $this->possibleNewStatuses($internshipStatus->status, $user->role, $internship->report_confirmed)); $request->validate([ 'status' => ['required', 'string', 'uppercase', $newStatusValidator], @@ -136,8 +138,10 @@ class InternshipStatusController extends Controller // } - private function possibleNewStatuses(string $current_status, string $userRole) { - if($userRole === "STUDENT") return []; + private function possibleNewStatuses(string $current_status, string $userRole, bool $report_confirmed) + { + if ($userRole === "STUDENT") + return []; switch ($current_status) { case 'SUBMITTED': @@ -146,7 +150,12 @@ class InternshipStatusController extends Controller if ($userRole === 'EMPLOYER') { return ['DENIED']; } - return ['SUBMITTED', 'DENIED', 'DEFENDED', 'NOT_DEFENDED']; + + if ($report_confirmed) { + return ['SUBMITTED', 'DENIED', 'DEFENDED', 'NOT_DEFENDED']; + } + + return ['SUBMITTED', 'DENIED']; case 'DENIED': if ($userRole === 'EMPLOYER') { return ['CONFIRMED']; @@ -160,7 +169,8 @@ class InternshipStatusController extends Controller } } - private function currentInternshipStatus(Internship $internship) { + private function currentInternshipStatus(Internship $internship) + { return InternshipStatus::whereInternshipId($internship->id)->orderByDesc('changed')->firstOrFail(); } } diff --git a/frontend/app/components/InternshipStatusEditor.vue b/frontend/app/components/InternshipStatusEditor.vue index 20d06e2..2d594fd 100644 --- a/frontend/app/components/InternshipStatusEditor.vue +++ b/frontend/app/components/InternshipStatusEditor.vue @@ -67,6 +67,9 @@ async function submit() { + + +