From c72b507245ce9d92d2da7585fb86127fee6ef7d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Veronika=20Feh=C3=A9rv=C3=ADziov=C3=A1?= <128744051+VeronikaFeherviziova@users.noreply.github.com> Date: Fri, 31 Oct 2025 22:31:08 +0100 Subject: [PATCH] feat: add API endpoint for updating basic internship information --- .../Http/Controllers/InternshipController.php | 92 +++++++++++++------ backend/routes/api.php | 6 +- 2 files changed, 67 insertions(+), 31 deletions(-) diff --git a/backend/app/Http/Controllers/InternshipController.php b/backend/app/Http/Controllers/InternshipController.php index 80d41b3..8800d2d 100644 --- a/backend/app/Http/Controllers/InternshipController.php +++ b/backend/app/Http/Controllers/InternshipController.php @@ -115,36 +115,8 @@ class InternshipController extends Controller { $user = auth()->user(); - $request->validate([ - 'company_id' => ['required', 'exists:companies,id'], - 'start' => ['required', 'date'], - 'end' => ['required', 'date', 'after:start'], - 'year_of_study' => ['required', 'integer', 'between:1,5'], - 'semester' => ['required', 'in:WINTER,SUMMER'], - 'position_description' => ['required', 'string', 'min:1'] - ]); - - $request->merge([ - 'start' => date('Y-m-d H:i:s', strtotime($request->start)), - 'end' => date('Y-m-d H:i:s', strtotime($request->end)) - ]); - - // je už nejaká prax ktorá sa časovo prekrýva? - $existingInternship = Internship::where('user_id', $user->id) - ->where(function ($query) use ($request) { - $query->whereBetween('start', [$request->start, $request->end]) - ->orWhereBetween('end', [$request->start, $request->end]) - ->orWhere(function ($q) use ($request) { - $q->where('start', '<=', $request->start) - ->where('end', '>=', $request->end); - }); - }) - ->exists(); - if ($existingInternship) { - return response()->json([ - 'message' => 'You already have an internship during this period.' - ], 422); - } + $this->validateNewInternship($request); + $this->checkOverlap($user->id, $request->start, $request->end); $Internship = Internship::create([ 'user_id' => $user->id, @@ -184,6 +156,31 @@ class InternshipController extends Controller // } + public function update_basic(int $id, Request $request) + { + $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) { + abort(403, 'Unauthorized'); + } + + $this->validateNewInternship($request); + + if($internship->start !== $request->start || $internship->end !== $request->end) { + $this->checkOverlap($user->id, $request->start, $request->end); + } + + $internship->update($request->except(['user_id'])); + return response()->noContent(); + } + /** * Update the specified resource in storage. */ @@ -199,4 +196,39 @@ class InternshipController extends Controller { // } + + private function validateNewInternship(Request $request) { + $request->validate([ + 'company_id' => ['required', 'exists:companies,id'], + 'start' => ['required', 'date'], + 'end' => ['required', 'date', 'after:start'], + 'year_of_study' => ['required', 'integer', 'between:1,5'], + 'semester' => ['required', 'in:WINTER,SUMMER'], + 'position_description' => ['required', 'string', 'min:1'] + ]); + + $request->merge([ + 'start' => date('Y-m-d H:i:s', strtotime($request->start)), + 'end' => date('Y-m-d H:i:s', strtotime($request->end)) + ]); + } + + private function checkOverlap(int $user_id, string $start_date, string $end_date) { + $existingInternship = Internship::where('user_id', $user_id) + ->where(function ($query) use ($start_date, $end_date) { + $query->whereBetween('start', [$start_date, $end_date]) + ->orWhereBetween('end', [$start_date, $end_date]) + ->orWhere(function ($q) use ($end_date) { + $q->where('start', '<=', $end_date) + ->where('end', '>=', $end_date); + }); + }) + ->exists(); + + if ($existingInternship) { + abort(response()->json([ + 'message' => 'You already have an internship during this period.' + ], 400)); + } + } } diff --git a/backend/routes/api.php b/backend/routes/api.php index a1c41d3..d1a3354 100644 --- a/backend/routes/api.php +++ b/backend/routes/api.php @@ -29,7 +29,11 @@ Route::prefix('/internships')->group(function () { Route::get("/my", [InternshipController::class, 'all_student'])->name("api.internships.student"); Route::middleware("auth:sanctum")->group(function () { - Route::get("/{id}", [InternshipController::class, 'get'])->name("api.internships.get"); + Route::prefix('/{id}')->group(function () { + Route::get("/", [InternshipController::class, 'get'])->name("api.internships.get"); + Route::post("/basic", [InternshipController::class, 'update_basic'])->name("api.internships.update.basic"); + }); + Route::put("/new", [InternshipController::class, 'store'])->name("api.internships.create"); }); });