JSON-Export & Import (Roundtrip-Serialisierung) #21

Closed
opened 2026-05-13 20:42:24 +00:00 by jreinemann-euris · 1 comment
jreinemann-euris commented 2026-05-13 20:42:24 +00:00 (Migrated from github.com)

Feature: JSON-Export & Import

Part of: #5
Depends on: #17

Ziel

Das gesamte Inventar kann verlustfrei als JSON-Datei exportiert und wieder importiert werden (Roundtrip-Garantie).

Scope

  • ExportData: kotlinx.serialization-Datenklasse mit allen Items, Categories, Locations, Settings
  • ImportExportRepository: exportToJson(): String, importFromJson(json: String)
  • Export: liest alle Daten aus Room, serialisiert mit kotlinx.serialization
  • Import: deserialisiert JSON, schreibt alle Entities in Room (upsert-Strategie)
  • Dateihandling: Uri-basiert (ACTION_CREATE_DOCUMENT / ACTION_OPEN_DOCUMENT) – vorbereitet, aber noch nicht verdrahtet (→ Block 6)

Technische Hinweise

  • Package: de.krisenvorrat.app.data.export
  • @Serializable-Annotationen auf allen Export-Datenklassen
  • ISO-8601-Format für expiryDate (kompatibel mit LocalDate TypeConverter)
  • Import-Strategie: insertOrReplace für alle Entities
  • JSON-Format-Version als Metafeld in ExportData (für spätere Migration)

Akzeptanzkriterien

  • ExportData-Klassen kompilieren mit kotlinx.serialization
  • Export produziert valides JSON mit allen Entities
  • Import liest JSON und schreibt alle Entities korrekt in Room
  • Tests: Roundtrip-Test (exportToJson → clear DB → importFromJson → Daten identisch)
## Feature: JSON-Export & Import Part of: #5 Depends on: #17 ### Ziel Das gesamte Inventar kann verlustfrei als JSON-Datei exportiert und wieder importiert werden (Roundtrip-Garantie). ### Scope - `ExportData`: kotlinx.serialization-Datenklasse mit allen Items, Categories, Locations, Settings - `ImportExportRepository`: exportToJson(): String, importFromJson(json: String) - Export: liest alle Daten aus Room, serialisiert mit kotlinx.serialization - Import: deserialisiert JSON, schreibt alle Entities in Room (upsert-Strategie) - Dateihandling: Uri-basiert (ACTION_CREATE_DOCUMENT / ACTION_OPEN_DOCUMENT) – vorbereitet, aber noch nicht verdrahtet (→ Block 6) ### Technische Hinweise - Package: `de.krisenvorrat.app.data.export` - `@Serializable`-Annotationen auf allen Export-Datenklassen - ISO-8601-Format für expiryDate (kompatibel mit LocalDate TypeConverter) - Import-Strategie: `insertOrReplace` für alle Entities - JSON-Format-Version als Metafeld in ExportData (für spätere Migration) ### Akzeptanzkriterien - [ ] ExportData-Klassen kompilieren mit kotlinx.serialization - [ ] Export produziert valides JSON mit allen Entities - [ ] Import liest JSON und schreibt alle Entities korrekt in Room - [ ] Tests: Roundtrip-Test (exportToJson → clear DB → importFromJson → Daten identisch)
jreinemann-euris commented 2026-05-13 22:20:18 +00:00 (Migrated from github.com)

Abgeschlossen (2026-05-13)

Zyklen: 2 (1 Basis-Implementierung + 1 Review-Korrekturzyklus)
Tests: 29 Tests, 0 Fehler (5 neue + 24 bestehende)

Implementierte Artefakte

  • \ExportData\ + 4 Export-DTOs (\CategoryExport, \LocationExport, \ItemExport, \SettingExport): @Serializable, Versionsfeld @EncodeDefault(Mode.ALWAYS)\
  • \ImportExportRepository: Interface mit \exportToJson(): String\ und \importFromJson(json: String): Result\
  • \ImportExportRepositoryImpl: Export via \Flow.first(), Import mit atomarer \DatabaseTransaction,
    unCatching\ + Versions-Check
  • \DatabaseTransaction: Funktionales Interface für testbare Transaktion, in DI via \db.withTransaction\ gebunden
  • @Upsert upsertAll()\ in allen 4 DAOs
  • DI-Binding in \RepositoryModule\ + \DatabaseModule\
  • \ImportExportRepositoryImplTest: 5 Unit-Tests (Roundtrip, ISO-8601, Fehlerfall, Versionsfehler)

Abweichungen

  • \ignoreUnknownKeys = true\ gesetzt (Vorwärtskompatibilität)
## Abgeschlossen (2026-05-13) **Zyklen:** 2 (1 Basis-Implementierung + 1 Review-Korrekturzyklus) **Tests:** ✅ 29 Tests, 0 Fehler (5 neue + 24 bestehende) ### Implementierte Artefakte - ✅ \ExportData\ + 4 Export-DTOs (\CategoryExport\, \LocationExport\, \ItemExport\, \SettingExport\): \@Serializable\, Versionsfeld \@EncodeDefault(Mode.ALWAYS)\ - ✅ \ImportExportRepository\: Interface mit \exportToJson(): String\ und \importFromJson(json: String): Result<Unit>\ - ✅ \ImportExportRepositoryImpl\: Export via \Flow.first()\, Import mit atomarer \DatabaseTransaction\, \ unCatching\ + Versions-Check - ✅ \DatabaseTransaction\: Funktionales Interface für testbare Transaktion, in DI via \db.withTransaction\ gebunden - ✅ \@Upsert upsertAll()\ in allen 4 DAOs - ✅ DI-Binding in \RepositoryModule\ + \DatabaseModule\ - ✅ \ImportExportRepositoryImplTest\: 5 Unit-Tests (Roundtrip, ISO-8601, Fehlerfall, Versionsfehler) ### Abweichungen - \ignoreUnknownKeys = true\ gesetzt (Vorwärtskompatibilität)
Sign in to join this conversation.
No description provided.