docs: spec erweitern — Toggle für Restricted-Medien (Admin + screen_user)

This commit is contained in:
Jesko Anschütz 2026-03-28 08:45:07 +01:00
parent 6d74a4aa30
commit 0feb3073af

View file

@ -13,6 +13,7 @@ Restricted Users können aktuell alle Medien des Tenants sehen und löschen. Sie
- **Admins** sehen alle Medien des Tenants — inkl. solcher ohne Besitzer (Legacy-Medien) - **Admins** sehen alle Medien des Tenants — inkl. solcher ohne Besitzer (Legacy-Medien)
- **screen_users** sehen alle Medien des Tenants (unverändert) - **screen_users** sehen alle Medien des Tenants (unverändert)
- Bestehende Medien (ohne Besitzer) bleiben erhalten und funktionieren weiter - Bestehende Medien (ohne Besitzer) bleiben erhalten und funktionieren weiter
- **Admins und screen_users** können Medien von Restricted Users ein-/ausblenden (Toggle). Default: **ausgeblendet**
## Ansatz: Filter im Store-Layer ## Ansatz: Filter im Store-Layer
@ -36,12 +37,15 @@ ALTER TABLE media_assets
## Go-Datenmodell ## Go-Datenmodell
`MediaAsset`-Struct bekommt ein neues Feld: `MediaAsset`-Struct bekommt zwei neue Felder:
```go ```go
CreatedByUserID string // leer = kein Besitzer (legacy) CreatedByUserID string // leer = kein Besitzer (legacy)
OwnerIsRestricted bool // true wenn Uploader Rolle "restricted" hat
``` ```
`OwnerIsRestricted` wird per `LEFT JOIN users` in der List-Query befüllt — kein separater Lookup nötig.
## Store-Layer ## Store-Layer
### List ### List
@ -50,8 +54,8 @@ CreatedByUserID string // leer = kein Besitzer (legacy)
func (s *MediaStore) List(ctx context.Context, tenantID, ownerUserID string) ([]MediaAsset, error) func (s *MediaStore) List(ctx context.Context, tenantID, ownerUserID string) ([]MediaAsset, error)
``` ```
- `ownerUserID == ""` keine Einschränkung, alle Tenant-Medien (Admin, screen_user) - `ownerUserID == ""` → alle Tenant-Medien (Admin, screen_user); `OwnerIsRestricted` per LEFT JOIN befüllt
- `ownerUserID != ""``AND created_by_user_id = $2` (Restricted User) - `ownerUserID != ""``AND m.created_by_user_id = $2` (Restricted User); kein JOIN nötig
### Create ### Create
@ -85,25 +89,33 @@ Neu:
## UI ## UI
### Admin-Ansicht: Badge für Medien ohne Besitzer ### Admin- und screen_user-Ansicht
In der Medienliste zeigt der Admin bei Einträgen mit leerem `CreatedByUserID` ein Badge: **Badge für Medien ohne Besitzer** (nur für Admins, da screen_users keine Legacy-Medien hochladen können):
```html ```html
<span class="tag is-warning is-light">Kein Besitzer</span> <span class="tag is-warning is-light">Kein Besitzer</span>
``` ```
Medien mit Besitzer erhalten kein Badge — der Benutzername wird nicht angezeigt. Wird angezeigt wenn `CreatedByUserID == ""`. Kein Benutzername wird angezeigt.
**Toggle: Restricted-Medien ein-/ausblenden** (Admin + screen_user):
- Button in der Medienliste: `Restricted-Medien anzeigen` (Bulma `button is-small`)
- Jedes Medium von einem Restricted-User erhält `data-owner-restricted="true"` im HTML
- Default: diese Elemente sind per CSS ausgeblendet (`display: none`)
- Vanilla JS: Toggle-Button wechselt eine CSS-Klasse auf dem Container; Items mit `data-owner-restricted="true"` werden sichtbar/unsichtbar
- Kein Page-Reload, kein Server-Request — rein clientseitig
### Restricted-User-Ansicht ### Restricted-User-Ansicht
Keine strukturellen Änderungen. Die Liste ist serverseitig gefiltert — der User sieht einfach weniger Einträge. Keine strukturellen Änderungen. Die Liste ist serverseitig gefiltert — der User sieht einfach nur eigene Einträge. Kein Toggle-Button sichtbar.
## Nicht im Scope ## Nicht im Scope
- Anzeige des Besitzernamens bei Medien - Anzeige des Besitzernamens bei Medien
- Übertragung von Medien zwischen Usern - Übertragung von Medien zwischen Usern
- Sichtbarkeit von Restricted-User-Medien für screen_users (sie sehen alles im Tenant) - Persistierung der Toggle-Einstellung (wird nicht gespeichert, reset bei Seitenladen)
## Betroffene Dateien ## Betroffene Dateien
@ -112,6 +124,6 @@ Keine strukturellen Änderungen. Die Liste ist serverseitig gefiltert — der Us
| `server/backend/db/migrations/00X_media_owner.sql` | neue Spalte `created_by_user_id` | | `server/backend/db/migrations/00X_media_owner.sql` | neue Spalte `created_by_user_id` |
| `server/backend/internal/store/store.go` | `MediaAsset`-Struct, `List()`-Signatur, `Create()` | | `server/backend/internal/store/store.go` | `MediaAsset`-Struct, `List()`-Signatur, `Create()` |
| `server/backend/internal/httpapi/manage/media.go` | Upload + Delete + List Handler | | `server/backend/internal/httpapi/manage/media.go` | Upload + Delete + List Handler |
| `manage/templates.go` | Badge für Medien ohne Besitzer | | `manage/templates.go` | Badge für Medien ohne Besitzer; Toggle-Button + JS; `data-owner-restricted` Attribut |
| `docs/SCHEMA.md` | neue Spalte dokumentieren | | `docs/SCHEMA.md` | neue Spalte dokumentieren |
| `docs/API-ENDPOINTS.md` | ggf. List-Endpoint-Verhalten dokumentieren | | `docs/API-ENDPOINTS.md` | ggf. List-Endpoint-Verhalten dokumentieren |