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

- -
-
- -
- - - -
- - -
- - - -
- - -
- - - Passwort vergessen? - -
- - - - - -
-
- - -
- - -
-

- 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

-
+
+ @csrf +
+ +
+
+ + +
+
+ + Passwort vergessen? +
+ +
+ +
+

+ 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) - {{ $event->title }} - @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') }}

+ +

{{ $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 -

+ +

{{ $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 }}

+ +

{{ $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

-
+
Kontakt & Links
+
@if($event->contact_email)
- ✉️ Email: + {{ $event->contact_email }}
@endif @if($event->contact_phone)
- 📞 Telefon: + {{ $event->contact_phone }}
@endif @if($event->website_url)
- 🌐 Website: - Zur Website + + Zur Website →
@endif
@@ -332,12 +159,15 @@ +
-
+
+ + @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 @@ -