Files
fotospiel-app/docs/prp/tenant-app-specs/settings-config.md

6.2 KiB
Raw Blame History

Settings und Konfiguration für die Tenant Admin App

Status

  • Version: 1.0.0 (2025-09-13)
  • Fokus: App-interne und tenant-spezifische Einstellungen; Integration mit Capacitor-Plugins.

App-interne Settings

Diese Settings werden lokal in der App gespeichert (via Capacitor Preferences oder IndexedDB) und beeinflussen das Verhalten der App:

Core App Settings

  • language: String (default: 'de') UI-Sprache; Sync mit User-Locale.
  • themeMode: String ('system' | 'light' | 'dark') Dark Mode-Präferenz; Framework7-Theming.
  • offlineMode: Boolean (default: true) Aktiviert Offline-Caching und Background-Sync.
  • pushNotifications: Boolean (default: true) Erlaubt Push-Registrierung.
  • autoSyncInterval: Number (default: 300) Sekunden bis automatischer Sync (min: 60).
  • maxPhotoCache: Number (default: 100) Anzahl gecachter Photos pro Event.

User-spezifische Settings

  • notificationPreferences: Object
    • newPhotos: Boolean Benachrichtigung bei neuen Uploads.
    • eventUpdates: Boolean Bei Event-Änderungen (z.B. Veröffentlicht).
    • lowCredits: Boolean Warnung bei < 2 Credits.
  • privacySettings: Object
    • shareAnalytics: Boolean (default: false) Anonyme Stats teilen.
    • dataRetention: Number (default: 30) Tage bis Auto-Delete von Cache.

Speicherung: Capacitor Preferences API (@capacitor/preferences) für sichere, persistente Speicherung. Bei Web-Fallback: localStorage mit Encryption (via Crypto API).

Tenant-spezifische Optionen

Diese werden über API (GET/PATCH /tenant/settings) geladen und überschreiben globale Defaults. Sie definieren das Verhalten für den Tenant und seine Events:

Theme & Branding

  • primaryColor: String (default: '#007AFF') Hauptfarbe (iOS-Blau); verwendet in Framework7 CSS-Vars (--f7-primary).
  • secondaryColor: String (default: '#5856D6') Sekundärfarbe für Buttons/Accents.
  • logoUrl: String Custom Logo für App-Banner (URL zu S3/CDN).
  • tenantName: String Anzeigename (z.B. "Müller Hochzeit"); in Dashboard-Banner.

Event Limits & Features

  • maxEventsPerMonth: Number (default: 5) Limit pro Monat (enforced via Credits).
  • maxPhotosPerEvent: Number (default: 1000) Soft-Limit; Warnung bei Überschreitung.
  • enableTasks: Boolean (default: true) Tasks-System aktivieren.
  • enableEmotions: Boolean (default: true) Emotions/Reactions erlauben.
  • autoApprovePhotos: Boolean (default: false) Neue Uploads sofort freigeben (Risiko: Spam).
  • legalPages: Object (von Backend geladen, siehe docs/prp/02-tenancy.md)
    • impressumUrl: String Pflicht in DE; Customizable Link.
    • privacyUrl: String Datenschutzerklärung.
    • agbUrl: String Allgemeine Geschäftsbedingungen.
  • gdprRetentionDays: Number (default: 30) Automatische Löschung alter Photos/Events.
  • contactEmail: String Support-Email für In-App-Feedback.

Notifications & Integration

  • pushEnabled: Boolean Tenant-weit Push aktivieren (erfordert Plugin-Registrierung).
  • stripePublicKey: String Für Client-side Checkout (aus Env, nicht persistent).
  • eventJoinDomain: String (default: 'events.fotospiel.app') Custom Domain für Guest-PWA.

API-Handling: Laden bei Login; Cache mit ETag; Update triggert UI-Refresh (z.B. Theme-Wechsel). Validation: Backend enforct Limits (z.B. Colors als HEX).

Capacitor-Plugins

Die App integriert folgende Plugins für native Features. Installation via npx cap add und Sync nach Build.

Essentielle Plugins

  1. @capacitor/preferences (v6+)

    • Zweck: Sichere Speicherung von App- und User-Settings.
    • Usage: Preferences.set({ key: 'themeMode', value: 'dark' }); Migrate von localStorage.
    • iOS/Android: Keychain/Keystore für Encryption.
  2. @capacitor/push-notifications (v6+)

    • Zweck: Native Push für neue Photos, Event-Updates, Low-Credits.
    • Setup: Registrierung bei App-Start (PushNotifications.register()); Token an Backend senden (POST /tenant/devices).
    • Events: registrationToken (senden), pushNotificationReceived (In-App-Handling), pushNotificationActionPerformed (Tap-Actions).
    • Permissions: Request bei erstem Login; Fallback zu Web Push in PWA/TWA.
  3. @capacitor/storage (v6+)

    • Zweck: Offline-Caching von Events/Photos (als Alternative zu IndexedDB).
    • Usage: Storage.set({ key: 'event-123', value: JSON.stringify(data) }); Size-Limit beachten (50MB).
    • Fallback: Für Web; Sync mit Background-Sync.
  4. @capacitor/camera (v6+)

    • Zweck: Direkte Kamera-Zugriff für Event-QR-Scans oder schnelle Photo-Uploads (Admin-Selfies).
    • Usage: Camera.getPhoto({ quality: 90, allowEditing: true }); Upload via signed URL.
    • Permissions: Camera/Mic; Privacy-Manifest für App Store.
  5. @capacitor/network (v6+)

    • Zweck: Connectivity-Status überwachen; Offline-Modus triggern.
    • Usage: Network.addListener('networkStatusChange', handleOffline); UI-Update bei 'offline'.
    • Integration: Deaktiviere Sync-Buttons; Zeige Cached-Data.

Optionale Plugins

  • @capacitor/haptics (v6+): Vibration-Feedback bei Actions (z.B. Photo-Approve).
  • @capacitor/share (v6+): Teilen von Event-QR-Codes via Native Share-Sheet.
  • @capacitor/device (v6+): Geräte-Info (Model, OS) für Analytics; Token zu Backend.

Plugin-Konfiguration (capacitor.config.ts)

import { CapacitorConfig } from '@capacitor/cli';

const config: CapacitorConfig = {
  appId: 'com.fotospiel.tenantadmin',
  appName: 'Event Photo Admin',
  webDir: 'dist',
  bundledWebRuntime: false,
  plugins: {
    PushNotifications: {
      presentationOptions: ["badge", "sound", "alert"]
    },
    Camera: {
      permissions: {
        camera: true
      }
    }
  }
};

export default config;

Security & Privacy

  • Plugin-Permissions: Explizite Requests; Erkläre Zweck im Onboarding (z.B. "Push für neue Photos").
  • Data Storage: Kein PII in Preferences; Tokens encrypted (siehe Auth-Specs).
  • App Store Compliance: Privacy Manifest mit Usage-Descriptions (z.B. NSPhotoLibraryUsageDescription).

Für detailliertes Packaging siehe capacitor-setup.md; UI-Integration in pages-ui.md.