Roadmap

Was wir vorhaben, was schon läuft. Direkt aus unserem internen plan.md — Single source of truth, kein Doppel-Pflegen.

Stand:

Reihenfolge

🚧 Offen — kommt noch:

✅ Erledigt:

🗄️ Legacy / Archiv:


To-Do

5. 💸 Kostenbeteiligung

Übersicht wer was für ein LAN bezahlt hat + automatisches Settlement.

Technisch

  • Tabelle event_costs (id, event_id, user_id, description, amount, created)
  • Gesamtkosten / Teilnehmeranzahl = Anteil pro Person
  • Schulden-Settlement: wer zahlt wem wie viel (Min-Cash-Flow-Algorithmus)
  • Nur Teilnehmer des Events können Kosten eintragen

CakePHP

  • EventCostsController: index(), add(), delete()
  • Settlement-Logik im Model

7. 🔕 Benachrichtigungen individuell + granular steuerbar S–M

User können fein­granular wählen, welche Push-Notifications sie erhalten — nicht nur nach Typ, sondern auch gefiltert nach Game (bei Verabredungen) und nach User (Mute).

Technisch

  • Tabelle push_preferences (user_id, type ENUM('event_new','event_comment','verabredung_new','verabredung_comment','foto_upload'), enabled BOOL)
  • Tabelle push_game_filters (user_id, game_label VARCHAR, mode ENUM('include','exclude'))

- include-Mode: nur Verabredungen für gelistete Spiele → push

- exclude-Mode: alle Spiele außer den gelisteten → push

- Default exclude mit leerer Liste = alles erlauben (Opt-out-Logik)

  • Tabelle push_user_mutes (user_id, muted_user_id) — keine Push wenn die andere Person der Trigger ist
  • Beim Senden:

1. Type-Toggle prüfen

2. Wenn Verabredung → Game-Filter prüfen (case-insensitive Match auf meetups.game)

3. Wenn Trigger-User in push_user_mutes → skip

UI

  • Einstellungsseite /push/settings (oder im Profil eingebettet)
  • Toggle-Switches je Typ
  • Game-Filter-Sektion: Liste mit Chips, "+ Spiel hinzufügen", Include/Exclude-Switch
  • Mute-Sektion: Auto­complete für User, Liste der gemuteten User mit Entfernen-Button
  • Quick-Mute auf den Karten: Drei-Punkte-Menü pro Verabredung mit "Benachrichtigungen für [Spiel] aus" und "Von [Nickname] nicht mehr benachrichtigen"

CakePHP

  • PushController::settings() GET/POST
  • PushController::muteUser(), unmuteUser() (AJAX)
  • PushController::addGameFilter(), removeGameFilter() (AJAX)
  • Policy: nur eigene Prefs änderbar
  • Filter-Logik gebündelt in NotificationsTable::shouldNotify(int $userId, string $type, ?array $context)

8. 📅 LAN-Termin-Abstimmung (Doodle-Style) M

Vor einem konkreten Event: Admin schlägt 3-5 Termine vor, jeder klickt seine Verfügbarkeit an.

Killer-Feature für die Planungsphase, bevor ein konkretes Event existiert.

Technisch

  • Tabelle poll_dates (id, title, description, created_by, locked BOOL, created)
  • Tabelle poll_date_options (id, poll_id, date_from DATETIME, date_to DATETIME, sort_order)
  • Tabelle poll_date_votes (poll_id, option_id, user_id, vote ENUM('yes','maybe','no'), created/modified)
  • Auto-Highlight: Termin mit meisten yes-Stimmen (bei Gleichstand: yes + maybe)
  • Admin kann Poll abschließen und daraus direkt ein Event erstellen (Daten vorausgefüllt)

UI

  • Tabelle: Zeilen = Termine, Spalten = User, Zellen = ✅/❓/❌
  • Eigene Zeile editierbar per Klick
  • Footer mit Summe je Termin, bester Termin highlighted

CakePHP

  • PollDatesController: index, view, add, vote, lock, convertToEvent
  • Push: bei neuem Poll → alle subscribed User; bei Vote → Ersteller

9. 🎮 Game-Wishlist + Voting S

Pro Event: "Was wollen wir spielen?". Jeder fügt Vorschläge hinzu, andere upvoten.

Hilft bei der Diskussion am Abend ("Was zocken wir jetzt?").

