rename: Krisenvorrat -> Bollwerk

- Package: de.krisenvorrat.* -> de.bollwerk.*
- Klassen: KrisenvorratApp/Database/Theme -> Bollwerk*
- ApplicationId: de.bollwerk.app
- Server: BOLLWERK_* Env-Vars, bollwerk HOCON-Config
- Docker: bollwerk-server/db/backup Container-Namen
- Room DB: bollwerk.db, SharedPrefs: bollwerk_secure_prefs
- Export-Dateien: bollwerk_export/inventar
- UI-Strings, HTML, Admin-UI: alle auf Bollwerk
- Docs, Skills, README angepasst
- Alle Tests gruen, Build erfolgreich
This commit is contained in:
Jens Reinemann 2026-05-17 17:44:02 +02:00
parent f1abc2cd23
commit a5f89e6a69
246 changed files with 1074 additions and 1074 deletions

View file

@ -2,7 +2,7 @@
## Projekt
**Krisenvorrat Inventar-App** Eine Android-App (Kotlin) zur Verwaltung eines Krisenvorrats-Inventars mit lokaler Datenhaltung und Sharing-Möglichkeit.
**Bollwerk Inventar-App** Eine Android-App (Kotlin) zur Verwaltung eines Bollwerks-Inventars mit lokaler Datenhaltung und Sharing-Möglichkeit.
## Technischer Stack

View file

@ -2,7 +2,7 @@
applyTo: "**/*.kt"
---
# Kotlin Coding Conventions Krisenvorrat App
# Kotlin Coding Conventions Bollwerk App
Diese Konventionen gelten für alle Kotlin-Dateien im Workspace.

View file

@ -138,7 +138,7 @@ Nach dem Anlegen **jedes** [T]- und [P]-Tickets **sofort** ausführen:
```powershell
# 1. Ticket zum Board hinzufügen
gh project item-add 2 --owner jreinemann-euris --url "https://github.com/jreinemann-euris/krisenvorrat/issues/<N>"
gh project item-add 2 --owner jreinemann-euris --url "https://github.com/jreinemann-euris/bollwerk/issues/<N>"
# 2. Bestehende Order-Werte abfragen (höchsten Wert ermitteln)
& ".github/skills/gh-tickets/next-ticket.ps1" | Out-Null # zeigt alle offenen Tickets mit Order

View file

@ -91,7 +91,7 @@ Nach dem Anlegen jedes [F]-Tickets **sofort** ausführen:
```powershell
# 1. Ticket zum Board hinzufügen
gh project item-add 2 --owner jreinemann-euris --url "https://github.com/jreinemann-euris/krisenvorrat/issues/<N>"
gh project item-add 2 --owner jreinemann-euris --url "https://github.com/jreinemann-euris/bollwerk/issues/<N>"
# 2. Bestehende Order-Werte abfragen (höchsten Wert ermitteln)
& ".github/skills/gh-tickets/next-ticket.ps1" | Out-Null # zeigt alle offenen Tickets mit Order

View file

@ -5,7 +5,7 @@ description: "Android-App bauen (assembleDebug/Release), Gradle-Kommandos, häuf
# Skill: Android Build
Baut die Krisenvorrat-Android-App mit Gradle. Handhabt bekannte Fallstricke auf diesem Windows-Setup.
Baut die Bollwerk-Android-App mit Gradle. Handhabt bekannte Fallstricke auf diesem Windows-Setup.
---
@ -63,7 +63,7 @@ Falls das Skript nicht verfügbar ist, gibt es **zwei verlässliche Varianten**:
#### Variante A via `execution_subagent` (empfohlen)
```
cd x:\krisenvorrat ; .\gradlew assembleDebug test
cd x:\bollwerk ; .\gradlew assembleDebug test
```
- `.\gradlew` (ohne `.bat`) funktioniert hier einwandfrei
@ -75,7 +75,7 @@ cd x:\krisenvorrat ; .\gradlew assembleDebug test
```powershell
$env:ANDROID_HOME = "C:\Users\JensR\AppData\Local\Android\Sdk"
cd "x:\krisenvorrat"
cd "x:\bollwerk"
.\gradlew.bat assembleDebug 2>&1 | Out-String
```

View file

@ -1,6 +1,6 @@
<#
.SYNOPSIS
Zentrales Entwicklungsskript für die Krisenvorrat Android-App.
Zentrales Entwicklungsskript für die Bollwerk Android-App.
.DESCRIPTION
Handhabt Build, Deploy und Emulator-Operationen.
@ -57,7 +57,7 @@ $PROJECT_DIR = $PSScriptRoot | Split-Path | Split-Path | Split-Path # .github/s
$APK_PATH = "$PROJECT_DIR\app\build\outputs\apk\debug\app-debug.apk"
$AVD_NAME = "S24Ultra_API35"
$GPU_MODE = "guest" # 'guest' = Software-Rendering im Gast (host/auto/swiftshader scheitern an fehlendem OpenGL Core Profile)
$PACKAGE = "de.krisenvorrat.app"
$PACKAGE = "de.bollwerk.app"
$ACTIVITY = "$PACKAGE/.MainActivity"
$BOOT_TIMEOUT = 300 # Sekunden (erster Boot eines neuen AVD kann >2min dauern)
$ADB_CONNECT_TIMEOUT = 120 # Sekunden auf ADB-Verbindung warten

View file

