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