Adds a one-way push (ApiCore -> M365) of Aufgaben/Durchsichten/ Behandlungen/Fütterungen/Ernten/Königinnen-Zuordnungen into the calendar of a Microsoft 365 group, via the Graph API. - CalendarSyncModule (app-only client-credentials Graph auth, separate from the interactive SSO app registration; new env vars M365_CALENDAR_TENANT_ID/_CLIENT_ID/_CLIENT_SECRET). - Outbox + minute-interval cron worker (CalendarSyncOutboxEntry) instead of a synchronous push, since Graph calls are too slow/flaky to block a domain create request on; failed syncs retry up to 5 times. - Per-source-type toggle plus a group-ID field, configurable in Verwaltung > Automatisierung > Kalender-Sync (Verwaltung > Backup, an env var still wins on those fields where one applies to related config). - Hooked into Tasks/Inspections/Treatments/Feedings/Harvests/Queens at their existing create (and Task update/complete) points; entries render as all-day Graph events to avoid timezone ambiguity. - Documents the design decision in ARCHITECTURE.md (Annahme 9), since this is a net-new capability the lastenheft doesn't scope. Co-Authored-By: Claude Sonnet 5 <[email protected]>
69 lines
3.4 KiB
Bash
69 lines
3.4 KiB
Bash
# Kopieren nach .env und mit echten Werten befuellen. .env ist gitignored.
|
|
|
|
DATABASE_URL="postgresql://user:password@localhost:5432/apicore?schema=public"
|
|
|
|
# Mindestens 32 Zeichen (server-seitig erzwungen, siehe main.ts) - signiert
|
|
# jedes Access-/MFA-/SSO-Token UND verschluesselt gespeicherte TOTP-Secrets.
|
|
# Erzeugen z.B. mit: openssl rand -hex 32
|
|
JWT_ACCESS_SECRET="change-me-to-a-random-value-at-least-32-characters-long"
|
|
JWT_REFRESH_SECRET="change-me-refresh-secret"
|
|
JWT_ACCESS_EXPIRES_IN="15m"
|
|
JWT_REFRESH_EXPIRES_IN="7d"
|
|
|
|
PORT=3001
|
|
FRONTEND_ORIGIN="http://localhost:3000"
|
|
|
|
# Refresh-token cookie requires HTTPS by default. Set to "false" only for
|
|
# local HTTP development - every real deployment must leave this unset (or
|
|
# "true").
|
|
COOKIE_SECURE=false
|
|
|
|
# Lokales Verzeichnis fuer hochgeladene Dokumente/Bilder (Modul 29).
|
|
# Bei horizontaler Skalierung (>1 Replica) muss dies auf ein geteiltes
|
|
# Volume (z.B. ReadWriteMany-PVC) zeigen, siehe ARCHITECTURE.md Annahme 7.
|
|
DOCUMENTS_STORAGE_PATH="./uploads"
|
|
|
|
# Automatische Backups (Modul Backup). Alle drei Werte sind auch ueber die
|
|
# GUI (Verwaltung > Backup) konfigurierbar - eine hier gesetzte Env-Variable
|
|
# hat aber IMMER Vorrang vor dem GUI-Wert, pro Feld einzeln. Ohne Pfad
|
|
# (weder Env noch GUI) bleibt der Zeitplan deaktiviert (nur manueller
|
|
# Export/Import ueber die UI verfuegbar).
|
|
# Bei horizontaler Skalierung (>1 Replica) muss der Pfad auf ein geteiltes
|
|
# Volume zeigen (wie DOCUMENTS_STORAGE_PATH), sonst sieht jede Replica nur
|
|
# ihre eigenen Backup-Dateien und die Lauf-Erkennung zwischen Replicas greift
|
|
# nicht.
|
|
BACKUP_STORAGE_PATH="./backups"
|
|
# Cron-Ausdruck (Standard: taeglich um 03:00 Uhr).
|
|
BACKUP_CRON_SCHEDULE="0 3 * * *"
|
|
# Wie viele der neuesten Backup-Dateien behalten werden, aeltere werden nach
|
|
# jedem Lauf geloescht (Standard: 14).
|
|
BACKUP_RETENTION_COUNT=14
|
|
|
|
# Entra ID SSO. Ohne alle vier Werte bleibt SSO deaktiviert
|
|
# (GET /api/v1/auth/sso/status meldet enabled: false, kein Fehler beim Start).
|
|
# OIDC_ISSUER_URL ist die v2.0-Metadaten-URL des Tenants, OIDC_REDIRECT_URI
|
|
# muss exakt der in der App-Registrierung hinterlegten Redirect-URI entsprechen.
|
|
OIDC_ISSUER_URL="https://login.microsoftonline.com/<tenant-id>/v2.0"
|
|
OIDC_CLIENT_ID="change-me-entra-client-id"
|
|
OIDC_CLIENT_SECRET="change-me-entra-client-secret"
|
|
OIDC_REDIRECT_URI="http://localhost:3001/api/v1/auth/sso/callback"
|
|
|
|
# M365-Kalender-Synchronisation (Modul Kalender). Eintraege (Aufgaben,
|
|
# Durchsichten, Behandlungen, Fuetterungen, Ernten, Koeniginnen-Zuordnungen)
|
|
# werden einseitig (ApiCore -> M365) in den Kalender einer Microsoft-365-
|
|
# Gruppe uebertragen. Eigene, separate App-Registrierung in Azure/Entra
|
|
# (NICHT dieselbe wie OIDC_CLIENT_ID oben) mit Application-Permission
|
|
# "Calendars.ReadWrite" (Admin-Consent noetig), Client-Credentials-Flow.
|
|
# Ohne alle drei Werte bleibt die Synchronisation deaktiviert. Zusaetzlich
|
|
# muss die Synchronisation UND die jeweilige Gruppen-ID in der GUI
|
|
# (Verwaltung > Automatisierung > Kalender-Sync) aktiviert/gesetzt werden -
|
|
# diese drei Env-Variablen allein reichen nicht.
|
|
M365_CALENDAR_TENANT_ID="change-me-m365-tenant-id"
|
|
M365_CALENDAR_CLIENT_ID="change-me-m365-client-id"
|
|
M365_CALENDAR_CLIENT_SECRET="change-me-m365-client-secret"
|
|
|
|
# Swagger-UI unter /api/v1/docs ist per Default deaktiviert, da sie das
|
|
# gesamte API-Schema ungeschuetzt (kein JwtAuthGuard) preisgeben wuerde.
|
|
# Nur fuer lokale Entwicklung/Debugging explizit aktivieren.
|
|
ENABLE_SWAGGER=false
|