@ -5,7 +5,7 @@ description: "App auf echtes Android-Handy (Samsung S24 Ultra) deployen, USB-Deb
# Skill: Android Device (Samsung S24 Ultra)
Deployt die Krisenvorrat-App auf das physische Samsung Galaxy S24 Ultra.
Deployt die Bollwerk-App auf das physische Samsung Galaxy S24 Ultra.
---
@ -123,14 +123,14 @@ $adb = "C:\Users\JensR\AppData\Local\Android\Sdk\platform-tools\adb.exe"
$dev = "192.168.68.107:42539" # Port prüfen!
# 1. Build
cd X:\krisenvorrat
cd X:\bollwerk
.\gradlew.bat assembleDebug
# 2. Install
& $adb -s $dev install -r "app\build\outputs\apk\debug\app-debug.apk"
# 3. Launch
& $adb -s $dev shell am start -n de.krisenvorrat.app/.MainActivity
& $adb -s $dev shell am start -n de.bollwerk.app/.MainActivity
```
### App installieren
@ -144,19 +144,19 @@ cd X:\krisenvorrat
### App starten
```powershell
& $adb -s $dev shell am start -n de.krisenvorrat.app/.MainActivity
& $adb -s $dev shell am start -n de.bollwerk.app/.MainActivity
```
### App stoppen
```powershell
& $adb -s $dev shell am force-stop de.krisenvorrat.app
& $adb -s $dev shell am force-stop de.bollwerk.app
```
### Logcat (gefiltert auf App)
```powershell
& $adb -s $dev logcat --pid=$(& $adb -s $dev shell pidof de.krisenvorrat.app) -v time
& $adb -s $dev logcat --pid=$(& $adb -s $dev shell pidof de.bollwerk.app) -v time
```
### Screenshot vom Gerät
@ -173,7 +173,7 @@ cd X:\krisenvorrat
### App deinstallieren
```powershell
& $adb -s $dev uninstall de.krisenvorrat.app
& $adb -s $dev uninstall de.bollwerk.app
```
---
@ -206,7 +206,7 @@ Die App ist mit einem anderen Signaturschlüssel installiert.
**Lösung:**
```powershell
& $adb -d uninstall de.krisenvorrat.app
& $adb -d uninstall de.bollwerk.app
& $adb -d install "app\build\outputs\apk\debug\app-debug.apk"
```

View file

@ -5,7 +5,7 @@ description: "Android-Emulator starten, Apps installieren/starten, AVD verwalten
# Skill: Android Emulator
Verwaltet den Android-Emulator für die Krisenvorrat-App. Das Standard-AVD simuliert ein Samsung S24 Ultra.
Verwaltet den Android-Emulator für die Bollwerk-App. Das Standard-AVD simuliert ein Samsung S24 Ultra.
---
@ -90,19 +90,19 @@ Start-Sleep -Seconds 30
### App starten
```powershell
& $adb shell am start -n de.krisenvorrat.app/.MainActivity
& $adb shell am start -n de.bollwerk.app/.MainActivity
```
### App stoppen
```powershell
& $adb shell am force-stop de.krisenvorrat.app
& $adb shell am force-stop de.bollwerk.app
```
### Logcat (gefiltert)
```powershell
& $adb logcat --pid=$(& $adb shell pidof de.krisenvorrat.app) -v time
& $adb logcat --pid=$(& $adb shell pidof de.bollwerk.app) -v time
```
### Screenshot

View file

@ -5,7 +5,7 @@ description: "Konventionen für GitHub-Issues in diesem Workspace: Aufgabentyp-L
# Skill: GitHub Tickets (gh-tickets)
Dieses Dokument definiert die verbindlichen Konventionen für GitHub-Issues im Repository `jreinemann-euris/krisenvorrat`.
Dieses Dokument definiert die verbindlichen Konventionen für GitHub-Issues im Repository `jreinemann-euris/bollwerk`.
---
@ -58,7 +58,7 @@ Die Abarbeitungsreihenfolge wird über das **Project Board** gesteuert, nicht ü
| Eigenschaft | Wert |
| ------------- | ----------------------------------------------------------------- |
| Projekt-Name | `Krisenvorrat` |
| Projekt-Name | `Bollwerk` |
| Projekt-Nr | `2` |
| Owner | `jreinemann-euris` |
| Sortierfeld | `Order` (Number-Feld) |
@ -91,7 +91,7 @@ Ausgabe: `#68 [M] CRM: Erweiterte Kundensuche (Order: 120)`
```powershell
# Issue zum Board hinzufügen
gh project item-add 2 --owner jreinemann-euris --url "https://github.com/jreinemann-euris/krisenvorrat/issues/<N>"
gh project item-add 2 --owner jreinemann-euris --url "https://github.com/jreinemann-euris/bollwerk/issues/<N>"
# Order-Wert setzen (erfordert Item-ID und Field-ID)
gh project item-edit --id <ITEM_ID> --field-id <ORDER_FIELD_ID> --project-id <PROJECT_ID> --number <ORDER_VALUE>

View file

@ -24,7 +24,7 @@ param(
[string]$Status = "Todo"
)
$repo = "jreinemann-euris/krisenvorrat"
$repo = "jreinemann-euris/bollwerk"
$projectId = "PVT_kwHOCFqiJ84BXk9U"
$orderFieldId = "PVTF_lAHOCFqiJ84BXk9UzhSw4jo"
$statusFieldId = "PVTSSF_lAHOCFqiJ84BXk9UzhSw4es"

View file

@ -9,7 +9,7 @@
#>
param([int]$IssueNumber)
$repo = "jreinemann-euris/krisenvorrat"
$repo = "jreinemann-euris/bollwerk"
if ($IssueNumber -gt 0) {
# Variante A: Explizite Issue-Nummer

View file

@ -17,13 +17,13 @@ Dieser Skill deckt den vollständigen Workflow ab, um eine neue App-Version auf
```
App (lokal) VPS (195.246.231.210)
───────────── ─────────────────────
app/build.gradle.kts /opt/krisenvorrat/
versionCode / versionName ├── docker-compose.yml (KRISENVORRAT_APP_VERSION_CODE/NAME)
app/build.gradle.kts /opt/bollwerk/
versionCode / versionName ├── docker-compose.yml (BOLLWERK_APP_VERSION_CODE/NAME)
├── data/app-latest.apk (statisch ausgeliefert)
./gradlew assembleDebug └── Server-Container (Ktor)
→ app-debug.apk ├── GET / → Homepage mit QR-Code
├── GET /api/version → JSON {versionCode, versionName, apkUrl}
scp → /opt/krisenvorrat/data/ └── GET /static/* → Dateien aus data/
scp → /opt/bollwerk/data/ └── GET /static/* → Dateien aus data/
```
### Wie die Update-Prüfung funktioniert
@ -35,7 +35,7 @@ scp → /opt/krisenvorrat/data/ └── GET /static/* → Dateie
### Wie die Homepage funktioniert
- `GET /` liefert HTML mit QR-Code (via qrcodejs) + Download-Link auf `/static/app-latest.apk`
- Version wird aus `KRISENVORRAT_APP_VERSION_CODE` / `KRISENVORRAT_APP_VERSION_NAME` Env-Vars gelesen
- Version wird aus `BOLLWERK_APP_VERSION_CODE` / `BOLLWERK_APP_VERSION_NAME` Env-Vars gelesen
---
@ -58,7 +58,7 @@ Die APK liegt danach unter: `app/build/outputs/apk/debug/app-debug.apk`
### Schritt 3 APK auf VPS hochladen
```powershell
scp app/build/outputs/apk/debug/app-debug.apk root@195.246.231.210:/opt/krisenvorrat/data/app-latest.apk
scp app/build/outputs/apk/debug/app-debug.apk root@195.246.231.210:/opt/bollwerk/data/app-latest.apk
```
**Voraussetzung:** SSH-Agent muss laufen und Key geladen sein (siehe vps-deploy Skill).
@ -69,19 +69,19 @@ Die Version wird über Environment-Variablen in der `docker-compose.yml` auf dem
```powershell
# Neue Werte per sed in docker-compose.yml eintragen
ssh root@195.246.231.210 "cd /opt/krisenvorrat && sed -i 's/KRISENVORRAT_APP_VERSION_CODE=.*/KRISENVORRAT_APP_VERSION_CODE=<neuer_code>/' docker-compose.yml && sed -i 's/KRISENVORRAT_APP_VERSION_NAME=.*/KRISENVORRAT_APP_VERSION_NAME=<neuer_name>/' docker-compose.yml"
ssh root@195.246.231.210 "cd /opt/bollwerk && sed -i 's/BOLLWERK_APP_VERSION_CODE=.*/BOLLWERK_APP_VERSION_CODE=<neuer_code>/' docker-compose.yml && sed -i 's/BOLLWERK_APP_VERSION_NAME=.*/BOLLWERK_APP_VERSION_NAME=<neuer_name>/' docker-compose.yml"
```
Falls die Env-Vars noch nicht in der docker-compose.yml stehen, müssen sie einmalig hinzugefügt werden:
```powershell
ssh root@195.246.231.210 "cd /opt/krisenvorrat && sed -i '/KRISENVORRAT_JWT_SECRET/a\ - KRISENVORRAT_APP_VERSION_CODE=<code>\n - KRISENVORRAT_APP_VERSION_NAME=<name>' docker-compose.yml"
ssh root@195.246.231.210 "cd /opt/bollwerk && sed -i '/BOLLWERK_JWT_SECRET/a\ - BOLLWERK_APP_VERSION_CODE=<code>\n - BOLLWERK_APP_VERSION_NAME=<name>' docker-compose.yml"
```
### Schritt 5 Server neustarten
```powershell
ssh root@195.246.231.210 "cd /opt/krisenvorrat && docker compose up -d"
ssh root@195.246.231.210 "cd /opt/bollwerk && docker compose up -d"
```
### Schritt 6 Verifizieren

View file

@ -1,6 +1,6 @@
<#
.SYNOPSIS
Publiziert eine APK auf den Krisenvorrat VPS.
Publiziert eine APK auf den Bollwerk VPS.
.DESCRIPTION
Lädt die APK auf den VPS hoch, aktualisiert die Version in der
docker-compose.yml und startet den Server-Container neu.
@ -22,7 +22,7 @@ param(
$ErrorActionPreference = "Stop"
$VPS = "root@195.246.231.210"
$RemoteDir = "/opt/krisenvorrat"
$RemoteDir = "/opt/bollwerk"
# --- Preflight ---
Write-Host "=== Publish APK v$VersionName (build $VersionCode) ===" -ForegroundColor Cyan
@ -51,7 +51,7 @@ Write-Host "[OK] APK hochgeladen" -ForegroundColor Green
Write-Host "`n[2/4] Version in docker-compose.yml aktualisieren..." -ForegroundColor Yellow
# Prüfen ob Env-Vars bereits vorhanden sind (bash-Syntax in einfachen Anführungszeichen)
$checkCmd = 'grep -c "KRISENVORRAT_APP_VERSION_CODE" ' + $RemoteDir + '/docker-compose.yml 2>/dev/null || echo 0'
$checkCmd = 'grep -c "BOLLWERK_APP_VERSION_CODE" ' + $RemoteDir + '/docker-compose.yml 2>/dev/null || echo 0'
$checkResult = ssh $VPS $checkCmd
# SSH kann Array zurückgeben (z.B. Banner + Ergebnis) - letzte Zeile nehmen
if ($checkResult -is [array]) { $checkResult = $checkResult[-1] }
@ -59,11 +59,11 @@ $hasVersionCode = [int]($checkResult.Trim())
if ($hasVersionCode -gt 0) {
# Update bestehende Einträge
$sedCmd = "cd $RemoteDir; sed -i 's/KRISENVORRAT_APP_VERSION_CODE=.*/KRISENVORRAT_APP_VERSION_CODE=$VersionCode/' docker-compose.yml; sed -i 's/KRISENVORRAT_APP_VERSION_NAME=.*/KRISENVORRAT_APP_VERSION_NAME=$VersionName/' docker-compose.yml"
$sedCmd = "cd $RemoteDir; sed -i 's/BOLLWERK_APP_VERSION_CODE=.*/BOLLWERK_APP_VERSION_CODE=$VersionCode/' docker-compose.yml; sed -i 's/BOLLWERK_APP_VERSION_NAME=.*/BOLLWERK_APP_VERSION_NAME=$VersionName/' docker-compose.yml"
ssh $VPS $sedCmd
} else {
# Erstmalig hinzufügen (nach JWT_SECRET-Zeile)
$addCmd = "cd $RemoteDir; sed -i '/KRISENVORRAT_JWT_SECRET/a\ - KRISENVORRAT_APP_VERSION_CODE=$VersionCode' docker-compose.yml; sed -i '/KRISENVORRAT_APP_VERSION_CODE/a\ - KRISENVORRAT_APP_VERSION_NAME=$VersionName' docker-compose.yml"
$addCmd = "cd $RemoteDir; sed -i '/BOLLWERK_JWT_SECRET/a\ - BOLLWERK_APP_VERSION_CODE=$VersionCode' docker-compose.yml; sed -i '/BOLLWERK_APP_VERSION_CODE/a\ - BOLLWERK_APP_VERSION_NAME=$VersionName' docker-compose.yml"
ssh $VPS $addCmd
}
if ($LASTEXITCODE -ne 0) { Write-Error "Version-Update fehlgeschlagen."; exit 1 }

View file

@ -21,7 +21,7 @@ param(
[string]$ExpectedSha = ""
)
$repo = "jreinemann-euris/krisenvorrat"
$repo = "jreinemann-euris/bollwerk"
$poll = 10
# --- Warten ---

View file

