Account-Verwaltung
Account-Verwaltung
Abschnitt betitelt „Account-Verwaltung“- Account-Modell
- Multi-Tenancy
- Self-Service
- Team-Verwaltung
- Password-Reset
- Sprachumschaltung
- Implementierte Endpoints
- Code-Struktur
Account-Modell
Abschnitt betitelt „Account-Modell“Tabelle account
Abschnitt betitelt „Tabelle account“| Spalte | Typ | Beschreibung |
|---|---|---|
| id | UUID (UUIDv7) | Primary Key |
| password_hash | VARCHAR | bcrypt Hash |
| display_name | VARCHAR(255) | Anzeigename |
| role | ENUM | agency_owner, agency_employee, tenant_admin, tenant_member |
| tenant_id | UUID (nullable) | NULL fuer Agency-Mitarbeiter, gesetzt fuer Tenant-User |
| active | BOOLEAN | Account-Sperre |
| twofactor_email | BOOLEAN | 2FA immer erzwingen (unabhaengig von Device) |
| locale | VARCHAR(5) | CMS-Sprache (Default: de) |
| Audit-Felder | created_at, created_by, updated_at, updated_by, row_version, row_period |
E-Mail-Adressen
Abschnitt betitelt „E-Mail-Adressen“E-Mail-Adressen sind NICHT direkt am Account gespeichert. Stattdessen:
emailTabelle: Deduplizierte Adressen, SHA-256/BLAKE2b Hashemail_relationTabelle: Verknuepft E-Mail mit Entitaet (Account, Kontakt, etc.)- Login-Lookup:
email_relation(type:account_primary) →email.id→account.id - Unterstuetzte Typen:
account_primary,account_primary_change,contact_request,contact_confirmation
Multi-Tenancy
Abschnitt betitelt „Multi-Tenancy“Tabelle tenant
Abschnitt betitelt „Tabelle tenant“| Spalte | Typ | Beschreibung |
|---|---|---|
| id | UUID | Primary Key |
| name | VARCHAR | Firmenname |
| contact_name | VARCHAR | Ansprechpartner |
| contact_email | VARCHAR | Kontakt-E-Mail |
| slug | VARCHAR (unique) | URL-freundlicher Bezeichner |
| active | BOOLEAN | Tenant aktiv/inaktiv |
Rollen-Hierarchie
Abschnitt betitelt „Rollen-Hierarchie“| Rolle | Scope | Beschreibung |
|---|---|---|
| agency_owner | Global | Vollzugriff, verwaltet alles |
| agency_employee | Global | Agency-Mitarbeiter (eingeschraenkt) |
| tenant_admin | Eigener Tenant | Verwaltet eigene Tenant-User und Sites |
| tenant_member | Eigener Tenant | Bearbeitet Inhalte |
Route-Gruppen
Abschnitt betitelt „Route-Gruppen“| Prefix | Rollen | Beschreibung |
|---|---|---|
/api/public/* | Alle | Kein Auth noetig |
/api/protected/* | Alle eingeloggten | Logout, Profil |
/api/agency/* | agency_owner, agency_employee | Tenant-Verwaltung |
/api/client/* | tenant_admin, tenant_member | Eigene Site-Verwaltung |
/api/service/* | X-Service-Token | Astro Build (Template-Sync, Content) |
Self-Service (alle Rollen)
Abschnitt betitelt „Self-Service (alle Rollen)“| Funktion | Beschreibung |
|---|---|
| Profil bearbeiten | Display-Name und CMS-Sprache (de/en) aendern |
| Passwort aendern | Altes Passwort als Bestaetigung, neues Passwort setzen |
| Sessions einsehen | Aktive Sessions mit Erstellungsdatum, aktuelle Session markiert |
| Session beenden | Einzelne fremde Session terminieren |
| Alle anderen beenden | Alle Sessions ausser der aktuellen terminieren |
Team-Verwaltung (Admins)
Abschnitt betitelt „Team-Verwaltung (Admins)“| Funktion | agency_owner | tenant_admin |
|---|---|---|
| Accounts anlegen | alle Rollen | nur tenant_member |
| Accounts deaktivieren/reaktivieren | alle ausser sich selbst | eigene tenant_member |
| Password-Reset ausloesen | alle ausser sich selbst | eigene tenant_member |
| Accounts auflisten | alle | eigener Tenant |
Password-Reset (Admin-initiiert)
Abschnitt betitelt „Password-Reset (Admin-initiiert)“- Admin loest Reset fuer Ziel-Account aus
- System generiert 6-stelligen kryptographischen Code (30 Min gueltig)
- Code wird per E-Mail an Ziel-Account gesendet
- Ziel-User gibt Code ein (oeffentliche Route, kein Login noetig)
- Nach Code-Verifikation: neues Passwort setzen
- Alle bestehenden Sessions werden terminiert
Account-Erstellung
Abschnitt betitelt „Account-Erstellung“- Neuer Account wird ohne Passwort erstellt
- Admin muss anschliessend Password-Reset ausloesen
- Ziel-User setzt Passwort ueber den Reset-Flow
Sprachumschaltung
Abschnitt betitelt „Sprachumschaltung“account.localeSpalte (VARCHAR(5), Default ‘de’)- Session-Response liefert
localemit - Frontend setzt
i18next.changeLanguage(locale)beim App-Start - Sprachwechsel im Profil aktualisiert sofort die UI-Sprache
- Vollstaendige DE + EN Uebersetzungen fuer alle UI-Strings
Implementierte Endpoints
Abschnitt betitelt „Implementierte Endpoints“| Methode | Pfad | Auth | Beschreibung |
|---|---|---|---|
| PUT | /api/protected/account/profile | Session | Profil bearbeiten |
| PUT | /api/protected/account/password | Session | Passwort aendern |
| GET | /api/protected/account/sessions | Session | Sessions auflisten |
| DELETE | /api/protected/account/sessions/{id} | Session | Session beenden |
| DELETE | /api/protected/account/sessions | Session | Alle anderen beenden |
| POST | /api/agency/team | Agency | Account anlegen |
| GET | /api/agency/team | Agency | Accounts auflisten |
| PUT | /api/agency/team/{id}/deactivate | Agency | Account deaktivieren |
| PUT | /api/agency/team/{id}/reactivate | Agency | Account aktivieren |
| POST | /api/agency/team/{id}/reset-password | Agency | Password-Reset |
| POST | /api/client/team | Client | Account anlegen |
| GET | /api/client/team | Client | Accounts auflisten |
| PUT | /api/client/team/{id}/deactivate | Client | Account deaktivieren |
| PUT | /api/client/team/{id}/reactivate | Client | Account aktivieren |
| POST | /api/client/team/{id}/reset-password | Client | Password-Reset |
| POST | /api/public/auth/verify-reset | — | Reset-Code pruefen |
| POST | /api/public/auth/complete-reset | — | Passwort zuruecksetzen |
Code-Struktur
Abschnitt betitelt „Code-Struktur“internal/feature/account/ # Self-Service├── usecase.go # UpdateProfile, ChangePassword, ListSessions, TerminateSession├── request.go # Request/Response Structs└── errors.go # ErrInvalidCurrentPassword, etc.
internal/feature/team/ # Admin-Verwaltung├── usecase.go # CreateAccount, ListAccounts, Deactivate, Reactivate, PasswordReset├── request.go # Request/Response Structs├── repository.go # Interfaces├── jet_repository.go # Jet + Raw SQL Implementierungen└── errors.go # ErrInsufficientPermission, etc.