From 586faaf1d5b595b26daad87cdc9162e9e4b294a6 Mon Sep 17 00:00:00 2001 From: br0kenpixel <23280129+br0kenpixel@users.noreply.github.com> Date: Sat, 29 Nov 2025 20:08:01 +0100 Subject: [PATCH] feat: add external API for updating internship status to `DEFENDED` --- .../Controllers/ExternalApiController.php | 51 ++++++++++++++++++- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/backend/app/Http/Controllers/ExternalApiController.php b/backend/app/Http/Controllers/ExternalApiController.php index efc0f4d..2c5714c 100644 --- a/backend/app/Http/Controllers/ExternalApiController.php +++ b/backend/app/Http/Controllers/ExternalApiController.php @@ -2,9 +2,14 @@ namespace App\Http\Controllers; +use App\Enums\InternshipStatus; +use App\Mail\InternshipStatusUpdated; +use App\Models\Internship; +use App\Models\InternshipStatusData; use App\Models\User; use Illuminate\Http\Request; use Laravel\Sanctum\Sanctum; +use Mail; class ExternalApiController extends Controller { @@ -48,8 +53,50 @@ class ExternalApiController extends Controller return response()->noContent(); } - public function update_internship_status(int $id) + public function update_internship_status(Request $request, $id) { - // TODO: Implement in SCRUM-65 + $user = $request->user(); + $internship = Internship::find($id); + + if (!$internship) { + return response()->json([ + 'message' => 'No such internship exists.' + ], 400); + } + + $currentStatus = $internship->status->status; + + $request->validate([ + 'status' => ['required', 'string', 'uppercase', 'in:DEFENDED,NOT_DEFENDED'], + 'note' => ['required', 'string', 'min:1'] + ]); + + if ($currentStatus !== InternshipStatus::CONFIRMED_BY_ADMIN) { + return response()->json([ + "error" => "Expected current status to be 'CONFIRMED_BY_ADMIN', but it was '$currentStatus->value' instead", + ], 422); + } + + $newStatus = InternshipStatusData::make([ + 'internship_id' => $id, + 'status' => $request->status, + 'note' => $request->note, + 'changed' => now(), + 'modified_by' => $user->id, + ]); + + Mail::to($internship->student) + ->sendNow(new InternshipStatusUpdated( + $internship, + $user->name, + $internship->student->name, + $internship->company->name, + $currentStatus, + $request->enum('status', InternshipStatus::class), + $request->note + )); + + $newStatus->save(); + return response()->noContent(); } }