@ -5,7 +5,7 @@ description: "Server auf den VPS (1984 Hosting, Island) deployen, Docker-Contain
# Skill: VPS Deploy
Deployt den Krisenvorrat Ktor-Server auf den 1984 Hosting VPS in Island.
Deployt den Bollwerk Ktor-Server auf den 1984 Hosting VPS in Island.
---
@ -23,7 +23,7 @@ Deployt den Krisenvorrat Ktor-Server auf den 1984 Hosting VPS in Island.
| Disk | 25 GB SSD |
| Transfer | 1 TB/Monat |
| Docker | Docker CE 29.x + docker-compose-plugin |
| App-Verzeichnis | `/opt/krisenvorrat/` |
| App-Verzeichnis | `/opt/bollwerk/` |
---
@ -59,7 +59,7 @@ ssh-add -l
| Fingerprint | `SHA256:J/qjVt9r8CqnoshZFQWutau+3KG7JxDzRLHPyX41+gA` |
| Private Key | `C:\Users\JensR\.ssh\id_ed25519` (passphrase-geschützt) |
| Public Key | `C:\Users\JensR\.ssh\id_ed25519.pub` |
| Kommentar | `krisenvorrat-vps` |
| Kommentar | `bollwerk-vps` |
---
@ -69,27 +69,27 @@ ssh-add -l
```powershell
# 1. Fat-JAR lokal bauen
cd x:\krisenvorrat
cd x:\bollwerk
.\gradlew.bat :server:buildFatJar
# 2. JAR auf VPS kopieren
scp x:\krisenvorrat\server\build\libs\server.jar root@195.246.231.210:/opt/krisenvorrat/server.jar
scp x:\bollwerk\server\build\libs\server.jar root@195.246.231.210:/opt/bollwerk/server.jar
# 3. Container neu bauen und starten
ssh root@195.246.231.210 "cd /opt/krisenvorrat && docker compose up -d --build"
ssh root@195.246.231.210 "cd /opt/bollwerk && docker compose up -d --build"
```
### Nur Container neustarten (ohne neues JAR)
```powershell
ssh root@195.246.231.210 "cd /opt/krisenvorrat && docker compose restart"
ssh root@195.246.231.210 "cd /opt/bollwerk && docker compose restart"
```
---
## Docker-Konfiguration auf dem VPS
### Dockerfile (`/opt/krisenvorrat/Dockerfile`)
### Dockerfile (`/opt/bollwerk/Dockerfile`)
```dockerfile
FROM eclipse-temurin:21-jre-alpine
@ -101,18 +101,18 @@ ENTRYPOINT ["java", "-Xmx384m", "-jar", "server.jar"]
**Hinweis:** `-Xmx384m` begrenzt den JVM-Heap, weil der VPS nur 1 GB RAM hat.
### docker-compose.yml (`/opt/krisenvorrat/docker-compose.yml`)
### docker-compose.yml (`/opt/bollwerk/docker-compose.yml`)
```yaml
services:
krisenvorrat:
bollwerk:
build: .
container_name: krisenvorrat-server
container_name: bollwerk-server
restart: unless-stopped
ports:
- '8080:8080'
environment:
- KRISENVORRAT_JWT_SECRET=<secret>
- BOLLWERK_JWT_SECRET=<secret>
volumes:
- ./data:/app/data
```
@ -130,14 +130,14 @@ Der Server nutzt JWT-basierte Authentifizierung (kein API-Key mehr).
- **Admin-UI:** `http://195.246.231.210:8080/admin/`
- **Admin-User:** `admin`
- **Admin-Passwort:** Der User muss das Passwort selbst eingeben. Es ist NICHT gespeichert bei Bedarf den User fragen.
- Beim ersten Start ohne `KRISENVORRAT_ADMIN_PASSWORD` ENV wird ein zufälliges Passwort generiert und in die Logs geschrieben.
- Beim ersten Start ohne `BOLLWERK_ADMIN_PASSWORD` ENV wird ein zufälliges Passwort generiert und in die Logs geschrieben.
### Environment-Variablen
| Variable | Pflicht | Beschreibung |
| ------------------------------- | ------- | --------------------------------------------------- |
| `KRISENVORRAT_JWT_SECRET` | ja | Secret für JWT-Token-Signierung (mind. 32 Zeichen) |
| `KRISENVORRAT_ADMIN_PASSWORD` | nein | Admin-Passwort beim ersten Start (sonst auto-gen.) |
| `BOLLWERK_JWT_SECRET` | ja | Secret für JWT-Token-Signierung (mind. 32 Zeichen) |
| `BOLLWERK_ADMIN_PASSWORD` | nein | Admin-Passwort beim ersten Start (sonst auto-gen.) |
---
@ -173,10 +173,10 @@ ssh root@195.246.231.210 "docker ps"
```powershell
# Letzte 50 Zeilen
ssh root@195.246.231.210 "docker logs krisenvorrat-server --tail 50"
ssh root@195.246.231.210 "docker logs bollwerk-server --tail 50"
# Live-Logs (Ctrl+C zum Beenden)
ssh root@195.246.231.210 "docker logs krisenvorrat-server -f"
ssh root@195.246.231.210 "docker logs bollwerk-server -f"
```
### Health-Check
@ -192,9 +192,9 @@ ssh root@195.246.231.210 "curl -s http://localhost:8080/api/health"
### Container stoppen/starten
```powershell
ssh root@195.246.231.210 "cd /opt/krisenvorrat && docker compose stop"
ssh root@195.246.231.210 "cd /opt/krisenvorrat && docker compose start"
ssh root@195.246.231.210 "cd /opt/krisenvorrat && docker compose down" # Container entfernen
ssh root@195.246.231.210 "cd /opt/bollwerk && docker compose stop"
ssh root@195.246.231.210 "cd /opt/bollwerk && docker compose start"
ssh root@195.246.231.210 "cd /opt/bollwerk && docker compose down" # Container entfernen
```
### RAM-Nutzung prüfen
@ -205,7 +205,7 @@ ssh root@195.246.231.210 "free -h && echo '---' && docker stats --no-stream"
### Daten-Persistenz
Die SQLite-Datenbank wird unter `/opt/krisenvorrat/data/` auf dem Host gemountet und überlebt Container-Neustarts.
Die SQLite-Datenbank wird unter `/opt/bollwerk/data/` auf dem Host gemountet und überlebt Container-Neustarts.
---
@ -214,5 +214,5 @@ Die SQLite-Datenbank wird unter `/opt/krisenvorrat/data/` auf dem Host gemountet
- **1 GB RAM:** JVM-Heap auf 384 MB begrenzt. Kein Spielraum für weitere Dienste.
- **Kein HTTPS:** Server läuft aktuell nur auf HTTP Port 8080. Für HTTPS → Caddy als Reverse Proxy einrichten.
- **Kein CI/CD:** Deployment ist manuell (JAR bauen → scp → docker compose up). Ggf. GitHub Actions Pipeline ergänzen.
- **Dockerfile lokal:** Das Dockerfile auf dem VPS (`/opt/krisenvorrat/Dockerfile`) ist ein schlankes Runtime-Only-Image. Das Multi-Stage-Dockerfile im Repo-Root ist für lokale Builds gedacht.
- **Dockerfile lokal:** Das Dockerfile auf dem VPS (`/opt/bollwerk/Dockerfile`) ist ein schlankes Runtime-Only-Image. Das Multi-Stage-Dockerfile im Repo-Root ist für lokale Builds gedacht.
- **SSH-Escape-Problem:** Beim Schreiben von Dateien via SSH-Heredoc werden JSON-Quotes zerstört. Dateien immer lokal erstellen und per `scp` hochladen.

View file

@ -1,4 +1,4 @@
# Krisenvorrat Inventar-App Anforderungen
# Bollwerk Inventar-App Anforderungen
**Version:** 1.0
**Datum:** 2026-05-13
@ -8,7 +8,7 @@
## 1. Projektziel
Eine native Android-App zur Verwaltung eines Krisenvorrats-Inventars. Die App speichert alle Daten lokal als JSON und ermöglicht späteren Datenaustausch über einen REST-Server. Verteilung erfolgt via APK-Sideloading (kein Google Play Store) rein privater Gebrauch.
Eine native Android-App zur Verwaltung eines Bollwerks-Inventars. Die App speichert alle Daten lokal als JSON und ermöglicht späteren Datenaustausch über einen REST-Server. Verteilung erfolgt via APK-Sideloading (kein Google Play Store) rein privater Gebrauch.
---
@ -117,7 +117,7 @@ Eine native Android-App zur Verwaltung eines Krisenvorrats-Inventars. Die App sp
- **Design:** Klar, funktional, industriell Material 3 Komponenten
- **Navigation:** Bottom Navigation Bar (Übersicht / Inventur / Warnungen / Einstellungen)
- **Eingabe:** Große Touch-Targets, Dropdown für Einheiten/Kategorien/Lagerorte
- **Farbschema:** Dark Theme (Dunkelgrün / Anthrazit) Krisenvorrat-Ästhetik, gut lesbar
- **Farbschema:** Dark Theme (Dunkelgrün / Anthrazit) Bollwerk-Ästhetik, gut lesbar
---

View file

