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 01/10] 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 From 426ea6f910498991b3b7f94481f265460ca4bcc9 Mon Sep 17 00:00:00 2001 From: br0kenpixel <23280129+br0kenpixel@users.noreply.github.com> Date: Tue, 28 Oct 2025 09:29:22 +0100 Subject: [PATCH 02/10] feat: display error message for internship data retrieval --- frontend/app/pages/dashboard/student.vue | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/frontend/app/pages/dashboard/student.vue b/frontend/app/pages/dashboard/student.vue index 68ff8f9..5d79e36 100644 --- a/frontend/app/pages/dashboard/student.vue +++ b/frontend/app/pages/dashboard/student.vue @@ -25,7 +25,7 @@ const headers = [ ]; const user = useSanctumUser(); -const { data, status, error } = await useSanctumFetch('/api/internships'); +const { data, error } = await useSanctumFetch('/api/internships'); const serverItems = [ { @@ -63,6 +63,11 @@ const loading = false;

Moje praxe

+ + + + From ce9a04ae72cd0f1bbe59f912662d6da2e43a9595 Mon Sep 17 00:00:00 2001 From: br0kenpixel <23280129+br0kenpixel@users.noreply.github.com> Date: Tue, 28 Oct 2025 09:29:54 +0100 Subject: [PATCH 03/10] refactor: remove unused variables from student dashboard --- frontend/app/pages/dashboard/student.vue | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/frontend/app/pages/dashboard/student.vue b/frontend/app/pages/dashboard/student.vue index 5d79e36..e43623e 100644 --- a/frontend/app/pages/dashboard/student.vue +++ b/frontend/app/pages/dashboard/student.vue @@ -26,20 +26,6 @@ const headers = [ const user = useSanctumUser(); const { data, error } = await useSanctumFetch('/api/internships'); - -const serverItems = [ - { - company: "Kutil s.r.o.", - start: "01.01.2025", - end: "30.01.2025", - year_of_study: 1, - semester: "zinmý", - status: "Zadané", - } -]; -const totalItems = 0; -const loading = false; -