Technisch

  • Tabelle event_game_suggestions (id, event_id, user_id, game_label, created)
  • Tabelle event_game_votes (suggestion_id, user_id, created) — eine Stimme pro User pro Vorschlag
  • Anzeige sortiert nach Vote-Count
  • Optional: Verknüpfung mit Steam-API (Logo / Header-Image automatisch holen via App-ID-Lookup)

CakePHP

  • EventGameSuggestionsController: add, delete, vote, unvote
  • Eingebettet in Events/view.php unter „Pinnwand"
  • Policy: jeder Teilnehmer darf Vorschläge & Votes

10. 🤝 Steam-Library-Match M

Vergleicht die Steam-Bibliotheken aller Event-Teilnehmer. Zeigt welche Spiele alle haben, welche die meisten haben, welche niemand hat.

Technisch

  • Steam Web API: IPlayerService/GetOwnedGames für jeden User mit steam_id
  • TTL-Cache 24h pro User (Library ändert sich selten)
  • Set-Operations:

- Schnittmenge aller → "Können sofort starten"

- >=80% haben es → "Fast alle"

- 1-2 fehlen → "Fast alle, [X] und [Y] fehlen"

  • Filter: Multiplayer-Tag aus Steam-API (Co-op / PvP / LAN)

UI

  • Tab/Akkordeon auf Event-Detail-Seite
  • Liste mit App-Header-Image, Titel, "X/Y Spieler haben das"

CakePHP

  • EventsController::libraryMatch(int $eventId) (JSON)
  • SteamLibraryComponent mit Cache-Wrapper
  • Verarbeitung asynchron via lightweight Queue (oder spinner-on-demand)

11. 😂 Reactions auf Kommentare S

👍 ❤️ 😂 🔥 unter Pinnwand-/Meetup-Kommentaren. Macht die Pinnwand lebendiger, weniger "Reply-Spam".

Technisch

  • Tabelle comment_reactions (id, comment_id, comment_type ENUM('event','meetup'), user_id, emoji, created)

- Polymorpher Ansatz mit comment_type damit beide Comment-Typen abgedeckt sind

  • UNIQUE-Index auf (comment_id, comment_type, user_id, emoji) — kein Doppel-React
  • Anzeige: kompakte Chip-Reihe unterhalb des Comments mit Emoji + Count
  • Toggle: Klick auf Chip mit deinem Emoji entfernt deine Reaction

UI

  • Hover/Long-Press auf Kommentar → kleines Emoji-Popover (👍 ❤️ 😂 🔥 + "more")
  • Mobile: Long-Press-Geste
  • Live-Update via AJAX

CakePHP

  • CommentReactionsController::toggle() (POST → JSON, eigener Endpoint)

12. ⏱️ LAN-Countdown auf der Home XS

Großer Timer: "Noch 12 Tage 4 Std. bis Operation: Cyberstorm". Pure Hype-Build-up.

