plan(ressourcen): Ressourcen-Verteilsystem - Planung + Arbeitspakete #117

Closed
opened 2026-05-18 19:47:11 +00:00 by jreinemann-euris · 1 comment
jreinemann-euris commented 2026-05-18 19:47:11 +00:00 (Migrated from github.com)

Ziel

Neue Funktion "Ressourcen": Authenticated User können einen server-verwalteten Katalog von Dateien (epub, pdf, zip, 7z) einsehen, filtern und per Knopfdruck herunterladen ("Öffnen mit"-Dialog). Nur Admins können Ressourcen anlegen.


Zu klärende Entscheidungen (vor Implementierung)

# Frage Empfehlung
1 Ist der Katalog öffentlich oder nur für eingeloggte User? Nur authentifiziert (wie Inventar)
2 Offline: zuletzt gecachten Katalog anzeigen oder leere Liste? Gecachten Katalog aus Room anzeigen
3 Tags: vordefinierte Liste oder frei vom Admin vergeben? Frei (Admin tippt beim Anlegen)
4 Welche Filter/Sortieroptionen genau? Tags (Multi), Titel-Suche, Datum ↑↓, Größe ↑↓
5 Datei-Storage auf VPS: Verzeichnis oder Object Storage? /opt/bollwerk/resources/ (Volume-Mount)
6 MAX_BODY_SIZE für Upload muss erhöht werden (aktuell 1 MB, Ressourcen bis "einige MB") z.B. 25 MB nur für Admin-Upload-Route

Ressourcen-Metadaten

Pflichtfelder:

Feld Typ Beschreibung
guid UUID Primärschlüssel, stabil über Updates
title String Anzeigename
description String Freitext-Beschreibung
tags List<String> Mehrere möglich (gurps, novel, rulebook, map, …)
fileFormat String epub, pdf, zip, 7z (für Icon + MIME-Typ)
mimeType String z.B. application/epub+zip – für Android "Öffnen mit"
fileSize Long Bytes – vor Download anzeigen
releaseDate LocalDate? Erscheinungsdatum des Werks
createdAt Long (epoch ms) Wann in Katalog aufgenommen
updatedAt Long (epoch ms) Letzte Änderung

Optionale Felder (Vorschlag):

Feld Typ Beschreibung
author String? Autor / Herausgeber
language String? ISO 639-1: de, en, …
edition String? Auflage/Version (z.B. "4th Edition")
downloadUrl String Vom Server berechnet: /api/resources/{guid}/download

Arbeitspakete

[S] Server – DB-Schema (Postgres)

  • Tabelle resources: alle Pflicht- + Optionalfelder
  • Tabelle resource_tags oder JSON-Array-Spalte für Tags
  • Exposé-Query für Katalog

[S] Server – REST-API

  • GET /api/resources → Katalog als JSON-Array (authenticated)
  • GET /api/resources/{guid}/download → Datei-Stream (authenticated)
  • POST /api/admin/resources → Neue Ressource anlegen + Datei hochladen (multipart, Admin-only)
  • PUT /api/admin/resources/{guid} → Metadaten aktualisieren
  • DELETE /api/admin/resources/{guid} → Ressource + Datei löschen

[S] Server – Datei-Storage

  • Verzeichnis /opt/bollwerk/resources/ als Docker-Volume
  • Dateiname: {guid}.{ext} (stabil, kein Konflikt)
  • MAX_BODY_SIZE-Ausnahme für Admin-Upload-Route

[A] App – Room-Schema + Repository

  • ResourceEntity + ResourceDao (Katalog lokal cachen)
  • ResourceRepository mit getAll(), refreshFromServer(), downloadResource(guid)
  • Beim App-Start: Katalog im Hintergrund refreshen

[A] App – Navigation + Ressourcen-Screen

  • Neuer Eintrag "Ressourcen" in der Hauptnavigation
  • ResourceListScreen: sortierbare, filterbare Liste
    • Filter: Tags (Multi-Select Chips), Freitext-Suche
    • Sortierung: Datum, Größe, Titel
    • Refresh-Button in der TopBar
  • ResourceListViewModel