@ -12,7 +12,7 @@ Requirements file: anforderungen-v1.md + Anforderungen/design/requirements.md
| Name | Seed-Hex | Primär (Dark) | Charakter | M3-kompatibel | Lesbarkeit | Score |
| ----------------------- | --------- | ------------------- | ----------------------------------------- | ------------- | ---------- | ----- |
| A1 Forest Green | `#2E7D32` | `#6EC072` (tone 80) | Klassisch dunkelgrün, bekannt, klar | ✅ | ✅ | 8 |
| A2 Olivgrün / Militär | `#4A6741` | `#9CCB91` (tone 80) | Gedeckt, olivfarben, "Krisenvorrat"-Thema | ✅ | ✅ | 9 |
| A2 Olivgrün / Militär | `#4A6741` | `#9CCB91` (tone 80) | Gedeckt, olivfarben, "Bollwerk"-Thema | ✅ | ✅ | 9 |
| A3 Dunkelgrün Pure | `#1B5E20` | `#54BA5B` (tone 80) | Sehr satt, fast schwarz-grün, industriell | ✅ | ✅ | 7 |
| A4 Waldgrün warm | `#3A5F3A` | `#8FCC8F` (tone 80) | Warm, natürlich, dezent | ✅ | ✅ | 8 |
@ -28,13 +28,13 @@ Requirements file: anforderungen-v1.md + Anforderungen/design/requirements.md
- ✅ Must: Alle erfüllt
- ✅ Should: Erkennbarer Charakter, solide Kontraste
- ⚠️ Missing: Nicht maximale "Krisenvorrat"-Eigenständigkeit wirkt leicht wie Standard-Material-Grün
- ⚠️ Missing: Nicht maximale "Bollwerk"-Eigenständigkeit wirkt leicht wie Standard-Material-Grün
#### A2 Olivgrün / Militärgrün (`#4A6741`)
**Charakter:** Gedämpftes Oliv-Grün, militärische/Outdoor-Assoziation. Sehr gut zum Krisenvorrat-Kontext.
**Charakter:** Gedämpftes Oliv-Grün, militärische/Outdoor-Assoziation. Sehr gut zum Bollwerk-Kontext.
**Dark-Theme-Primary:** ~`#9CCB91` warmes, helles Olivgrün auf dunklem Hintergrund.
**Surfaces (Dark):** `#14191A` leicht grünlich-anthrazit, sehr angenehm für den Ausdruck "Krisenvorrat".
**Surfaces (Dark):** `#14191A` leicht grünlich-anthrazit, sehr angenehm für den Ausdruck "Bollwerk".
- ✅ Must: Alle erfüllt
- ✅ Should: Maximale thematische Eigenständigkeit, excellent Lesbarkeit
@ -86,7 +86,7 @@ MaterialTheme(colorScheme = DarkColorScheme) { ... }
```
- ✅ Funktioniert auf allen Android-Versionen
- ✅ Konsistente "Krisenvorrat"-Markenidentität bei jedem User
- ✅ Konsistente "Bollwerk"-Markenidentität bei jedem User
- ✅ Einfache Implementierung, geringer Wartungsaufwand
- ✅ Die grün/anthrazite Ästhetik wird IMMER angezeigt
@ -100,12 +100,12 @@ val colorScheme = if (Build.VERSION.SDK_INT >= 31) {
- 🔴 Verliert grüne Ästhetik App sieht aus wie jede andere App
- 🔴 Schließt Android 811 aus (>30% Marktanteil)
- ❌ Does not fit: "Krisenvorrat-Ästhetik" ist explizit gefordert
- ❌ Does not fit: "Bollwerk-Ästhetik" ist explizit gefordert
#### B3 Hybrid
- ⚠️ Komplexität ohne echten Mehrwert für diesen Use Case
- ⚠️ Auf Android 12+ weicht die "Krisenvorrat"-Ästhetik ab
- ⚠️ Auf Android 12+ weicht die "Bollwerk"-Ästhetik ab
---
@ -224,13 +224,13 @@ Decided by: User
### A Seed Color
**Gewählt:** `#4A6741` (Olivgrün / Militärgrün)
**Begründung:** Passt thematisch optimal zum Krisenvorrat-Kontext. Material 3 generiert daraus einen anthrazitgrünen Dark-Theme-Look mit dezenter Grün-Tönung der Surfaces.
**Begründung:** Passt thematisch optimal zum Bollwerk-Kontext. Material 3 generiert daraus einen anthrazitgrünen Dark-Theme-Look mit dezenter Grün-Tönung der Surfaces.
**Alternativen:** `#2E7D32` (Forest Green, zu generisch), `#1B5E20` (zu dunkel), `#3A5F3A` (zu ähnlich zu Forest Green)
### B Dynamic Color
**Gewählt:** Fixed Custom Palette (B1)
**Begründung:** App-Identität ("Krisenvorrat"-Ästhetik) muss konsistent bleiben. Dynamic Color würde das grüne Branding überschreiben. Fixed Palette funktioniert auf allen Android-Versionen.
**Begründung:** App-Identität ("Bollwerk"-Ästhetik) muss konsistent bleiben. Dynamic Color würde das grüne Branding überschreiben. Fixed Palette funktioniert auf allen Android-Versionen.
**Alternativen:** Dynamic Color (verliert Branding), Hybrid (unnötige Komplexität)
### C Typography

View file

@ -1,7 +1,7 @@
# Technology Requirements DB-Migrationsstrategie
Date: 2026-05-17
Author: Krisenvorrat-Projekt
Author: Bollwerk-Projekt
## Must-Have (eliminators)

View file

@ -14,7 +14,7 @@ Vor der Implementierung der ersten UI-Screens müssen vier visuelle Designentsch
- **Stil:** Klar, funktional, industriell
- **UI-Framework:** Material 3 Komponenten
- **Farbschema:** Dark Theme, Dunkelgrün / Anthrazit "Krisenvorrat-Ästhetik", gut lesbar
- **Farbschema:** Dark Theme, Dunkelgrün / Anthrazit "Bollwerk-Ästhetik", gut lesbar
---
@ -29,7 +29,7 @@ Vor der Implementierung der ersten UI-Screens müssen vier visuelle Designentsch
### Should-Have
- "Waldgrün / Olivgrün / Militärgrün"-Anmutung (passt zum Thema Krisenvorrat)
- "Waldgrün / Olivgrün / Militärgrün"-Anmutung (passt zum Thema Bollwerk)
- Anthrazit-Töne für Oberflächen (nicht reines Schwarz, nicht Hellgrau)
- Erkennbarer visueller Charakter App soll eigenständig aussehen

View file

@ -8,7 +8,7 @@
## Kontext
Die Krisenvorrat-App (Android/Kotlin) benötigt in Phase 2 einen REST-Server für die Synchronisierung und das Sharing des Inventars zwischen mehreren Geräten. Der Server wird im privaten Umfeld eingesetzt (210 Geräte, wenig Last) und soll einfach auf einem kleinen Linux-VPS oder Homeserver deploybar sein.
Die Bollwerk-App (Android/Kotlin) benötigt in Phase 2 einen REST-Server für die Synchronisierung und das Sharing des Inventars zwischen mehreren Geräten. Der Server wird im privaten Umfeld eingesetzt (210 Geräte, wenig Last) und soll einfach auf einem kleinen Linux-VPS oder Homeserver deploybar sein.
Das bestehende Client-Datenmodell nutzt kotlinx.serialization für JSON-Export/Import.

View file

@ -8,7 +8,7 @@ Author: Tech-Decision Workflow
## Kontext
Die Krisenvorrat-App (Android/Kotlin) speichert in v1.0 alle Daten lokal (Room/SQLite). In Phase 2 soll ein REST-Server hinzukommen, der die Synchronisierung und das Sharing des Inventars zwischen mehreren Geräten ermöglicht.
Die Bollwerk-App (Android/Kotlin) speichert in v1.0 alle Daten lokal (Room/SQLite). In Phase 2 soll ein REST-Server hinzukommen, der die Synchronisierung und das Sharing des Inventars zwischen mehreren Geräten ermöglicht.
**Einsatzszenario:**

View file

@ -1,6 +1,6 @@
# Krisenvorrat
# Bollwerk
Android-App zur Verwaltung eines Krisenvorrats-Inventars mit lokaler Datenhaltung und Sync-Möglichkeit über einen LAN-Server.
Android-App zur Verwaltung eines Bollwerks-Inventars mit lokaler Datenhaltung und Sync-Möglichkeit über einen LAN-Server.
## Projektstruktur
@ -94,15 +94,15 @@ java -jar server/build/libs/server.jar
```bash
# Image bauen
docker build -t krisenvorrat-server .
docker build -t bollwerk-server .
# Container starten
docker run -d \
--name krisenvorrat \
--name bollwerk \
-p 8080:8080 \
-e KRISENVORRAT_API_KEY="mein-sicherer-api-key" \
-v krisenvorrat-data:/app/data \
krisenvorrat-server
-e BOLLWERK_API_KEY="mein-sicherer-api-key" \
-v bollwerk-data:/app/data \
bollwerk-server
```
### LAN-Setup
@ -113,7 +113,7 @@ docker run -d \
- Die Start-Skripte zeigen die IP automatisch an
2. **Firewall-Regel:** Port **8080** (TCP eingehend) muss freigeschaltet sein:
- Windows: `netsh advfirewall firewall add rule name="Krisenvorrat" dir=in action=allow protocol=TCP localport=8080`
- Windows: `netsh advfirewall firewall add rule name="Bollwerk" dir=in action=allow protocol=TCP localport=8080`
- Linux: `sudo ufw allow 8080/tcp`
3. **App konfigurieren:**
@ -134,7 +134,7 @@ docker run -d \
| Variable | Standard | Beschreibung |
|-----------------------|-------------------------------------------------|-------------------|
| `KRISENVORRAT_API_KEY` | `change-me-to-a-secure-key-at-least-32-chars` | API-Key für Auth |
| `BOLLWERK_API_KEY` | `change-me-to-a-secure-key-at-least-32-chars` | API-Key für Auth |
### Sicherheitshinweise

View file