Technisch

  • Nächstes Event mit eventdate > NOW() aus events ziehen
  • Reines Frontend-Update via setInterval für die Sekunden/Minuten
  • Bei <24h: anders darstellen ("Heute Abend!" / Stunden-Counter)
  • Wenn kein zukünftiges Event: dezent ausblenden oder "Noch kein Termin – Doodle starten?" (Brücke zu #8)

UI

  • Hero-Section oben auf der Home (zwischen Greeting und Quicklinks)
  • Große Fluid-Type-Variante mit clamp()

CakePHP

  • Bereits im Events-Cell oder neuer EventCountdown-Cell

13. 💬 @-Mentions in Kommentaren S

@papsbear mit Autocomplete im Kommentar-Input. Erwähnter User bekommt Push.

Technisch

  • Bei submit: Regex /@([\w-]+)/ über den Body → User-Lookup nach nickname
  • Pro Match: Push-Notification an den User (sofern nicht schon Comment-Empfänger)
  • Anzeige im Comment: @nickname wird zu Link/Chip mit Accent-Farbe
  • Autocomplete-Dropdown beim Tippen von @ (Liste alle Nicknames, fuzzy match)

UI

  • Eingabe-Feld bekommt einen kleinen JS-Listener (kein Framework nötig)
  • Dropdown positioniert unter dem Cursor

CakePHP

  • EventCommentsController::add() und MeetupCommentsController::add() parsen den Body
  • Auch in Reaktion auf #11 sinnvoll erweiterbar

Keys (Legacy)

Altes interner Brain-Dump aus der frühen Planung — bleibt als Archiv stehen.

  • Functions:
    • List all Keys for Game without User assigned (-> count() is enough)

Erledigt

1. 🎮 Steam „Wer spielt gerade?"

Live-Widget auf der Startseite: welche User aktuell online / in einem Spiel sind.

Technisch

  • Steam Web API: ISteamUser/GetPlayerSummaries mit den gespeicherten steam_ids aller User
  • Beim Seitenaufruf serverseitig gerendert, TTL-Cache ~60s
  • Anzeige: Avatar, Name, Spielname, Status (online / ingame / offline)
  • Nur User mit verknüpftem Steam-Account anzeigen

CakePHP

  • Neuer Endpoint /steam-status (JSON) oder direkt im Home-Template serverseitig
  • Cache via CakePHP Cache-Layer (File/Apcu)

2. 📸 Galerie pro Event

User können Bilder zu einem Event hochladen, alle sehen die Galerie.

Technisch

  • Neue Tabelle event_photos (id, event_id, user_id, filename, caption, created)
  • Upload in webroot/uploads/events/{event_id}/, Thumbnail via GD
  • Lightbox-Ansicht im Frontend (GLightbox o.ä., vanilla JS)
  • Moderation: nur eigene Bilder löschen, Admins alles

CakePHP

  • EventPhotosController: upload(), delete()
  • Policy: jeder eingeloggte User kann hochladen, nur Eigentümer/Admin löschen

3. 💬 Kommentare / Pinnwand pro Event

User können Kommentare zu einem Event hinterlassen.

Technisch

  • Neue Tabelle event_comments (id, event_id, user_id, body, created)
  • Flat, chronologisch, Plain Text
  • Admins können jeden Kommentar löschen

CakePHP

  • EventCommentsController: add(), delete()
  • Eingebettet in Events/view.php

4. 📋 Packliste personalisierbar

Globale Packliste (Admin pflegt Items) + User markiert Punkte als „eingepackt" je Event.

Technisch

  • Tabelle pack_items (id, label, category, sort_order)
  • Tabelle user_pack_checks (user_id, event_id, pack_item_id)
  • Checkbox-State per AJAX gespeichert (kein Reload)
  • Gruppiert nach Kategorie (Hardware, Kabel, Persönliches, …)

CakePHP

  • PackItemsController (Admin CRUD)
  • UserPackChecksController: toggle() (POST → JSON)
  • Anzeige unter /events/{id}/packliste oder direkt in Event-View

6. 🔔 Push-Notifications (PWA)

User werden benachrichtigt bei neuen Events oder Anmeldungen.

Technisch

  • Web Push API (VAPID-Keys, minishlink/web-push PHP-Library)
  • Service Worker webroot/sw.js
  • Tabelle push_subscriptions (user_id, endpoint, keys JSON)
  • Trigger: nach Events::add() → alle subscribed User
  • PWA Manifest (manifest.json) für „Zum Homescreen hinzufügen"

CakePHP

  • PushSubscriptionsController: subscribe(), unsubscribe()
  • Benachrichtigung direkt nach dem Save inline

Users (Legacy)

Brain-Dump aus der ersten Planungsphase.

  • Functions:
    • Login
    • Register
    • Logout
    • get all Active Users
  • Attributes:
    • ID
    • Username
    • Password
    • Status (active/inactive)
    • IP-Address (maybe automatic?)

Games (Legacy)

  • Functions:
    • Add new Game
    • List all Games
    • Get Game ID by Name
  • Attributes:
    • ID
    • GameName
    • PageID (?)
    • titleImage (?)

Keys — alte Notes (Legacy)

  • Functions:
    • add new Key (-> depending on Game ID)
    • add User to Key
    • get Key with Game ID for User (assign new one if User doesn´t have one)
  • Attributes:
    • ID
    • Key
    • GameID
    • UserID

Pages (Legacy)

  • Menüleiste:
    • Home, Games
    • Login/Logout button
  • Home:
    • Übersicht aktive User
      • Admins sehen alle User und könenn Status ändern
  • Games-Übersicht:
    • Liste aller Games
      • Admins können Games hinzufügen
      • Alle User können Keys hinzufügen (Link auf Keys->add() Funktion)
      • titleImage plus Verlinkung auf Game Seite
  • Game Add Seite:
    • Spiel hinzufügen mit Name, titleImage
      • automatisches Anlegen von GamePage (?)

Funktionen (Legacy)

  • Games
    • Wenn keine Game Seite, dann wird einfach der Key des Users angezeigt, wenn er keinen hat, kann er sich einen anfordern (?)