# Date-Wizard 💕 Eine spielerische Web-App ("Choose Your Own Adventure") zum Planen gemeinsamer Dates – mit mobilem Design, dynamischen AktivitĂ€ten & Terminen sowie einem Go-Microservice zum E-Mail-Versand der Reservierung. --- ## 📁 Projektstruktur ```text datetest/ ├── config/ # Persistente JSON-Konfiguration und Buchungen │ ├── appsettings.json # Admin-Passwort und optionale Namen │ ├── activities.json # AktivitĂ€ten │ ├── dates_available.json # VerfĂŒgbare Termine │ └── dates_booked.json # Strukturierte Buchungen ├── public/ # Statische Webseiten & Assets │ ├── index.html # Startseite ("Willst du mit mir gehen?") │ ├── datetime.html/.js # Datumsauswahl (Kalender) │ ├── activity.html/.js # AktivitĂ€tsauswahl │ ├── name.html/.js # Namensauswahl ("Wer bist du?") │ └── checkout.html/.js # Zusammenfassung & BestĂ€tigung ├── main.go # Go-Microservice (HTTP-Server & SMTP E-Mail) ├── go.mod # Go-Moduldefinition ├── Dockerfile # Multi-Stage Dockerfile (Alpine Runtime) ├── docker-compose.yml # Docker-Compose mit Traefik Labels ├── .env.example # Vorlage fĂŒr Umgebungsvariablen └── .env # Lokale/Produktive Umgebungsvariablen (nicht ins Git committen) ``` --- ## ⚙ Konfiguration ### 1. E-Mail & Server `.env` anlegen Kopiere `.env.example` zu `.env`: ```bash cp .env.example .env ``` Trage in der `.env` deine Server- und SMTP-Zugangsdaten ein: | Variable | Beschreibung | Beispiel | | :--- | :--- | :--- | | `PORT` | HTTP-Port des Go-Servers | `8080` | | `WEB_DIR` | Verzeichnis der statischen Assets | `public` | | `SMTP_HOST` | Postausgangsserver (SMTP) | `mail.example.com` | | `SMTP_PORT` | SMTP-Port (Standard meist 587 oder 465) | `587` | | `SMTP_USER` | Benutzername / E-Mail fĂŒr SMTP-Auth | `absender@example.com` | | `SMTP_PASS` | Passwort des SMTP-Kontos | `secretpassword` | | `TO_EMAIL` | Ziel-Adresse fĂŒr eingegangene Date-Anfragen | `ziel@example.com` | | `FROM_EMAIL` | Absender-Adresse fĂŒr die Benachrichtigung | `absender@example.com` | *(Hinweis: Wenn `SMTP_HOST` oder `TO_EMAIL` leer bleiben, lĂ€uft der Server im Testmodus ohne E-Mail-Versand.)* ### 2. Einstellungen und Daten Die persistenten Daten liegen in getrennten JSON-Dateien: - **`adminPassword`**: Passwort fĂŒr die Terminverwaltung unter `/admin`. Ändere den Standardwert `change-me`, bevor du die Anwendung veröffentlichst. - **`activities.json`**: Liste von Objekten mit `name`, `icon` (Unicode Emoji), `type` (`short`, `long` oder `custom`) und optional `disabled` (`true` blendet die AktivitĂ€t vorĂŒbergehend aus). - **`dates_available.json`**: Liste von verfĂŒgbaren Tagen mit `date` (`YYYY-MM-DD`) und `type` (`short` oder `long`). - **`dates_booked.json`**: Strukturierte Buchungen mit `bookedAt`, `date`, `dateType`, `name` und den ausgewĂ€hlten AktivitĂ€ten inklusive Name, Typ und Icon. - **`names`**: Optional vordefinierte Namen zur Auswahl (ist die Liste leer, wird die Namensseite ĂŒbersprungen). Die Termin- und AktivitĂ€tenlisten lassen sich ĂŒber die passwortgeschĂŒtzte Verwaltung unter `http://localhost:8080/admin` bearbeiten. Das Passwort bleibt dabei auf dem Server und wird nicht an Besucher ausgeliefert. Bei Docker Compose wird `/docker/data/date` als ein Volume nach `/app/config` eingebunden. Die vier JSON-Dateien mĂŒssen dort vor dem ersten Start vorhanden sein. Du kannst sie aus dem Projektordner initialisieren: ```bash mkdir -p /docker/data/date cp config/appsettings.json /docker/data/date/appsettings.json cp config/activities.json /docker/data/date/activities.json cp config/dates_available.json /docker/data/date/dates_available.json cp config/dates_booked.json /docker/data/date/dates_booked.json ``` Wenn bisher `/docker/data/date/booked_dates.json` verwendet wurde, ĂŒbernimm die alten Buchungsdaten zuerst in `dates_booked.json`. Das neue Format speichert Buchungen als Objekte statt als reine Datumsstrings. --- ## 🚀 Inbetriebnahme ### Option A: Mit Docker Compose (Empfohlen) 1. `.env` wie oben beschrieben anpassen. 2. Container erstellen und starten: ```bash docker-compose up -d --build ``` 3. Die Anwendung ist unter `http://localhost:8080` erreichbar. #### Traefik / Reverse Proxy `docker-compose.yml` enthĂ€lt bereits Traefik-Labels. Passe bei Bedarf die Domain an: ```yaml - "traefik.http.routers.date-wizard.rule=Host(`date.deine-domain.de`)" ``` --- ### Option B: Direkt mit Go (Lokal) #### Voraussetzungen - Installed Go SDK (Version 1.22 oder neuer) 1. AbhĂ€ngigkeiten prĂŒfen & kompilieren: ```bash go run main.go ``` 2. Die Anwendung startet auf dem in `.env` definierten Port (z. B. `http://localhost:8080`). --- ## đŸ“± Ablauf der Anwendung 1. **Startseite (`index.html`)**: Spielerische Frage mit Ja/Nein-Interaktion. 2. **Datumsauswahl (`datetime.html`)**: Interaktiver Kalender mit Markierung von verfĂŒgbaren Tagen (`short`/`long`). 3. **AktivitĂ€tsauswahl (`activity.html`)**: Auswahl passender AktivitĂ€ten je nach verbleibender Zeit am gewĂ€hlten Tag. 4. **Namensauswahl (`name.html`)**: Abfrage "Wer bist du?". 5. **Checkout & BestĂ€tigung (`checkout.html`)**: Finale Übersicht und Absenden der Reservierung (ĂŒbertrĂ€gt Daten an `/api/submit` und löst den E-Mail-Versand aus).