diff --git a/.ai/conventions.md b/.ai/conventions.md
index 45ac0f3..f703cdc 100644
--- a/.ai/conventions.md
+++ b/.ai/conventions.md
@@ -28,6 +28,8 @@ Pfad: `app/Domains/{Domain}/Actions/{ActionName}/`
- `$this->users` → `UserRepository`
- `$this->tenant` → aktueller `Tenant`
+- Die Controller besitzen ausschließlich eine __invoke() - Funktion
+- Für die Speichern-Actions werden separate Controller-Klassen erstellt (z. B. `StoreEventParticipantController`)
---
## Repositories
@@ -69,3 +71,11 @@ Pfad: `app/Domains/{Domain}/Actions/{ActionName}/`
- Attachments werden über `Attachment::fromData(fn () => $content, $filename)->withMime(...)` angehängt
- Werden Daten sowohl in `content()` als auch in `attachments()` benötigt, wird eine **private Hilfsmethode mit Lazy-Caching** verwendet (einmaliges Berechnen, Ergebnis in private Property speichern)
- Blade-Templates referenzieren Mail-Attachments per `cid:`-Link: `...`
+
+## Actions
+ - Die Actions sind in `app/Domains/{Domain}/Actions/{ActionName}/`-Verzeichnissen organisiert
+ - Jede Action besitzt einen Request, einen Command und einen Response
+ - Der Request besitzt auschließlich einen Konstruktor, der die notwendigen Parameter annimmt
+ - Die Response-Klasse enthält ausschließlich die notwendigen Daten für die Antwort
+ - Die Action-Klasse enthält die Logik für die Verarbeitung der Anfrage und die Generierung der Antwort
+ - Die Logik wird in einer execute() - Funktion innerhalb des Commands impplementiert. Private Funktionen, für ausgelagerte Prozesse sind zulässig, wenn der Code damit lesbarer wird.
diff --git a/app/Domains/Dashboard/Actions/UpdatePersonalData/UpdatePersonalDataCommand.php b/app/Domains/Dashboard/Actions/UpdatePersonalData/UpdatePersonalDataCommand.php
new file mode 100644
index 0000000..c95b7f6
--- /dev/null
+++ b/app/Domains/Dashboard/Actions/UpdatePersonalData/UpdatePersonalDataCommand.php
@@ -0,0 +1,23 @@
+users->updatePersonalData($this->request);
+
+ $response = new UpdatePersonalDataResponse();
+ $response->success = true;
+
+ return $response;
+ }
+}
diff --git a/app/Domains/Dashboard/Actions/UpdatePersonalData/UpdatePersonalDataRequest.php b/app/Domains/Dashboard/Actions/UpdatePersonalData/UpdatePersonalDataRequest.php
new file mode 100644
index 0000000..25046aa
--- /dev/null
+++ b/app/Domains/Dashboard/Actions/UpdatePersonalData/UpdatePersonalDataRequest.php
@@ -0,0 +1,29 @@
+render();
+ }
+}
diff --git a/app/Domains/Dashboard/Controllers/PersonalDataController.php b/app/Domains/Dashboard/Controllers/PersonalDataController.php
new file mode 100644
index 0000000..849784e
--- /dev/null
+++ b/app/Domains/Dashboard/Controllers/PersonalDataController.php
@@ -0,0 +1,45 @@
+checkAuth()) {
+ return redirect()->intended('/login');
+ }
+
+ $user = auth()->user();
+ $data = $this->users->getPersonalData($user);
+
+ $inertiaProvider = new InertiaProvider('Dashboard/PersonalData', [
+ 'personalData' => [
+ 'firstname' => $data['firstname'],
+ 'lastname' => $data['lastname'],
+ 'birthday' => $data['birthday'],
+ 'nickname' => $data['nickname'],
+ 'email' => $data['email'],
+ 'phone' => $data['phone'],
+ 'address1' => $data['address_1'],
+ 'address2' => $data['address_2'],
+ 'postcode' => $data['postcode'],
+ 'city' => $data['city'],
+ 'medications' => $data['medications'],
+ 'allergies' => $data['allergies'],
+ 'intolerances' => $data['intolerances'],
+ 'eatingHabits' => $data['eating_habits'],
+ 'swimmingPermission' => $data['swimming_permission'],
+ 'firstAidPermission' => $data['first_aid_permission'],
+ 'bankAccountOwner' => $data['bank_account_owner'],
+ 'bankAccountIban' => $data['bank_account_iban'],
+ 'tetanusVaccination' => $data['tetanus_vaccination'],
+ ],
+ ]);
+
+ return $inertiaProvider->render();
+ }
+}
diff --git a/app/Domains/Dashboard/Controllers/StorePersonalDataController.php b/app/Domains/Dashboard/Controllers/StorePersonalDataController.php
new file mode 100644
index 0000000..c809e82
--- /dev/null
+++ b/app/Domains/Dashboard/Controllers/StorePersonalDataController.php
@@ -0,0 +1,43 @@
+user();
+
+ $actionRequest = new UpdatePersonalDataRequest(
+ user: $user,
+ nickname: $request->input('nickname'),
+ email: $request->input('email'),
+ phone: $request->input('phone'),
+ address1: $request->input('address1'),
+ address2: $request->input('address2'),
+ postcode: $request->input('postcode'),
+ city: $request->input('city'),
+ medications: $request->input('medications'),
+ allergies: $request->input('allergies'),
+ intolerances: $request->input('intolerances'),
+ eatingHabits: $request->input('eatingHabits'),
+ swimmingPermission: $request->input('swimmingPermission'),
+ firstAidPermission: $request->input('firstAidPermission'),
+ bankAccountOwner: $request->input('bankAccountOwner'),
+ bankAccountIban: $request->input('bankAccountIban'),
+ birthday: $request->input('birthday'),
+ tetanusVaccination: $request->input('tetanusVaccination'),
+ );
+
+ $command = new UpdatePersonalDataCommand($actionRequest, $this->users);
+ $command->execute();
+
+ return response()->json(['success' => true, 'message' => 'Deine Daten wurden erfolgreich gespeichert.']);
+ }
+}
diff --git a/app/Domains/Dashboard/Routes/api.php b/app/Domains/Dashboard/Routes/api.php
index a9d4cc9..73f0df6 100644
--- a/app/Domains/Dashboard/Routes/api.php
+++ b/app/Domains/Dashboard/Routes/api.php
@@ -1,6 +1,7 @@
group(function () {
Route::get('/open-cost-units', [DashboardController::class, 'getOpenCostUnits']);
Route::get('/upcoming-events', [DashboardController::class, 'getUpcomingEvents']);
Route::get('/my-participations', [DashboardController::class, 'getMyParticipations']);
+ Route::post('/personal-data', StorePersonalDataController::class);
});
+
+
});
});
diff --git a/app/Domains/Dashboard/Routes/web.php b/app/Domains/Dashboard/Routes/web.php
index b3d9bbc..0945f7d 100644
--- a/app/Domains/Dashboard/Routes/web.php
+++ b/app/Domains/Dashboard/Routes/web.php
@@ -1 +1,16 @@
group(function () {
+ Route::middleware(['auth'])->group(function () {
+ Route::get('/personal-data', PersonalDataController::class);
+ Route::get('/messages', MessagesController::class);
+
+
+ });
+});
diff --git a/app/Domains/Dashboard/Views/Messages.vue b/app/Domains/Dashboard/Views/Messages.vue
new file mode 100644
index 0000000..31915c0
--- /dev/null
+++ b/app/Domains/Dashboard/Views/Messages.vue
@@ -0,0 +1,25 @@
+
+
+
+