diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php
index 03def30..c42ff68 100644
--- a/app/Http/Controllers/AuthController.php
+++ b/app/Http/Controllers/AuthController.php
@@ -71,7 +71,62 @@ class AuthController extends Controller
}
/**
- * Logout - Token löschen.
+ * Web-Login mit Session (für Blade-Views).
+ */
+ public function webLogin(Request $request)
+ {
+ $credentials = $request->validate([
+ 'email' => 'required|email',
+ 'password' => 'required|string',
+ ]);
+
+ if (Auth::attempt($credentials, $request->boolean('remember'))) {
+ $request->session()->regenerate();
+ return redirect()->intended('/');
+ }
+
+ return back()->withErrors([
+ 'email' => 'Die eingegebenen Anmeldedaten sind ungültig.',
+ ])->onlyInput('email');
+ }
+
+ /**
+ * Web-Registrierung mit Session.
+ */
+ public function webRegister(Request $request)
+ {
+ $validated = $request->validate([
+ 'name' => 'required|string|max:255',
+ 'email' => 'required|email|unique:users',
+ 'password' => 'required|string|min:8|confirmed',
+ ]);
+
+ $user = User::create([
+ 'name' => $validated['name'],
+ 'email' => $validated['email'],
+ 'password' => Hash::make($validated['password']),
+ 'role' => 'user',
+ ]);
+
+ Auth::login($user);
+ $request->session()->regenerate();
+
+ return redirect('/');
+ }
+
+ /**
+ * Web-Logout (Session beenden).
+ */
+ public function webLogout(Request $request)
+ {
+ Auth::logout();
+ $request->session()->invalidate();
+ $request->session()->regenerateToken();
+ return redirect('/');
+ }
+
+ /**
+ * Logout - Token löschen (API).
*/
public function logout(Request $request)
{
diff --git a/app/Http/Controllers/EventWebController.php b/app/Http/Controllers/EventWebController.php
index fefa806..cf6aecb 100644
--- a/app/Http/Controllers/EventWebController.php
+++ b/app/Http/Controllers/EventWebController.php
@@ -55,9 +55,10 @@ class EventWebController extends Controller
$locations = Event::published()
->whereNotNull('location_id')
->with('location')
- ->distinct()
->get()
- ->pluck('location.name')
+ ->pluck('location.city')
+ ->filter()
+ ->unique()
->sort()
->values();
diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php
new file mode 100644
index 0000000..50fb020
--- /dev/null
+++ b/app/Http/Controllers/ProfileController.php
@@ -0,0 +1,44 @@
+ Auth::user()]);
+ }
+
+ public function updateInfo(Request $request)
+ {
+ $user = Auth::user();
+
+ $validated = $request->validate([
+ 'name' => ['required', 'string', 'max:255'],
+ 'email' => ['required', 'email', 'max:255', 'unique:users,email,' . $user->id],
+ ]);
+
+ $user->update($validated);
+
+ return redirect()->route('profile')->with('success_info', 'Name und E‑Mail wurden gespeichert.');
+ }
+
+ public function updatePassword(Request $request)
+ {
+ $request->validate([
+ 'current_password' => ['required', 'current_password'],
+ 'password' => ['required', 'confirmed', Password::min(8)],
+ ]);
+
+ Auth::user()->update([
+ 'password' => Hash::make($request->password),
+ ]);
+
+ return redirect()->route('profile')->with('success_pw', 'Passwort wurde erfolgreich geändert.');
+ }
+}
diff --git a/app/Models/Event.php b/app/Models/Event.php
index 38d046e..0aa95e3 100644
--- a/app/Models/Event.php
+++ b/app/Models/Event.php
@@ -116,8 +116,7 @@ class Event extends Model
public function scopeByLocation($query, $location)
{
return $query->whereHas('location', function ($q) use ($location) {
- $q->where('name', 'like', '%' . $location . '%')
- ->orWhere('city', 'like', '%' . $location . '%');
+ $q->where('city', $location);
});
}
diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php
index 38cf63f..603bea6 100644
--- a/resources/views/auth/login.blade.php
+++ b/resources/views/auth/login.blade.php
@@ -1,191 +1,123 @@
-
+
-
- Login - {{ config('app.name', 'Veranstaltungen') }}
-
-
+ Anmelden – Veranstaltungs-App
-
-
-
-
+
+
-
-
-
-
-
-
-
-
Anmelden
-
- Melden Sie sich in Ihrem Konto an, um fortzufahren
-
-
+
+
+
Veranstaltungs-App
+
Willkommen zurück
+
Melden Sie sich an, um fortzufahren
-
-
-
-
-
-
-
-
-
-
- Noch kein Konto?
-
- Jetzt registrieren
-
-
+ @if ($errors->any())
+
+ @foreach ($errors->all() as $error)
+
{{ $error }}
+ @endforeach
+ @endif
-
-
-
Demo Konten:
-
-
👤 user@example.com / password123
-
🎭 organizer@example.com / password123
-
👨💼 admin@example.com / password123
-
+
+
+
+
+ Noch kein Konto? Jetzt registrieren
+
+
+
Demo-Konten:
+
👤 user@example.com / password123
+
🎭 organizer@example.com / password123
+
👨💼 admin@example.com / password123
-
-
diff --git a/resources/views/event-detail.blade.php b/resources/views/event-detail.blade.php
index f791e90..46a01e3 100644
--- a/resources/views/event-detail.blade.php
+++ b/resources/views/event-detail.blade.php
@@ -3,328 +3,155 @@
-
{{ $event->title }} - Veranstaltungen
+
{{ $event->title }} - Veranstaltungs-App
-
-
← Zurück zur Übersicht
+ @include('partials.header')
+
+
+ ← Zurück zur Übersicht
-
- @if($event->image_url)
-
- @else
-
🎭
- @endif
-
-
+
- @if($event->category)
-
{{ $event->category }}
- @endif
- @if($event->source)
-
Quelle: {{ $event->source->name }}
- @endif
-
{{ $event->title }}
+
+ @if($event->category)
+ {{ $event->category }}
+ @endif
+ @if($event->source)
+ Quelle: {{ $event->source->name }}
+ @endif
+
+
+
{{ $event->title }}
@if($event->occurrences->count() > 0)
- @php $firstOccurrence = $event->occurrences->first(); @endphp
+ @php $first = $event->occurrences->first(); @endphp
-
📅
+
📅
-
Nächster Termin
-
{{ $firstOccurrence->start_datetime->format('d. F Y') }}
+
Nächster Termin
+
{{ $first->start_datetime->format('d. F Y') }}
-
⏰
+
⏰
-
Uhrzeit
-
{{ $firstOccurrence->start_datetime->format('H:i') }}
- @if($firstOccurrence->end_datetime)
- - {{ $firstOccurrence->end_datetime->format('H:i') }}
- @endif
- Uhr
-
+
Uhrzeit
+
{{ $first->start_datetime->format('H:i') }}{{ $first->end_datetime ? ' – ' . $first->end_datetime->format('H:i') : '' }} Uhr
@endif
@if($event->location)
-
📍
+
📍
-
Ort
-
{{ $event->location->name }} {{ $event->location->city }}
+
Ort
+
{{ $event->location->name }}, {{ $event->location->city }}
@endif
@if($event->description)
-
Beschreibung
+
Beschreibung
{{ $event->description }}
@endif
@if($event->occurrences->count() > 0)
-
Alle Termine ({{ $event->occurrences->count() }})
+
Alle Termine ({{ $event->occurrences->count() }})
- @foreach($event->occurrences as $occurrence)
+ @foreach($event->occurrences as $occ)
-
- 📅 {{ $occurrence->start_datetime->format('d. F Y') }}
-
-
- ⏰ {{ $occurrence->start_datetime->format('H:i') }}
- @if($occurrence->end_datetime)
- - {{ $occurrence->end_datetime->format('H:i') }}
- @endif
- Uhr
-
+
{{ $occ->start_datetime->format('d. F Y') }}
+
{{ $occ->start_datetime->format('H:i') }}{{ $occ->end_datetime ? ' – ' . $occ->end_datetime->format('H:i') : '' }} Uhr
-
{{ ucfirst($occurrence->status) }}
+ @php
+ $statusLabels = [
+ 'scheduled' => 'Geplant',
+ 'cancelled' => 'Abgesagt',
+ 'postponed' => 'Verschoben',
+ 'sold_out' => 'Ausverkauft',
+ 'completed' => 'Abgeschlossen',
+ ];
+ $statusLabel = $statusLabels[$occ->status] ?? ucfirst($occ->status);
+ @endphp
+
{{ $statusLabel }}
@endforeach
@endif
@if($event->contact_email || $event->contact_phone || $event->website_url)
-
Kontakt & Links
-
-
+
+
+ @include('partials.footer')
diff --git a/resources/views/events.blade.php b/resources/views/events.blade.php
index b5eb652..6dac7cf 100644
--- a/resources/views/events.blade.php
+++ b/resources/views/events.blade.php
@@ -108,7 +108,7 @@
📍 {{ $event->location->name }}
@endif
-
Details ansehen →
+
Details ansehen →
@endforeach
diff --git a/resources/views/legal/agb.blade.php b/resources/views/legal/agb.blade.php
new file mode 100644
index 0000000..a598381
--- /dev/null
+++ b/resources/views/legal/agb.blade.php
@@ -0,0 +1,20 @@
+@include('partials.header')
+
+
+ Allgemeine Geschäftsbedingungen (AGB)
+
+
+ 1. Geltungsbereich
+ Diese AGB regeln die Nutzung der Plattform Veranstaltungs‑App zwischen Veranstaltungs‑App (Anbieter) und den Nutzern.
+
+ 2. Leistungen
+ Der Anbieter stellt eine Plattform zur Suche, Anzeige und Verwaltung von Veranstaltungen zur Verfügung.
+
+ 3. Haftung
+ Der Anbieter haftet nur bei Vorsatz und grober Fahrlässigkeit. Für Inhalte Dritter übernimmt der Anbieter keine Haftung.
+
+ Dies ist eine Muster‑AGB. Bitte lassen Sie die AGB rechtlich prüfen, bevor Sie diese veröffentlichen.
+
+
+
+@include('partials.footer')
diff --git a/resources/views/legal/impressum.blade.php b/resources/views/legal/impressum.blade.php
new file mode 100644
index 0000000..2e1d3da
--- /dev/null
+++ b/resources/views/legal/impressum.blade.php
@@ -0,0 +1,23 @@
+@include('partials.header')
+
+
+ Impressum
+
+
+ Angaben gemäß § 5 TMG:
+ Veranstaltungs‑App
+ Musterstraße 1
+ 12345 Musterstadt
+
+ Kontakt:
+ Telefon: +49 (0)123 456789
+ E‑Mail: support@veranstaltungen.app
+
+ Vertretungsberechtigte(r)
+ Max Mustermann
+
+ Hinweis: Dieses Impressum ist ein Platzhalter. Prüfen Sie bitte die rechtlichen Anforderungen und ergänzen Sie ggf. Angaben wie USt‑ID, Handelsregister etc.
+
+
+
+@include('partials.footer')
diff --git a/resources/views/legal/privacy.blade.php b/resources/views/legal/privacy.blade.php
new file mode 100644
index 0000000..9aa4b78
--- /dev/null
+++ b/resources/views/legal/privacy.blade.php
@@ -0,0 +1,25 @@
+@include('partials.header')
+
+
+ Datenschutzerklärung
+
+
+ Diese Datenschutzerklärung informiert Sie über die Verarbeitung personenbezogener Daten im Zusammenhang mit der Nutzung der Veranstaltungs‑App.
+
+ 1. Verantwortlicher
+ Verantwortlich: Veranstaltungs‑App, Musterstraße 1, 12345 Musterstadt, E‑Mail: support@veranstaltungen.app
+
+ 2. Erhobene Daten
+ Wir verarbeiten u. a. Name, E‑Mail, Nutzungsdaten und eventbezogene Informationen zur Bereitstellung der Dienste.
+
+ 3. Zwecke & Rechtsgrundlagen
+ Die Datenverarbeitung dient der Vertragserfüllung, Sicherheitszwecken und der Verbesserung unseres Dienstes. Rechtsgrundlagen sind Art.6 DSGVO.
+
+ 4. Ihre Rechte
+ Sie haben das Recht auf Auskunft, Berichtigung, Löschung, Datenübertragbarkeit und Widerspruch. Kontaktieren Sie uns unter support@veranstaltungen.app.
+
+ Diese Seite ist ein Musterdokument. Bitte passen Sie den Text an die rechtlichen Anforderungen Ihres Projekts an.
+
+
+
+@include('partials.footer')
diff --git a/resources/views/partials/footer.blade.php b/resources/views/partials/footer.blade.php
index 9a0b125..370141b 100644
--- a/resources/views/partials/footer.blade.php
+++ b/resources/views/partials/footer.blade.php
@@ -1,46 +1,126 @@
-