feat(app): ResourceEntity + Dao + Repository + DB-Migration 8→9 #121

Closed
opened 2026-05-18 19:53:46 +00:00 by jreinemann-euris · 0 comments
jreinemann-euris commented 2026-05-18 19:53:46 +00:00 (Migrated from github.com)

Feature: App – ResourceEntity + ResourceDao + ResourceRepository + DB-Migration 8→9

Part of: #117
Depends on: #118

Ziel

Ressourcen werden lokal in Room gecacht, der Server-Katalog kann refresht werden, und einzelne Ressourcen können per JWT heruntergeladen werden.

Scope

  • ResourceEntity.kt (@Entity(tableName = "resources")) – Felder analog zu ResourceDto, Tags als String (JSON-Array via TypeConverter)
  • ResourceDao.kt (@Dao) mit: getAll(): Flow<List<ResourceEntity>>, insertAll(...), deleteAll(), getByGuid(guid: String): ResourceEntity?
  • TypeConverter für List<String> ↔ JSON-String in Converters.kt (falls noch nicht vorhanden)
  • ResourceRepository (Interface) + ResourceRepositoryImpl (@Inject):
    • getAll(): Flow<List<ResourceDto>>
    • refreshFromServer() – GET /api/resources → Room komplett ersetzen (deleteAll + insertAll)
    • downloadResource(guid: String): ByteArray – GET /api/resources/{guid}/download (mit JWT)
  • DB-Migration: BollwerkDatabase Version 8 → 9, @AutoMigration(from = 8, to = 9)
  • DI: @Provides ResourceRepository in DataModule.kt

Technische Hinweise

  • Muster: ItemRepositoryImpl.kt, ItemEntity.kt, ItemDao.kt
  • HTTP-Client für downloadResource(): bestehenden ApiClient/HttpClient nutzen (JWT wird automatisch mitgeschickt)
  • refreshFromServer() ist nicht transaktional im Bezug auf Offline-Sync (keine PendingSyncOp nötig – read-only vom Server)

Akzeptanzkriterien

  • ResourceEntity ist in BollwerkDatabase eingetragen (Version 9)
  • @AutoMigration(from = 8, to = 9) läuft ohne Datenverlust auf bestehenden DBs
  • refreshFromServer() ersetzt lokalen Katalog vollständig
  • getAll() liefert Live-Updates als Flow
  • downloadResource() gibt Bytes zurück (wirft bei Fehler eine Exception)
  • Tests: ResourceDao mit In-Memory-Room-Datenbank
## Feature: App – ResourceEntity + ResourceDao + ResourceRepository + DB-Migration 8→9 Part of: #117 Depends on: #118 ### Ziel Ressourcen werden lokal in Room gecacht, der Server-Katalog kann refresht werden, und einzelne Ressourcen können per JWT heruntergeladen werden. ### Scope - `ResourceEntity.kt` (`@Entity(tableName = "resources")`) – Felder analog zu `ResourceDto`, Tags als `String` (JSON-Array via TypeConverter) - `ResourceDao.kt` (`@Dao`) mit: `getAll(): Flow<List<ResourceEntity>>`, `insertAll(...)`, `deleteAll()`, `getByGuid(guid: String): ResourceEntity?` - TypeConverter für `List<String>` ↔ JSON-String in `Converters.kt` (falls noch nicht vorhanden) - `ResourceRepository` (Interface) + `ResourceRepositoryImpl` (@Inject): - `getAll(): Flow<List<ResourceDto>>` - `refreshFromServer()` – GET /api/resources → Room komplett ersetzen (deleteAll + insertAll) - `downloadResource(guid: String): ByteArray` – GET /api/resources/{guid}/download (mit JWT) - DB-Migration: `BollwerkDatabase` Version 8 → 9, `@AutoMigration(from = 8, to = 9)` - DI: `@Provides ResourceRepository` in `DataModule.kt` ### Technische Hinweise - Muster: `ItemRepositoryImpl.kt`, `ItemEntity.kt`, `ItemDao.kt` - HTTP-Client für `downloadResource()`: bestehenden `ApiClient`/`HttpClient` nutzen (JWT wird automatisch mitgeschickt) - `refreshFromServer()` ist nicht transaktional im Bezug auf Offline-Sync (keine `PendingSyncOp` nötig – read-only vom Server) ### Akzeptanzkriterien - [ ] `ResourceEntity` ist in `BollwerkDatabase` eingetragen (Version 9) - [ ] `@AutoMigration(from = 8, to = 9)` läuft ohne Datenverlust auf bestehenden DBs - [ ] `refreshFromServer()` ersetzt lokalen Katalog vollständig - [ ] `getAll()` liefert Live-Updates als Flow - [ ] `downloadResource()` gibt Bytes zurück (wirft bei Fehler eine Exception) - [ ] Tests: `ResourceDao` mit In-Memory-Room-Datenbank
Sign in to join this conversation.
No description provided.