From a3b21d23e903e433f79d8c7b4688d0e7e6e267d4 Mon Sep 17 00:00:00 2001 From: br0kenpixel <23280129+br0kenpixel@users.noreply.github.com> Date: Sun, 2 Nov 2025 17:30:53 +0100 Subject: [PATCH] refactor: get new possible states from backend instead of computing them on frontend --- .../InternshipStatusController.php | 20 +++++++++++++ backend/routes/api.php | 1 + .../app/components/InternshipStatusEditor.vue | 29 ++++++++++++------- .../dashboard/admin/internships/edit/[id].vue | 2 +- frontend/app/types/internship_status.ts | 29 ------------------- 5 files changed, 40 insertions(+), 41 deletions(-) diff --git a/backend/app/Http/Controllers/InternshipStatusController.php b/backend/app/Http/Controllers/InternshipStatusController.php index a68f08f..3cee9dc 100644 --- a/backend/app/Http/Controllers/InternshipStatusController.php +++ b/backend/app/Http/Controllers/InternshipStatusController.php @@ -31,6 +31,26 @@ class InternshipStatusController extends Controller return response()->json($internship_statuses); } + public function get_next_states(int $id) { + $user = auth()->user(); + $internship = Internship::find($id); + + if(!$internship) { + return response()->json([ + 'message' => 'No such internship exists.' + ], 400); + } + + if ($user->role !== 'ADMIN' && $internship->user_id !== $user->id && $user->id !== $internship->contact) { + abort(403, 'Unauthorized'); + } + + $currentStatus = $this->currentInternshipStatus($internship); + $nextPossibleStatuses = $this->possibleNewStatuses($currentStatus->status, $user->role); + + return response()->json($nextPossibleStatuses); + } + /** * Display a listing of the resource. */ diff --git a/backend/routes/api.php b/backend/routes/api.php index e750141..ec0b164 100644 --- a/backend/routes/api.php +++ b/backend/routes/api.php @@ -34,6 +34,7 @@ Route::prefix('/internships')->group(function () { Route::get("/", [InternshipController::class, 'get'])->name("api.internships.get"); Route::put("/status", [InternshipStatusController::class, 'update'])->name("api.internships.status.update"); Route::get("/statuses", [InternshipStatusController::class, 'get'])->name("api.internships.get"); + Route::get("/next-statuses", [InternshipStatusController::class, 'get_next_states'])->name("api.internships.status.next.get"); Route::post("/basic", [InternshipController::class, 'update_basic'])->name("api.internships.update.basic"); }); diff --git a/frontend/app/components/InternshipStatusEditor.vue b/frontend/app/components/InternshipStatusEditor.vue index 9860666..fbaf858 100644 --- a/frontend/app/components/InternshipStatusEditor.vue +++ b/frontend/app/components/InternshipStatusEditor.vue @@ -1,6 +1,6 @@