diff --git a/backend/app/Http/Controllers/CompanyController.php b/backend/app/Http/Controllers/CompanyController.php index 171eaad..fce832f 100644 --- a/backend/app/Http/Controllers/CompanyController.php +++ b/backend/app/Http/Controllers/CompanyController.php @@ -3,10 +3,21 @@ namespace App\Http\Controllers; use App\Models\Company; +use App\Models\User; use Illuminate\Http\Request; class CompanyController extends Controller { + public function all_simple() { + $companies = Company::all()->makeHidden(['created_at', 'updated_at']); + + $companies->each(function ($company) { + $company->contact = User::find($company->contact)->makeHidden(['created_at', 'updated_at', 'email_verified_at']); + }); + + return response()->json($companies); + } + /** * Display a listing of the resource. */ diff --git a/backend/app/Http/Controllers/InternshipController.php b/backend/app/Http/Controllers/InternshipController.php index b93eca6..5d2a680 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. */ @@ -28,7 +53,59 @@ class InternshipController extends Controller */ public function store(Request $request) { - // + $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); + } + + $Internship = Internship::create([ + 'user_id' => $user->id, + 'company_id' => $request->company_id, + 'start' => $request->start, + 'end' => $request->end, + 'year_of_study' => $request->year_of_study, + 'semester' => $request->semester, + 'position_description' => $request->position_description, + 'agreement' => null + ]); + + InternshipStatus::create([ + 'internship_id' => $Internship->id, + 'status' => 'SUBMITTED', + 'changed' => now(), + 'note' => null, + 'modified_by' => $user->id + ]); + + return response()->noContent(); } /** diff --git a/backend/routes/api.php b/backend/routes/api.php index 1092813..392241f 100644 --- a/backend/routes/api.php +++ b/backend/routes/api.php @@ -1,6 +1,8 @@ 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::prefix('/internships')->group(function () { + Route::get("/", [InternshipController::class, 'all'])->name("api.internships"); + + Route::middleware("auth:sanctum")->group(function () { + Route::put("/new", [InternshipController::class, 'store'])->name("api.internships.create"); + }); +}); + +Route::prefix('/companies')->middleware("auth:sanctum")->group(function () { + Route::get("/simple", [CompanyController::class, 'all_simple']); +}); \ No newline at end of file diff --git a/frontend/app/components/InternshipEditor.vue b/frontend/app/components/InternshipEditor.vue new file mode 100644 index 0000000..29654cb --- /dev/null +++ b/frontend/app/components/InternshipEditor.vue @@ -0,0 +1,157 @@ + + + + + diff --git a/frontend/app/pages/dashboard/student.vue b/frontend/app/pages/dashboard/student.vue deleted file mode 100644 index e7558bb..0000000 --- a/frontend/app/pages/dashboard/student.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/app/pages/dashboard/student/index.vue b/frontend/app/pages/dashboard/student/index.vue new file mode 100644 index 0000000..3f58f3e --- /dev/null +++ b/frontend/app/pages/dashboard/student/index.vue @@ -0,0 +1,99 @@ + + + + + \ No newline at end of file diff --git a/frontend/app/pages/dashboard/student/internship/create.vue b/frontend/app/pages/dashboard/student/internship/create.vue new file mode 100644 index 0000000..c58f787 --- /dev/null +++ b/frontend/app/pages/dashboard/student/internship/create.vue @@ -0,0 +1,66 @@ + + + + + \ No newline at end of file diff --git a/frontend/app/pages/dashboard/student/internship/edit/[id].vue b/frontend/app/pages/dashboard/student/internship/edit/[id].vue new file mode 100644 index 0000000..dacf34a --- /dev/null +++ b/frontend/app/pages/dashboard/student/internship/edit/[id].vue @@ -0,0 +1,31 @@ + + + + + \ No newline at end of file diff --git a/frontend/app/types/company_data.ts b/frontend/app/types/company_data.ts index 8d5f639..5e9e687 100644 --- a/frontend/app/types/company_data.ts +++ b/frontend/app/types/company_data.ts @@ -1,9 +1,11 @@ +import type { User } from "./user"; + export interface CompanyData { id: number; name: string; address: string; ico: number; - contact: number; + contact: User; hiring: boolean; }; 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..67f9768 --- /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: number; + company_id: number; + start: string; + end: string; + year_of_study: number; + semester: string; + position_description: string; + agreement?: Uint8Array; +}; \ No newline at end of file