From 94a5776cbccef551afced82e3d9c5c1e1e44fcf1 Mon Sep 17 00:00:00 2001 From: br0kenpixel <23280129+br0kenpixel@users.noreply.github.com> Date: Thu, 23 Oct 2025 14:16:13 +0200 Subject: [PATCH] feat: add internship retrieval and display functionality --- .../Http/Controllers/InternshipController.php | 25 ++++++ backend/routes/api.php | 5 +- frontend/app/pages/dashboard/student.vue | 86 ++++++++++++++++++- frontend/app/types/internship_status.ts | 35 ++++++++ frontend/app/types/internships.ts | 26 ++++++ 5 files changed, 174 insertions(+), 3 deletions(-) create mode 100644 frontend/app/types/internship_status.ts create mode 100644 frontend/app/types/internships.ts diff --git a/backend/app/Http/Controllers/InternshipController.php b/backend/app/Http/Controllers/InternshipController.php index b93eca6..69599d1 100644 --- a/backend/app/Http/Controllers/InternshipController.php +++ b/backend/app/Http/Controllers/InternshipController.php @@ -2,11 +2,36 @@ namespace App\Http\Controllers; +use App\Models\Company; use App\Models\Internship; +use App\Models\InternshipStatus; +use App\Models\User; use Illuminate\Http\Request; class InternshipController extends Controller { + public function all() + { + $internships = Internship::where('user_id', auth()->id())->get()->makeHidden(['created_at', 'updated_at']); + + $internships->each(function ($internship) { + $internship->company = Company::find($internship->company_id)->makeHidden(['created_at', 'updated_at']); + unset($internship->company_id); + }); + + $internships->each(function ($internship) { + $internship->contact = User::find($internship->company->contact)->makeHidden(['created_at', 'updated_at', 'email_verified_at']); + unset($internship->company->contact); + }); + + $internships->each(function ($internship) { + $internship->status = InternshipStatus::whereColumn('internship_id', '=', $internship->id)->get()->first()->makeHidden(['created_at', 'updated_at', 'id']); + $internship->status->modified_by = User::find($internship->status->modified_by)->makeHidden(['created_at', 'updated_at', 'email_verified_at']); + }); + + return response()->json($internships); + } + /** * Display a listing of the resource. */ diff --git a/backend/routes/api.php b/backend/routes/api.php index 1092813..196a44c 100644 --- a/backend/routes/api.php +++ b/backend/routes/api.php @@ -1,6 +1,7 @@ get('/user', function (Request $request) { Route::post('/password-reset', [RegisteredUserController::class, 'reset_password']) ->middleware(['guest', 'throttle:6,1']) - ->name('password.reset'); \ No newline at end of file + ->name('password.reset'); + +Route::get('/internships', [InternshipController::class, 'all'])->middleware(['auth'])->name("api.internships"); \ No newline at end of file diff --git a/frontend/app/pages/dashboard/student.vue b/frontend/app/pages/dashboard/student.vue index e7558bb..68ff8f9 100644 --- a/frontend/app/pages/dashboard/student.vue +++ b/frontend/app/pages/dashboard/student.vue @@ -1,4 +1,6 @@ \ No newline at end of file + + + \ No newline at end of file diff --git a/frontend/app/types/internship_status.ts b/frontend/app/types/internship_status.ts new file mode 100644 index 0000000..b813f95 --- /dev/null +++ b/frontend/app/types/internship_status.ts @@ -0,0 +1,35 @@ +import type { User } from "./user"; + +export interface InternshipStatusData { + internship_id: number; + user_id: string; + status: InternshipStatus; + changed: string; + note: string; + modified_by: User; +}; + +export enum InternshipStatus { + SUBMITTED = 'SUBMITTED', + CONFIRMED = 'CONFIRMED', + DENIED = 'DENIED', + DEFENDED = 'DEFENDED', + NOT_DEFENDED = 'NOT_DEFENDED' +}; + +export function prettyInternshipStatus(status: InternshipStatus) { + switch (status) { + case InternshipStatus.SUBMITTED: + return "Zadané"; + case InternshipStatus.CONFIRMED: + return "Potvrdené"; + case InternshipStatus.DENIED: + return "Zamítnuté"; + case InternshipStatus.DEFENDED: + return "Obhájené"; + case InternshipStatus.NOT_DEFENDED: + return "Neobhájené"; + default: + throw new Error("Unknown status"); + } +} \ No newline at end of file diff --git a/frontend/app/types/internships.ts b/frontend/app/types/internships.ts new file mode 100644 index 0000000..3aa05a1 --- /dev/null +++ b/frontend/app/types/internships.ts @@ -0,0 +1,26 @@ +import type { CompanyData } from "./company_data"; +import type { InternshipStatusData } from "./internship_status"; + +export interface Internship { + id: number; + user_id: string; + company: CompanyData; + start: string; + end: string; + year_of_study: number; + semester: string; + position_description: string; + agreement?: Uint8Array; + status: InternshipStatusData; +}; + +export interface NewInternship { + user_id: string; + company_id: string; + start: number; + end: number; + year_of_study: boolean; + semester: string; + position_description: string; + agreement?: Uint8Array; +}; \ No newline at end of file