[A] App – Download + "Öffnen mit"

  • Download-Endpoint aufrufen (mit JWT)
  • Datei in context.cacheDir speichern
  • FileProvider + Intent.ACTION_VIEW mit korrektem MIME-Typ
  • Fortschrittsanzeige (z.B. CircularProgressIndicator oder LinearProgressIndicator)
  • Fehlerbehandlung (kein Netz, Datei nicht gefunden)

[A] App – Ressourcen-Karte

  • Titel, Beschreibung (2 Zeilen), Tags als Chips, Dateigröße, Format-Icon
  • Download-Button

Abnahme-Kriterien (Gesamt-Feature)

  • Katalog wird beim App-Start im Hintergrund geladen und lokal gecacht
  • Refresh-Button in der Ressourcen-Übersicht aktualisiert den Katalog
  • Offline: zuletzt gecachter Katalog wird angezeigt
  • Filter nach Tags (Multi), Freitext-Suche, Sortierung nach Datum/Größe/Titel
  • Download öffnet Android "Öffnen mit"-Dialog mit korrektem MIME-Typ
  • Dateigröße vor dem Download sichtbar
  • Nur Admins können Ressourcen anlegen (API-seitig gesichert)
  • Build + Tests grün
## Ziel Neue Funktion "Ressourcen": Authenticated User können einen server-verwalteten Katalog von Dateien (epub, pdf, zip, 7z) einsehen, filtern und per Knopfdruck herunterladen ("Öffnen mit"-Dialog). Nur Admins können Ressourcen anlegen. --- ## Zu klärende Entscheidungen (vor Implementierung) | # | Frage | Empfehlung | |---|---|---| | 1 | Ist der Katalog öffentlich oder nur für eingeloggte User? | Nur authentifiziert (wie Inventar) | | 2 | Offline: zuletzt gecachten Katalog anzeigen oder leere Liste? | Gecachten Katalog aus Room anzeigen | | 3 | Tags: vordefinierte Liste oder frei vom Admin vergeben? | Frei (Admin tippt beim Anlegen) | | 4 | Welche Filter/Sortieroptionen genau? | Tags (Multi), Titel-Suche, Datum ↑↓, Größe ↑↓ | | 5 | Datei-Storage auf VPS: Verzeichnis oder Object Storage? | `/opt/bollwerk/resources/` (Volume-Mount) | | 6 | `MAX_BODY_SIZE` für Upload muss erhöht werden (aktuell 1 MB, Ressourcen bis "einige MB") | z.B. 25 MB nur für Admin-Upload-Route | --- ## Ressourcen-Metadaten Pflichtfelder: | Feld | Typ | Beschreibung | |---|---|---| | `guid` | UUID | Primärschlüssel, stabil über Updates | | `title` | String | Anzeigename | | `description` | String | Freitext-Beschreibung | | `tags` | List\<String\> | Mehrere möglich (gurps, novel, rulebook, map, …) | | `fileFormat` | String | epub, pdf, zip, 7z (für Icon + MIME-Typ) | | `mimeType` | String | z.B. `application/epub+zip` – für Android "Öffnen mit" | | `fileSize` | Long | Bytes – vor Download anzeigen | | `releaseDate` | LocalDate? | Erscheinungsdatum des Werks | | `createdAt` | Long (epoch ms) | Wann in Katalog aufgenommen | | `updatedAt` | Long (epoch ms) | Letzte Änderung | Optionale Felder (Vorschlag): | Feld | Typ | Beschreibung | |---|---|---| | `author` | String? | Autor / Herausgeber | | `language` | String? | ISO 639-1: `de`, `en`, … | | `edition` | String? | Auflage/Version (z.B. "4th Edition") | | `downloadUrl` | String | Vom Server berechnet: `/api/resources/{guid}/download` | --- ## Arbeitspakete ### [S] Server – DB-Schema (Postgres) - Tabelle `resources`: alle Pflicht- + Optionalfelder - Tabelle `resource_tags` oder JSON-Array-Spalte für Tags - Exposé-Query für Katalog ### [S] Server – REST-API - `GET /api/resources` → Katalog als JSON-Array (authenticated) - `GET /api/resources/{guid}/download` → Datei-Stream (authenticated) - `POST /api/admin/resources` → Neue Ressource anlegen + Datei hochladen (multipart, Admin-only) - `PUT /api/admin/resources/{guid}` → Metadaten aktualisieren - `DELETE /api/admin/resources/{guid}` → Ressource + Datei löschen ### [S] Server – Datei-Storage - Verzeichnis `/opt/bollwerk/resources/` als Docker-Volume - Dateiname: `{guid}.{ext}` (stabil, kein Konflikt) - `MAX_BODY_SIZE`-Ausnahme für Admin-Upload-Route ### [A] App – Room-Schema + Repository - `ResourceEntity` + `ResourceDao` (Katalog lokal cachen) - `ResourceRepository` mit `getAll()`, `refreshFromServer()`, `downloadResource(guid)` - Beim App-Start: Katalog im Hintergrund refreshen ### [A] App – Navigation + Ressourcen-Screen - Neuer Eintrag "Ressourcen" in der Hauptnavigation - `ResourceListScreen`: sortierbare, filterbare Liste - Filter: Tags (Multi-Select Chips), Freitext-Suche - Sortierung: Datum, Größe, Titel - Refresh-Button in der TopBar - `ResourceListViewModel` ### [A] App – Download + "Öffnen mit" - Download-Endpoint aufrufen (mit JWT) - Datei in `context.cacheDir` speichern - `FileProvider` + `Intent.ACTION_VIEW` mit korrektem MIME-Typ - Fortschrittsanzeige (z.B. CircularProgressIndicator oder LinearProgressIndicator) - Fehlerbehandlung (kein Netz, Datei nicht gefunden) ### [A] App – Ressourcen-Karte - Titel, Beschreibung (2 Zeilen), Tags als Chips, Dateigröße, Format-Icon - Download-Button --- ## Abnahme-Kriterien (Gesamt-Feature) - [ ] Katalog wird beim App-Start im Hintergrund geladen und lokal gecacht - [ ] Refresh-Button in der Ressourcen-Übersicht aktualisiert den Katalog - [ ] Offline: zuletzt gecachter Katalog wird angezeigt - [ ] Filter nach Tags (Multi), Freitext-Suche, Sortierung nach Datum/Größe/Titel - [ ] Download öffnet Android "Öffnen mit"-Dialog mit korrektem MIME-Typ - [ ] Dateigröße vor dem Download sichtbar - [ ] Nur Admins können Ressourcen anlegen (API-seitig gesichert) - [ ] Build + Tests grün
jreinemann-euris commented 2026-05-18 19:55:05 +00:00 (Migrated from github.com)