@ -8,11 +8,11 @@ plugins {
}
android {
namespace = "de.krisenvorrat.app"
namespace = "de.bollwerk.app"
compileSdk = 35
defaultConfig {
applicationId = "de.krisenvorrat.app"
applicationId = "de.bollwerk.app"
minSdk = 26
targetSdk = 35
versionCode = 3

View file

@ -1,10 +1,10 @@
package de.krisenvorrat.app.data.db
package de.bollwerk.app.data.db
import androidx.room.Room
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import de.krisenvorrat.app.data.db.entity.CategoryEntity
import de.krisenvorrat.app.data.db.entity.LocationEntity
import de.bollwerk.app.data.db.entity.CategoryEntity
import de.bollwerk.app.data.db.entity.LocationEntity
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking
import org.junit.After
@ -22,9 +22,9 @@ import org.junit.runner.RunWith
* Neue AutoMigrations werden automatisch durch Room validiert.
*/
@RunWith(AndroidJUnit4::class)
internal class KrisenvorratDatabaseMigrationTest {
internal class BollwerkDatabaseMigrationTest {
private val dbName = "krisenvorrat-migration-test.db"
private val dbName = "bollwerk-migration-test.db"
private val context get() = InstrumentationRegistry.getInstrumentation().targetContext
@Before
@ -39,7 +39,7 @@ internal class KrisenvorratDatabaseMigrationTest {
@Test
fun freshInstall_allTablesExist() {
val db = Room.inMemoryDatabaseBuilder(context, KrisenvorratDatabase::class.java)
val db = Room.inMemoryDatabaseBuilder(context, BollwerkDatabase::class.java)
.build()
try {
val tables = mutableListOf<String>()
@ -64,7 +64,7 @@ internal class KrisenvorratDatabaseMigrationTest {
@Test
fun freshInstall_crudOperationsWork() {
val db = Room.inMemoryDatabaseBuilder(context, KrisenvorratDatabase::class.java)
val db = Room.inMemoryDatabaseBuilder(context, BollwerkDatabase::class.java)
.build()
try {
runBlocking {

View file

@ -1,10 +1,10 @@
package de.krisenvorrat.app.data.db.dao
package de.bollwerk.app.data.db.dao
import androidx.room.Room
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import de.krisenvorrat.app.data.db.KrisenvorratDatabase
import de.krisenvorrat.app.data.db.entity.CategoryEntity
import de.bollwerk.app.data.db.BollwerkDatabase
import de.bollwerk.app.data.db.entity.CategoryEntity
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking
import org.junit.After
@ -17,14 +17,14 @@ import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
internal class CategoryDaoTest {
private lateinit var db: KrisenvorratDatabase
private lateinit var db: BollwerkDatabase
private lateinit var dao: CategoryDao
@Before
fun setup() {
db = Room.inMemoryDatabaseBuilder(
ApplicationProvider.getApplicationContext(),
KrisenvorratDatabase::class.java
BollwerkDatabase::class.java
).allowMainThreadQueries().build()
dao = db.categoryDao()
}

View file

@ -1,12 +1,12 @@
package de.krisenvorrat.app.data.db.dao
package de.bollwerk.app.data.db.dao
import androidx.room.Room
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import de.krisenvorrat.app.data.db.KrisenvorratDatabase
import de.krisenvorrat.app.data.db.entity.CategoryEntity
import de.krisenvorrat.app.data.db.entity.ItemEntity
import de.krisenvorrat.app.data.db.entity.LocationEntity
import de.bollwerk.app.data.db.BollwerkDatabase
import de.bollwerk.app.data.db.entity.CategoryEntity
import de.bollwerk.app.data.db.entity.ItemEntity
import de.bollwerk.app.data.db.entity.LocationEntity
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking
import org.junit.After
@ -20,14 +20,14 @@ import java.time.LocalDate
@RunWith(AndroidJUnit4::class)
internal class ItemDaoTest {
private lateinit var db: KrisenvorratDatabase
private lateinit var db: BollwerkDatabase
private lateinit var dao: ItemDao
@Before
fun setup() {
db = Room.inMemoryDatabaseBuilder(
ApplicationProvider.getApplicationContext(),
KrisenvorratDatabase::class.java
BollwerkDatabase::class.java
).allowMainThreadQueries().build()
dao = db.itemDao()
runBlocking {

View file

@ -1,10 +1,10 @@
package de.krisenvorrat.app.data.db.dao
package de.bollwerk.app.data.db.dao
import androidx.room.Room
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import de.krisenvorrat.app.data.db.KrisenvorratDatabase
import de.krisenvorrat.app.data.db.entity.LocationEntity
import de.bollwerk.app.data.db.BollwerkDatabase
import de.bollwerk.app.data.db.entity.LocationEntity
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking
import org.junit.After
@ -17,14 +17,14 @@ import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
internal class LocationDaoTest {
private lateinit var db: KrisenvorratDatabase
private lateinit var db: BollwerkDatabase
private lateinit var dao: LocationDao
@Before
fun setup() {
db = Room.inMemoryDatabaseBuilder(
ApplicationProvider.getApplicationContext(),
KrisenvorratDatabase::class.java
BollwerkDatabase::class.java
).allowMainThreadQueries().build()
dao = db.locationDao()
}

View file

@ -1,10 +1,10 @@
package de.krisenvorrat.app.data.db.dao
package de.bollwerk.app.data.db.dao
import androidx.room.Room
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import de.krisenvorrat.app.data.db.KrisenvorratDatabase
import de.krisenvorrat.app.data.db.entity.SettingsEntity
import de.bollwerk.app.data.db.BollwerkDatabase
import de.bollwerk.app.data.db.entity.SettingsEntity
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking
import org.junit.After
@ -17,14 +17,14 @@ import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
internal class SettingsDaoTest {
private lateinit var db: KrisenvorratDatabase
private lateinit var db: BollwerkDatabase
private lateinit var dao: SettingsDao
@Before
fun setup() {
db = Room.inMemoryDatabaseBuilder(
ApplicationProvider.getApplicationContext(),
KrisenvorratDatabase::class.java
BollwerkDatabase::class.java
).allowMainThreadQueries().build()
dao = db.settingsDao()
}

View file

@ -1,10 +1,10 @@
package de.krisenvorrat.app.di
package de.bollwerk.app.di
import android.content.Context
import androidx.room.Room
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import de.krisenvorrat.app.data.db.KrisenvorratDatabase
import de.bollwerk.app.data.db.BollwerkDatabase
import org.junit.After
import org.junit.Assert.assertNotNull
import org.junit.Test
@ -13,7 +13,7 @@ import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
internal class DatabaseModuleTest {
private lateinit var db: KrisenvorratDatabase
private lateinit var db: BollwerkDatabase
@After
fun tearDown() {
@ -29,7 +29,7 @@ internal class DatabaseModuleTest {
val module = DatabaseModule
// When
db = Room.inMemoryDatabaseBuilder(context, KrisenvorratDatabase::class.java)
db = Room.inMemoryDatabaseBuilder(context, BollwerkDatabase::class.java)
.allowMainThreadQueries()
.build()
val itemDao = module.provideItemDao(db)

View file

@ -5,19 +5,19 @@
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<application
android:name=".KrisenvorratApp"
android:name=".BollwerkApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:theme="@style/Theme.Krisenvorrat">
android:theme="@style/Theme.Bollwerk">
<activity
android:name=".MainActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.Krisenvorrat">
android:theme="@style/Theme.Bollwerk">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />

View file

@ -1,7 +1,7 @@
package de.krisenvorrat.app
package de.bollwerk.app
import android.app.Application
import dagger.hilt.android.HiltAndroidApp
@HiltAndroidApp
class KrisenvorratApp : Application()
class BollwerkApp : Application()

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app
package de.bollwerk.app
import android.os.Bundle
import androidx.activity.ComponentActivity
@ -10,9 +10,9 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint
import de.krisenvorrat.app.domain.usecase.SeedDatabaseUseCase
import de.krisenvorrat.app.ui.MainScreen
import de.krisenvorrat.app.ui.theme.KrisenvorratTheme
import de.bollwerk.app.domain.usecase.SeedDatabaseUseCase
import de.bollwerk.app.ui.MainScreen
import de.bollwerk.app.ui.theme.BollwerkTheme
import kotlinx.coroutines.launch
import javax.inject.Inject
@ -26,7 +26,7 @@ class MainActivity : ComponentActivity() {
lifecycleScope.launch { seedDatabaseUseCase() }
enableEdgeToEdge()
setContent {
KrisenvorratTheme {
BollwerkTheme {
MainScreen()
}
}
@ -36,9 +36,9 @@ class MainActivity : ComponentActivity() {
@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
KrisenvorratTheme {
BollwerkTheme {
Text(
text = "Krisenvorrat",
text = "Bollwerk",
style = MaterialTheme.typography.headlineLarge
)
}

View file

@ -0,0 +1,32 @@
package de.bollwerk.app.data.db
import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import de.bollwerk.app.data.db.dao.CategoryDao
import de.bollwerk.app.data.db.dao.ItemDao
import de.bollwerk.app.data.db.dao.LocationDao
import de.bollwerk.app.data.db.dao.MessageDao
import de.bollwerk.app.data.db.dao.PendingSyncOpDao
import de.bollwerk.app.data.db.dao.SettingsDao
import de.bollwerk.app.data.db.entity.CategoryEntity
import de.bollwerk.app.data.db.entity.ItemEntity
import de.bollwerk.app.data.db.entity.LocationEntity
import de.bollwerk.app.data.db.entity.MessageEntity
import de.bollwerk.app.data.db.entity.PendingSyncOpEntity
import de.bollwerk.app.data.db.entity.SettingsEntity
@Database(
entities = [CategoryEntity::class, LocationEntity::class, ItemEntity::class, SettingsEntity::class, PendingSyncOpEntity::class, MessageEntity::class],
version = 6,
exportSchema = true
)
@TypeConverters(LocalDateConverter::class)
internal abstract class BollwerkDatabase : RoomDatabase() {
abstract fun categoryDao(): CategoryDao
abstract fun locationDao(): LocationDao
abstract fun itemDao(): ItemDao
abstract fun settingsDao(): SettingsDao
abstract fun pendingSyncOpDao(): PendingSyncOpDao
abstract fun messageDao(): MessageDao
}

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.data.db
package de.bollwerk.app.data.db
import androidx.room.TypeConverter
import java.time.LocalDate

View file

@ -1,16 +1,16 @@
package de.krisenvorrat.app.data.db
package de.bollwerk.app.data.db
/**
* Room-Migrationen der Krisenvorrat-Datenbank.
* Room-Migrationen der Bollwerk-Datenbank.
*
* Ab Version 6 nutzt die App Room @AutoMigration für Schema-Änderungen.
* Manuelle Migrationen werden nur noch benötigt, wenn AutoMigration nicht
* ausreicht (z.B. Table-Rebuild, Daten-Transformation).
*
* Checkliste für neue Schema-Änderungen:
* 1. DB-Version in [KrisenvorratDatabase] hochzählen
* 1. DB-Version in [BollwerkDatabase] hochzählen
* 2. @AutoMigration(from = X, to = Y) in der @Database-Annotation ergänzen
* 3. Falls AutoMigration nicht reicht: Migration(X, Y) hier ergänzen
* und in [de.krisenvorrat.app.di.DatabaseModule].addMigrations() eintragen
* und in [de.bollwerk.app.di.DatabaseModule].addMigrations() eintragen
*/
internal object Migrations

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.data.db.dao
package de.bollwerk.app.data.db.dao
import androidx.room.Dao
import androidx.room.Delete
@ -6,7 +6,7 @@ import androidx.room.Insert
import androidx.room.Query
import androidx.room.Update
import androidx.room.Upsert
import de.krisenvorrat.app.data.db.entity.CategoryEntity
import de.bollwerk.app.data.db.entity.CategoryEntity
import kotlinx.coroutines.flow.Flow
@Dao

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.data.db.dao
package de.bollwerk.app.data.db.dao
import androidx.room.Dao
import androidx.room.Delete
@ -6,7 +6,7 @@ import androidx.room.Insert
import androidx.room.Query
import androidx.room.Update
import androidx.room.Upsert
import de.krisenvorrat.app.data.db.entity.ItemEntity
import de.bollwerk.app.data.db.entity.ItemEntity
import kotlinx.coroutines.flow.Flow
import java.time.LocalDate

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.data.db.dao
package de.bollwerk.app.data.db.dao
import androidx.room.Dao
import androidx.room.Delete
@ -6,7 +6,7 @@ import androidx.room.Insert
import androidx.room.Query
import androidx.room.Update
import androidx.room.Upsert
import de.krisenvorrat.app.data.db.entity.LocationEntity
import de.bollwerk.app.data.db.entity.LocationEntity
import kotlinx.coroutines.flow.Flow
@Dao

View file

@ -1,11 +1,11 @@
package de.krisenvorrat.app.data.db.dao
package de.bollwerk.app.data.db.dao
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Upsert
import de.krisenvorrat.app.data.db.entity.MessageEntity
import de.bollwerk.app.data.db.entity.MessageEntity
import kotlinx.coroutines.flow.Flow
@Dao

View file

@ -1,10 +1,10 @@
package de.krisenvorrat.app.data.db.dao
package de.bollwerk.app.data.db.dao
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import de.krisenvorrat.app.data.db.entity.PendingSyncOpEntity
import de.bollwerk.app.data.db.entity.PendingSyncOpEntity
import kotlinx.coroutines.flow.Flow
@Dao

View file

@ -1,9 +1,9 @@
package de.krisenvorrat.app.data.db.dao
package de.bollwerk.app.data.db.dao
import androidx.room.Dao
import androidx.room.Query
import androidx.room.Upsert
import de.krisenvorrat.app.data.db.entity.SettingsEntity
import de.bollwerk.app.data.db.entity.SettingsEntity
import kotlinx.coroutines.flow.Flow
@Dao

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.data.db.entity
package de.bollwerk.app.data.db.entity
import androidx.room.ColumnInfo
import androidx.room.Entity

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.data.db.entity
package de.bollwerk.app.data.db.entity
import androidx.room.ColumnInfo
import androidx.room.Entity

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.data.db.entity
package de.bollwerk.app.data.db.entity
import androidx.room.ColumnInfo
import androidx.room.Entity

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.data.db.entity
package de.bollwerk.app.data.db.entity
import androidx.room.ColumnInfo
import androidx.room.Entity

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.data.db.entity
package de.bollwerk.app.data.db.entity
import androidx.room.ColumnInfo
import androidx.room.Entity

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.data.db.entity
package de.bollwerk.app.data.db.entity
import androidx.room.ColumnInfo
import androidx.room.Entity

View file

@ -1,8 +1,8 @@
package de.krisenvorrat.app.data.export
package de.bollwerk.app.data.export
import de.krisenvorrat.app.data.db.entity.CategoryEntity
import de.krisenvorrat.app.data.db.entity.ItemEntity
import de.krisenvorrat.app.data.db.entity.LocationEntity
import de.bollwerk.app.data.db.entity.CategoryEntity
import de.bollwerk.app.data.db.entity.ItemEntity
import de.bollwerk.app.data.db.entity.LocationEntity
import java.time.format.DateTimeFormatter
import java.util.Locale

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.data.export
package de.bollwerk.app.data.export
internal fun interface DatabaseTransaction {
suspend fun execute(block: suspend () -> Unit)

View file

@ -1,22 +1,22 @@
package de.krisenvorrat.app.data.export
package de.bollwerk.app.data.export
import de.krisenvorrat.app.data.db.dao.CategoryDao
import de.krisenvorrat.app.data.db.dao.ItemDao
import de.krisenvorrat.app.data.db.dao.LocationDao
import de.krisenvorrat.app.data.db.dao.SettingsDao
import de.krisenvorrat.app.data.db.entity.CategoryEntity
import de.krisenvorrat.app.data.db.entity.ItemEntity
import de.krisenvorrat.app.data.db.entity.LocationEntity
import de.krisenvorrat.app.data.db.entity.SettingsEntity
import de.krisenvorrat.app.domain.model.SettingsKeys
import de.krisenvorrat.app.domain.model.parseAgeGroupsFromJson
import de.krisenvorrat.app.domain.model.totalDailyKcal
import de.krisenvorrat.app.domain.repository.ImportExportRepository
import de.krisenvorrat.shared.model.CategoryDto
import de.krisenvorrat.shared.model.InventoryDto
import de.krisenvorrat.shared.model.ItemDto
import de.krisenvorrat.shared.model.LocationDto
import de.krisenvorrat.shared.model.SettingDto
import de.bollwerk.app.data.db.dao.CategoryDao
import de.bollwerk.app.data.db.dao.ItemDao
import de.bollwerk.app.data.db.dao.LocationDao
import de.bollwerk.app.data.db.dao.SettingsDao
import de.bollwerk.app.data.db.entity.CategoryEntity
import de.bollwerk.app.data.db.entity.ItemEntity
import de.bollwerk.app.data.db.entity.LocationEntity
import de.bollwerk.app.data.db.entity.SettingsEntity
import de.bollwerk.app.domain.model.SettingsKeys
import de.bollwerk.app.domain.model.parseAgeGroupsFromJson
import de.bollwerk.app.domain.model.totalDailyKcal
import de.bollwerk.app.domain.repository.ImportExportRepository
import de.bollwerk.shared.model.CategoryDto
import de.bollwerk.shared.model.InventoryDto
import de.bollwerk.shared.model.ItemDto
import de.bollwerk.shared.model.LocationDto
import de.bollwerk.shared.model.SettingDto
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.withContext
@ -151,7 +151,7 @@ internal class ImportExportRepositoryImpl @Inject constructor(
val dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy", Locale.GERMAN)
val sb = StringBuilder()
sb.appendLine("# Krisenvorrat Inventar")
sb.appendLine("# Bollwerk Inventar")
sb.appendLine()
for (category in categories) {

View file

@ -1,11 +1,11 @@
package de.krisenvorrat.app.data.export
package de.bollwerk.app.data.export
import android.graphics.Paint
import android.graphics.Typeface
import android.graphics.pdf.PdfDocument
import de.krisenvorrat.app.data.db.entity.CategoryEntity
import de.krisenvorrat.app.data.db.entity.ItemEntity
import de.krisenvorrat.app.data.db.entity.LocationEntity
import de.bollwerk.app.data.db.entity.CategoryEntity
import de.bollwerk.app.data.db.entity.ItemEntity
import de.bollwerk.app.data.db.entity.LocationEntity
import java.io.File
import java.io.FileOutputStream
import java.time.LocalDate
@ -64,7 +64,7 @@ internal object PdfExporter {
}
// Title
canvas.drawText("Krisenvorrat Inventar", MARGIN_LEFT, yPos, titlePaint)
canvas.drawText("Bollwerk Inventar", MARGIN_LEFT, yPos, titlePaint)
yPos += 8f
canvas.drawText(
"Erstellt am ${LocalDate.now().format(DATE_FORMATTER)}",

View file

@ -1,6 +1,6 @@
package de.krisenvorrat.app.data.remote
package de.bollwerk.app.data.remote
import de.krisenvorrat.app.domain.model.ItemFormPrefill
import de.bollwerk.app.domain.model.ItemFormPrefill
import io.ktor.client.HttpClient
import io.ktor.client.call.body
import io.ktor.client.request.bearerAuth

View file

@ -1,10 +1,10 @@
package de.krisenvorrat.app.data.repository
package de.bollwerk.app.data.repository
import android.content.Context
import android.content.Intent
import androidx.core.content.FileProvider
import dagger.hilt.android.qualifiers.ApplicationContext
import de.krisenvorrat.app.domain.usecase.ApkInstaller
import de.bollwerk.app.domain.usecase.ApkInstaller
import java.io.File
import javax.inject.Inject

View file

@ -1,8 +1,8 @@
package de.krisenvorrat.app.data.repository
package de.bollwerk.app.data.repository
import de.krisenvorrat.app.data.db.dao.CategoryDao
import de.krisenvorrat.app.data.db.entity.CategoryEntity
import de.krisenvorrat.app.domain.repository.CategoryRepository
import de.bollwerk.app.data.db.dao.CategoryDao
import de.bollwerk.app.data.db.entity.CategoryEntity
import de.bollwerk.app.domain.repository.CategoryRepository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.withContext

View file

@ -1,18 +1,18 @@
package de.krisenvorrat.app.data.repository
package de.bollwerk.app.data.repository
import de.krisenvorrat.app.data.db.dao.ItemDao
import de.krisenvorrat.app.data.db.dao.PendingSyncOpDao
import de.krisenvorrat.app.data.db.entity.ItemEntity
import de.krisenvorrat.app.data.db.entity.PendingSyncOpEntity
import de.krisenvorrat.app.data.sync.WebSocketClient
import de.krisenvorrat.app.data.sync.WebSocketEvent
import de.krisenvorrat.app.di.ApplicationScope
import de.krisenvorrat.app.domain.model.SettingsKey.StringKey
import de.krisenvorrat.app.domain.model.SyncError
import de.krisenvorrat.app.domain.repository.ItemRepository
import de.krisenvorrat.app.domain.repository.SettingsRepository
import de.krisenvorrat.app.domain.repository.SyncService
import de.krisenvorrat.shared.model.ItemDto
import de.bollwerk.app.data.db.dao.ItemDao
import de.bollwerk.app.data.db.dao.PendingSyncOpDao
import de.bollwerk.app.data.db.entity.ItemEntity
import de.bollwerk.app.data.db.entity.PendingSyncOpEntity
import de.bollwerk.app.data.sync.WebSocketClient
import de.bollwerk.app.data.sync.WebSocketEvent
import de.bollwerk.app.di.ApplicationScope
import de.bollwerk.app.domain.model.SettingsKey.StringKey
import de.bollwerk.app.domain.model.SyncError
import de.bollwerk.app.domain.repository.ItemRepository
import de.bollwerk.app.domain.repository.SettingsRepository
import de.bollwerk.app.domain.repository.SyncService
import de.bollwerk.shared.model.ItemDto
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow

View file

@ -1,8 +1,8 @@
package de.krisenvorrat.app.data.repository
package de.bollwerk.app.data.repository
import de.krisenvorrat.app.data.db.dao.LocationDao
import de.krisenvorrat.app.data.db.entity.LocationEntity
import de.krisenvorrat.app.domain.repository.LocationRepository
import de.bollwerk.app.data.db.dao.LocationDao
import de.bollwerk.app.data.db.entity.LocationEntity
import de.bollwerk.app.domain.repository.LocationRepository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.withContext

View file

@ -1,15 +1,15 @@
package de.krisenvorrat.app.data.repository
package de.bollwerk.app.data.repository
import de.krisenvorrat.app.data.db.dao.MessageDao
import de.krisenvorrat.app.data.db.entity.MessageEntity
import de.krisenvorrat.app.data.sync.WebSocketClient
import de.krisenvorrat.app.data.sync.WebSocketEvent
import de.krisenvorrat.app.di.ApplicationScope
import de.krisenvorrat.app.domain.model.SettingsKey.StringKey
import de.krisenvorrat.app.domain.model.SyncError
import de.krisenvorrat.app.domain.repository.MessageRepository
import de.krisenvorrat.app.domain.repository.SettingsRepository
import de.krisenvorrat.shared.model.UserListItemDto
import de.bollwerk.app.data.db.dao.MessageDao
import de.bollwerk.app.data.db.entity.MessageEntity
import de.bollwerk.app.data.sync.WebSocketClient
import de.bollwerk.app.data.sync.WebSocketEvent
import de.bollwerk.app.di.ApplicationScope
import de.bollwerk.app.domain.model.SettingsKey.StringKey
import de.bollwerk.app.domain.model.SyncError
import de.bollwerk.app.domain.repository.MessageRepository
import de.bollwerk.app.domain.repository.SettingsRepository
import de.bollwerk.shared.model.UserListItemDto
import io.ktor.client.HttpClient
import io.ktor.client.call.body
import io.ktor.client.request.get

View file

@ -1,11 +1,11 @@
package de.krisenvorrat.app.data.repository
package de.bollwerk.app.data.repository
import de.krisenvorrat.app.data.db.dao.SettingsDao
import de.krisenvorrat.app.data.db.entity.SettingsEntity
import de.krisenvorrat.app.data.security.SecureTokenStorage
import de.krisenvorrat.app.domain.model.SettingsKey
import de.krisenvorrat.app.domain.model.SettingsKeys
import de.krisenvorrat.app.domain.repository.SettingsRepository
import de.bollwerk.app.data.db.dao.SettingsDao
import de.bollwerk.app.data.db.entity.SettingsEntity
import de.bollwerk.app.data.security.SecureTokenStorage
import de.bollwerk.app.domain.model.SettingsKey
import de.bollwerk.app.domain.model.SettingsKeys
import de.bollwerk.app.domain.repository.SettingsRepository
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map

View file

@ -1,7 +1,7 @@
package de.krisenvorrat.app.data.repository
package de.bollwerk.app.data.repository
import de.krisenvorrat.app.domain.model.VersionInfo
import de.krisenvorrat.app.domain.repository.UpdateRepository
import de.bollwerk.app.domain.model.VersionInfo
import de.bollwerk.app.domain.repository.UpdateRepository
import io.ktor.client.HttpClient
import io.ktor.client.call.body
import io.ktor.client.request.get

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.data.security
package de.bollwerk.app.data.security
import android.content.Context
import android.content.SharedPreferences
@ -13,7 +13,7 @@ internal class EncryptedPrefsTokenStorage(context: Context) : SecureTokenStorage
.build()
EncryptedSharedPreferences.create(
context,
"krisenvorrat_secure_prefs",
"bollwerk_secure_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.data.security
package de.bollwerk.app.data.security
internal interface SecureTokenStorage {
fun get(key: String): String?

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.data.sync
package de.bollwerk.app.data.sync
import kotlinx.serialization.Serializable

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.data.sync
package de.bollwerk.app.data.sync
internal sealed interface ConnectionState {
data object Connected : ConnectionState

View file

@ -1,13 +1,13 @@
package de.krisenvorrat.app.data.sync
package de.bollwerk.app.data.sync
import de.krisenvorrat.app.domain.model.SettingsKey.StringKey
import de.krisenvorrat.app.domain.model.SyncError
import de.krisenvorrat.app.domain.repository.SettingsRepository
import de.krisenvorrat.app.domain.repository.SyncService
import de.krisenvorrat.shared.model.CreateInventoryRequest
import de.krisenvorrat.shared.model.InventoryDto
import de.krisenvorrat.shared.model.InventoryInfoDto
import de.krisenvorrat.shared.model.ItemDto
import de.bollwerk.app.domain.model.SettingsKey.StringKey
import de.bollwerk.app.domain.model.SyncError
import de.bollwerk.app.domain.repository.SettingsRepository
import de.bollwerk.app.domain.repository.SyncService
import de.bollwerk.shared.model.CreateInventoryRequest
import de.bollwerk.shared.model.InventoryDto
import de.bollwerk.shared.model.InventoryInfoDto
import de.bollwerk.shared.model.ItemDto
import io.ktor.client.HttpClient
import io.ktor.client.call.body
import io.ktor.client.request.delete

View file

@ -1,6 +1,6 @@
package de.krisenvorrat.app.data.sync
package de.bollwerk.app.data.sync
import de.krisenvorrat.shared.model.MessageDto
import de.bollwerk.shared.model.MessageDto
import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.StateFlow

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.data.sync
package de.bollwerk.app.data.sync
import io.ktor.client.HttpClient
import io.ktor.client.engine.okhttp.OkHttp
@ -120,7 +120,7 @@ internal class WebSocketClientImpl @Inject constructor() : WebSocketClient {
"inventoryUpdated" -> _events.emit(WebSocketEvent.InventoryUpdated(event.itemId ?: ""))
"fullSyncRequired" -> _events.emit(WebSocketEvent.FullSyncRequired)
"new_message" -> {
val msg = de.krisenvorrat.shared.model.MessageDto(
val msg = de.bollwerk.shared.model.MessageDto(
id = event.id ?: return,
senderId = event.senderId ?: return,
senderUsername = event.senderUsername ?: return,

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.di
package de.bollwerk.app.di
import javax.inject.Qualifier

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.di
package de.bollwerk.app.di
import android.content.Context
import androidx.room.Room
@ -10,14 +10,14 @@ import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import de.krisenvorrat.app.data.db.KrisenvorratDatabase
import de.krisenvorrat.app.data.db.dao.CategoryDao
import de.krisenvorrat.app.data.db.dao.ItemDao
import de.krisenvorrat.app.data.db.dao.LocationDao
import de.krisenvorrat.app.data.db.dao.MessageDao
import de.krisenvorrat.app.data.db.dao.PendingSyncOpDao
import de.krisenvorrat.app.data.db.dao.SettingsDao
import de.krisenvorrat.app.data.export.DatabaseTransaction
import de.bollwerk.app.data.db.BollwerkDatabase
import de.bollwerk.app.data.db.dao.CategoryDao
import de.bollwerk.app.data.db.dao.ItemDao
import de.bollwerk.app.data.db.dao.LocationDao
import de.bollwerk.app.data.db.dao.MessageDao
import de.bollwerk.app.data.db.dao.PendingSyncOpDao
import de.bollwerk.app.data.db.dao.SettingsDao
import de.bollwerk.app.data.export.DatabaseTransaction
import javax.inject.Singleton
@Module
@ -26,8 +26,8 @@ internal object DatabaseModule {
@Provides
@Singleton
fun provideDatabase(@ApplicationContext context: Context): KrisenvorratDatabase =
Room.databaseBuilder(context, KrisenvorratDatabase::class.java, "krisenvorrat.db")
fun provideDatabase(@ApplicationContext context: Context): BollwerkDatabase =
Room.databaseBuilder(context, BollwerkDatabase::class.java, "bollwerk.db")
.addCallback(DefaultDataCallback)
.fallbackToDestructiveMigration()
.build()
@ -51,25 +51,25 @@ internal object DatabaseModule {
}
@Provides
fun provideItemDao(db: KrisenvorratDatabase): ItemDao = db.itemDao()
fun provideItemDao(db: BollwerkDatabase): ItemDao = db.itemDao()
@Provides
fun provideCategoryDao(db: KrisenvorratDatabase): CategoryDao = db.categoryDao()
fun provideCategoryDao(db: BollwerkDatabase): CategoryDao = db.categoryDao()
@Provides
fun provideLocationDao(db: KrisenvorratDatabase): LocationDao = db.locationDao()
fun provideLocationDao(db: BollwerkDatabase): LocationDao = db.locationDao()
@Provides
fun providePendingSyncOpDao(db: KrisenvorratDatabase): PendingSyncOpDao = db.pendingSyncOpDao()
fun providePendingSyncOpDao(db: BollwerkDatabase): PendingSyncOpDao = db.pendingSyncOpDao()
@Provides
fun provideSettingsDao(db: KrisenvorratDatabase): SettingsDao = db.settingsDao()
fun provideSettingsDao(db: BollwerkDatabase): SettingsDao = db.settingsDao()
@Provides
fun provideMessageDao(db: KrisenvorratDatabase): MessageDao = db.messageDao()
fun provideMessageDao(db: BollwerkDatabase): MessageDao = db.messageDao()
@Provides
@Singleton
fun provideDatabaseTransaction(db: KrisenvorratDatabase): DatabaseTransaction =
fun provideDatabaseTransaction(db: BollwerkDatabase): DatabaseTransaction =
DatabaseTransaction { block -> db.withTransaction(block) }
}

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.di
package de.bollwerk.app.di
import javax.inject.Qualifier

View file

@ -1,16 +1,16 @@
package de.krisenvorrat.app.di
package de.bollwerk.app.di
import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import de.krisenvorrat.app.data.remote.OpenAiVisionService
import de.krisenvorrat.app.data.remote.OpenAiVisionServiceImpl
import de.krisenvorrat.app.data.sync.SyncServiceImpl
import de.krisenvorrat.app.data.sync.WebSocketClient
import de.krisenvorrat.app.data.sync.WebSocketClientImpl
import de.krisenvorrat.app.domain.repository.SyncService
import de.bollwerk.app.data.remote.OpenAiVisionService
import de.bollwerk.app.data.remote.OpenAiVisionServiceImpl
import de.bollwerk.app.data.sync.SyncServiceImpl
import de.bollwerk.app.data.sync.WebSocketClient
import de.bollwerk.app.data.sync.WebSocketClientImpl
import de.bollwerk.app.domain.repository.SyncService
import io.ktor.client.HttpClient
import io.ktor.client.engine.okhttp.OkHttp
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation

View file

@ -1,25 +1,25 @@
package de.krisenvorrat.app.di
package de.bollwerk.app.di
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import de.krisenvorrat.app.data.export.ImportExportRepositoryImpl
import de.krisenvorrat.app.data.repository.ApkInstallerImpl
import de.krisenvorrat.app.data.repository.CategoryRepositoryImpl
import de.krisenvorrat.app.data.repository.ItemRepositoryImpl
import de.krisenvorrat.app.data.repository.LocationRepositoryImpl
import de.krisenvorrat.app.data.repository.MessageRepositoryImpl
import de.krisenvorrat.app.data.repository.SettingsRepositoryImpl
import de.krisenvorrat.app.data.repository.UpdateRepositoryImpl
import de.krisenvorrat.app.domain.repository.CategoryRepository
import de.krisenvorrat.app.domain.repository.ImportExportRepository
import de.krisenvorrat.app.domain.repository.ItemRepository
import de.krisenvorrat.app.domain.repository.LocationRepository
import de.krisenvorrat.app.domain.repository.MessageRepository
import de.krisenvorrat.app.domain.repository.SettingsRepository
import de.krisenvorrat.app.domain.repository.UpdateRepository
import de.krisenvorrat.app.domain.usecase.ApkInstaller
import de.bollwerk.app.data.export.ImportExportRepositoryImpl
import de.bollwerk.app.data.repository.ApkInstallerImpl
import de.bollwerk.app.data.repository.CategoryRepositoryImpl
import de.bollwerk.app.data.repository.ItemRepositoryImpl
import de.bollwerk.app.data.repository.LocationRepositoryImpl
import de.bollwerk.app.data.repository.MessageRepositoryImpl
import de.bollwerk.app.data.repository.SettingsRepositoryImpl
import de.bollwerk.app.data.repository.UpdateRepositoryImpl
import de.bollwerk.app.domain.repository.CategoryRepository
import de.bollwerk.app.domain.repository.ImportExportRepository
import de.bollwerk.app.domain.repository.ItemRepository
import de.bollwerk.app.domain.repository.LocationRepository
import de.bollwerk.app.domain.repository.MessageRepository
import de.bollwerk.app.domain.repository.SettingsRepository
import de.bollwerk.app.domain.repository.UpdateRepository
import de.bollwerk.app.domain.usecase.ApkInstaller
import javax.inject.Singleton
@Module

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.di
package de.bollwerk.app.di
import android.content.Context
import dagger.Module
@ -6,8 +6,8 @@ import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import de.krisenvorrat.app.data.security.EncryptedPrefsTokenStorage
import de.krisenvorrat.app.data.security.SecureTokenStorage
import de.bollwerk.app.data.security.EncryptedPrefsTokenStorage
import de.bollwerk.app.data.security.SecureTokenStorage
import javax.inject.Singleton
@Module

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.domain.model
package de.bollwerk.app.domain.model
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.Json

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.domain.model
package de.bollwerk.app.domain.model
internal data class CategorySummary(
val categoryId: Int,

View file

@ -1,6 +1,6 @@
package de.krisenvorrat.app.domain.model
package de.bollwerk.app.domain.model
import de.krisenvorrat.app.data.db.entity.ItemEntity
import de.bollwerk.app.data.db.entity.ItemEntity
internal enum class ExpiryUrgency {
URGENT,

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.domain.model
package de.bollwerk.app.domain.model
import kotlinx.serialization.Serializable

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.domain.model
package de.bollwerk.app.domain.model
/**
* Type-safe Settings-Key-Definition.

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.domain.model
package de.bollwerk.app.domain.model
/**
* Kompatibilitätsschicht: leitet alle Konstanten an [SettingsKey] weiter.

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.domain.model
package de.bollwerk.app.domain.model
internal sealed class SyncError(message: String, cause: Throwable? = null) : Exception(message, cause) {
class ConnectionError(cause: Throwable? = null) :

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.domain.model
package de.bollwerk.app.domain.model
internal sealed interface UpdateCheckResult {
data class UpdateAvailable(val versionInfo: VersionInfo) : UpdateCheckResult

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.server.model
package de.bollwerk.app.domain.model
import kotlinx.serialization.Serializable

View file

@ -1,6 +1,6 @@
package de.krisenvorrat.app.domain.repository
package de.bollwerk.app.domain.repository
import de.krisenvorrat.app.data.db.entity.CategoryEntity
import de.bollwerk.app.data.db.entity.CategoryEntity
import kotlinx.coroutines.flow.Flow
internal interface CategoryRepository {

View file

@ -1,6 +1,6 @@
package de.krisenvorrat.app.domain.repository
package de.bollwerk.app.domain.repository
import de.krisenvorrat.shared.model.InventoryDto
import de.bollwerk.shared.model.InventoryDto
import java.io.File
internal interface ImportExportRepository {

View file

@ -1,6 +1,6 @@
package de.krisenvorrat.app.domain.repository
package de.bollwerk.app.domain.repository
import de.krisenvorrat.app.data.db.entity.ItemEntity
import de.bollwerk.app.data.db.entity.ItemEntity
import kotlinx.coroutines.flow.Flow
internal interface ItemRepository {

View file

@ -1,6 +1,6 @@
package de.krisenvorrat.app.domain.repository
package de.bollwerk.app.domain.repository
import de.krisenvorrat.app.data.db.entity.LocationEntity
import de.bollwerk.app.data.db.entity.LocationEntity
import kotlinx.coroutines.flow.Flow
internal interface LocationRepository {

View file

@ -1,7 +1,7 @@
package de.krisenvorrat.app.domain.repository
package de.bollwerk.app.domain.repository
import de.krisenvorrat.app.data.db.entity.MessageEntity
import de.krisenvorrat.shared.model.UserListItemDto
import de.bollwerk.app.data.db.entity.MessageEntity
import de.bollwerk.shared.model.UserListItemDto
import kotlinx.coroutines.flow.Flow
internal interface MessageRepository {

View file

@ -1,7 +1,7 @@
package de.krisenvorrat.app.domain.repository
package de.bollwerk.app.domain.repository
import de.krisenvorrat.app.data.db.entity.SettingsEntity
import de.krisenvorrat.app.domain.model.SettingsKey
import de.bollwerk.app.data.db.entity.SettingsEntity
import de.bollwerk.app.domain.model.SettingsKey
import kotlinx.coroutines.flow.Flow
internal interface SettingsRepository {

View file

@ -1,8 +1,8 @@
package de.krisenvorrat.app.domain.repository
package de.bollwerk.app.domain.repository
import de.krisenvorrat.shared.model.InventoryDto
import de.krisenvorrat.shared.model.InventoryInfoDto
import de.krisenvorrat.shared.model.ItemDto
import de.bollwerk.shared.model.InventoryDto
import de.bollwerk.shared.model.InventoryInfoDto
import de.bollwerk.shared.model.ItemDto
internal interface SyncService {
suspend fun downloadInventory(since: Long? = null): Result<InventoryDto>

View file

@ -1,6 +1,6 @@
package de.krisenvorrat.app.domain.repository
package de.bollwerk.app.domain.repository
import de.krisenvorrat.app.domain.model.VersionInfo
import de.bollwerk.app.domain.model.VersionInfo
import java.io.File
internal interface UpdateRepository {

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.domain.usecase
package de.bollwerk.app.domain.usecase
import java.io.File

View file

@ -1,8 +1,8 @@
package de.krisenvorrat.app.domain.usecase
package de.bollwerk.app.domain.usecase
import de.krisenvorrat.app.data.db.entity.CategoryEntity
import de.krisenvorrat.app.data.db.entity.ItemEntity
import de.krisenvorrat.app.domain.model.CategorySummary
import de.bollwerk.app.data.db.entity.CategoryEntity
import de.bollwerk.app.data.db.entity.ItemEntity
import de.bollwerk.app.domain.model.CategorySummary
import javax.inject.Inject
internal class CalculateCategorySummaryUseCase @Inject constructor() {

View file

@ -1,6 +1,6 @@
package de.krisenvorrat.app.domain.usecase
package de.bollwerk.app.domain.usecase
import de.krisenvorrat.app.data.db.entity.ItemEntity
import de.bollwerk.app.data.db.entity.ItemEntity
import javax.inject.Inject
internal class CalculateSupplyRangeUseCase @Inject constructor() {

View file

@ -1,6 +1,6 @@
package de.krisenvorrat.app.domain.usecase
package de.bollwerk.app.domain.usecase
import de.krisenvorrat.app.data.db.entity.ItemEntity
import de.bollwerk.app.data.db.entity.ItemEntity
import javax.inject.Inject
internal class CalculateTotalValueUseCase @Inject constructor() {

Some files were not shown because too many files have changed in this diff Show more