Planung abgeschlossen – Sub-Tickets erstellt

Alle Arbeitspakete wurden als [F]-Tickets angelegt (Reihenfolge = Implementierungsreihenfolge):

# Titel Order
#118 feat(shared): ResourceDto im Shared-Modul 1550
#119 feat(server): Resources-Tabelle (Postgres) + Datei-Storage 1560
#120 feat(server): REST-API für Ressourcen (CRUD + Download) 1570
#121 feat(app): ResourceEntity + Dao + Repository + DB-Migration 8→9 1580
#122 feat(app): ResourceListScreen + Navigation (BottomBar-Tab) 1590
#123 feat(app): Ressource herunterladen + 'Öffnen mit'-Dialog 1600
## Planung abgeschlossen – Sub-Tickets erstellt Alle Arbeitspakete wurden als [F]-Tickets angelegt (Reihenfolge = Implementierungsreihenfolge): | # | Titel | Order | |---|---|---| | #118 | feat(shared): ResourceDto im Shared-Modul | 1550 | | #119 | feat(server): Resources-Tabelle (Postgres) + Datei-Storage | 1560 | | #120 | feat(server): REST-API für Ressourcen (CRUD + Download) | 1570 | | #121 | feat(app): ResourceEntity + Dao + Repository + DB-Migration 8→9 | 1580 | | #122 | feat(app): ResourceListScreen + Navigation (BottomBar-Tab) | 1590 | | #123 | feat(app): Ressource herunterladen + 'Öffnen mit'-Dialog | 1600 |
Sign in to join this conversation.
No description provided.