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 ## 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 ## Technischer Stack

View file

@ -2,7 +2,7 @@
applyTo: "**/*.kt" applyTo: "**/*.kt"
--- ---
# Kotlin Coding Conventions Krisenvorrat App # Kotlin Coding Conventions Bollwerk App
Diese Konventionen gelten für alle Kotlin-Dateien im Workspace. 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 ```powershell
# 1. Ticket zum Board hinzufügen # 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) # 2. Bestehende Order-Werte abfragen (höchsten Wert ermitteln)
& ".github/skills/gh-tickets/next-ticket.ps1" | Out-Null # zeigt alle offenen Tickets mit Order & ".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 ```powershell
# 1. Ticket zum Board hinzufügen # 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) # 2. Bestehende Order-Werte abfragen (höchsten Wert ermitteln)
& ".github/skills/gh-tickets/next-ticket.ps1" | Out-Null # zeigt alle offenen Tickets mit Order & ".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 # 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) #### Variante A via `execution_subagent` (empfohlen)
``` ```
cd x:\krisenvorrat ; .\gradlew assembleDebug test cd x:\bollwerk ; .\gradlew assembleDebug test
``` ```
- `.\gradlew` (ohne `.bat`) funktioniert hier einwandfrei - `.\gradlew` (ohne `.bat`) funktioniert hier einwandfrei
@ -75,7 +75,7 @@ cd x:\krisenvorrat ; .\gradlew assembleDebug test
```powershell ```powershell
$env:ANDROID_HOME = "C:\Users\JensR\AppData\Local\Android\Sdk" $env:ANDROID_HOME = "C:\Users\JensR\AppData\Local\Android\Sdk"
cd "x:\krisenvorrat" cd "x:\bollwerk"
.\gradlew.bat assembleDebug 2>&1 | Out-String .\gradlew.bat assembleDebug 2>&1 | Out-String
``` ```

View file

@ -1,6 +1,6 @@
<# <#
.SYNOPSIS .SYNOPSIS
Zentrales Entwicklungsskript für die Krisenvorrat Android-App. Zentrales Entwicklungsskript für die Bollwerk Android-App.
.DESCRIPTION .DESCRIPTION
Handhabt Build, Deploy und Emulator-Operationen. 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" $APK_PATH = "$PROJECT_DIR\app\build\outputs\apk\debug\app-debug.apk"
$AVD_NAME = "S24Ultra_API35" $AVD_NAME = "S24Ultra_API35"
$GPU_MODE = "guest" # 'guest' = Software-Rendering im Gast (host/auto/swiftshader scheitern an fehlendem OpenGL Core Profile) $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" $ACTIVITY = "$PACKAGE/.MainActivity"
$BOOT_TIMEOUT = 300 # Sekunden (erster Boot eines neuen AVD kann >2min dauern) $BOOT_TIMEOUT = 300 # Sekunden (erster Boot eines neuen AVD kann >2min dauern)
$ADB_CONNECT_TIMEOUT = 120 # Sekunden auf ADB-Verbindung warten $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) # 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! $dev = "192.168.68.107:42539" # Port prüfen!
# 1. Build # 1. Build
cd X:\krisenvorrat cd X:\bollwerk
.\gradlew.bat assembleDebug .\gradlew.bat assembleDebug
# 2. Install # 2. Install
& $adb -s $dev install -r "app\build\outputs\apk\debug\app-debug.apk" & $adb -s $dev install -r "app\build\outputs\apk\debug\app-debug.apk"
# 3. Launch # 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 ### App installieren
@ -144,19 +144,19 @@ cd X:\krisenvorrat
### App starten ### App starten
```powershell ```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 ### App stoppen
```powershell ```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) ### Logcat (gefiltert auf App)
```powershell ```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 ### Screenshot vom Gerät
@ -173,7 +173,7 @@ cd X:\krisenvorrat
### App deinstallieren ### App deinstallieren
```powershell ```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:** **Lösung:**
```powershell ```powershell
& $adb -d uninstall de.krisenvorrat.app & $adb -d uninstall de.bollwerk.app
& $adb -d install "app\build\outputs\apk\debug\app-debug.apk" & $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 # 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 ### App starten
```powershell ```powershell
& $adb shell am start -n de.krisenvorrat.app/.MainActivity & $adb shell am start -n de.bollwerk.app/.MainActivity
``` ```
### App stoppen ### App stoppen
```powershell ```powershell
& $adb shell am force-stop de.krisenvorrat.app & $adb shell am force-stop de.bollwerk.app
``` ```
### Logcat (gefiltert) ### Logcat (gefiltert)
```powershell ```powershell
& $adb logcat --pid=$(& $adb shell pidof de.krisenvorrat.app) -v time & $adb logcat --pid=$(& $adb shell pidof de.bollwerk.app) -v time
``` ```
### Screenshot ### Screenshot

View file

@ -5,7 +5,7 @@ description: "Konventionen für GitHub-Issues in diesem Workspace: Aufgabentyp-L
# Skill: GitHub Tickets (gh-tickets) # 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 | | Eigenschaft | Wert |
| ------------- | ----------------------------------------------------------------- | | ------------- | ----------------------------------------------------------------- |
| Projekt-Name | `Krisenvorrat` | | Projekt-Name | `Bollwerk` |
| Projekt-Nr | `2` | | Projekt-Nr | `2` |
| Owner | `jreinemann-euris` | | Owner | `jreinemann-euris` |
| Sortierfeld | `Order` (Number-Feld) | | Sortierfeld | `Order` (Number-Feld) |
@ -91,7 +91,7 @@ Ausgabe: `#68 [M] CRM: Erweiterte Kundensuche (Order: 120)`
```powershell ```powershell
# Issue zum Board hinzufügen # 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) # 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> 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" [string]$Status = "Todo"
) )
$repo = "jreinemann-euris/krisenvorrat" $repo = "jreinemann-euris/bollwerk"
$projectId = "PVT_kwHOCFqiJ84BXk9U" $projectId = "PVT_kwHOCFqiJ84BXk9U"
$orderFieldId = "PVTF_lAHOCFqiJ84BXk9UzhSw4jo" $orderFieldId = "PVTF_lAHOCFqiJ84BXk9UzhSw4jo"
$statusFieldId = "PVTSSF_lAHOCFqiJ84BXk9UzhSw4es" $statusFieldId = "PVTSSF_lAHOCFqiJ84BXk9UzhSw4es"

View file

@ -9,7 +9,7 @@
#> #>
param([int]$IssueNumber) param([int]$IssueNumber)
$repo = "jreinemann-euris/krisenvorrat" $repo = "jreinemann-euris/bollwerk"
if ($IssueNumber -gt 0) { if ($IssueNumber -gt 0) {
# Variante A: Explizite Issue-Nummer # 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 (lokal) VPS (195.246.231.210)
───────────── ───────────────────── ───────────── ─────────────────────
app/build.gradle.kts /opt/krisenvorrat/ app/build.gradle.kts /opt/bollwerk/
versionCode / versionName ├── docker-compose.yml (KRISENVORRAT_APP_VERSION_CODE/NAME) versionCode / versionName ├── docker-compose.yml (BOLLWERK_APP_VERSION_CODE/NAME)
├── data/app-latest.apk (statisch ausgeliefert) ├── data/app-latest.apk (statisch ausgeliefert)
./gradlew assembleDebug └── Server-Container (Ktor) ./gradlew assembleDebug └── Server-Container (Ktor)
→ app-debug.apk ├── GET / → Homepage mit QR-Code → app-debug.apk ├── GET / → Homepage mit QR-Code
├── GET /api/version → JSON {versionCode, versionName, apkUrl} ├── 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 ### Wie die Update-Prüfung funktioniert
@ -35,7 +35,7 @@ scp → /opt/krisenvorrat/data/ └── GET /static/* → Dateie
### Wie die Homepage funktioniert ### Wie die Homepage funktioniert
- `GET /` liefert HTML mit QR-Code (via qrcodejs) + Download-Link auf `/static/app-latest.apk` - `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 ### Schritt 3 APK auf VPS hochladen
```powershell ```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). **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 ```powershell
# Neue Werte per sed in docker-compose.yml eintragen # 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: Falls die Env-Vars noch nicht in der docker-compose.yml stehen, müssen sie einmalig hinzugefügt werden:
```powershell ```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 ### Schritt 5 Server neustarten
```powershell ```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 ### Schritt 6 Verifizieren

View file

@ -1,6 +1,6 @@
<# <#
.SYNOPSIS .SYNOPSIS
Publiziert eine APK auf den Krisenvorrat VPS. Publiziert eine APK auf den Bollwerk VPS.
.DESCRIPTION .DESCRIPTION
Lädt die APK auf den VPS hoch, aktualisiert die Version in der Lädt die APK auf den VPS hoch, aktualisiert die Version in der
docker-compose.yml und startet den Server-Container neu. docker-compose.yml und startet den Server-Container neu.
@ -22,7 +22,7 @@ param(
$ErrorActionPreference = "Stop" $ErrorActionPreference = "Stop"
$VPS = "root@195.246.231.210" $VPS = "root@195.246.231.210"
$RemoteDir = "/opt/krisenvorrat" $RemoteDir = "/opt/bollwerk"
# --- Preflight --- # --- Preflight ---
Write-Host "=== Publish APK v$VersionName (build $VersionCode) ===" -ForegroundColor Cyan 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 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) # 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 $checkResult = ssh $VPS $checkCmd
# SSH kann Array zurückgeben (z.B. Banner + Ergebnis) - letzte Zeile nehmen # SSH kann Array zurückgeben (z.B. Banner + Ergebnis) - letzte Zeile nehmen
if ($checkResult -is [array]) { $checkResult = $checkResult[-1] } if ($checkResult -is [array]) { $checkResult = $checkResult[-1] }
@ -59,11 +59,11 @@ $hasVersionCode = [int]($checkResult.Trim())
if ($hasVersionCode -gt 0) { if ($hasVersionCode -gt 0) {
# Update bestehende Einträge # 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 ssh $VPS $sedCmd
} else { } else {
# Erstmalig hinzufügen (nach JWT_SECRET-Zeile) # 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 ssh $VPS $addCmd
} }
if ($LASTEXITCODE -ne 0) { Write-Error "Version-Update fehlgeschlagen."; exit 1 } if ($LASTEXITCODE -ne 0) { Write-Error "Version-Update fehlgeschlagen."; exit 1 }

View file

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

View file

@ -5,7 +5,7 @@ description: "Server auf den VPS (1984 Hosting, Island) deployen, Docker-Contain
# Skill: VPS Deploy # 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 | | Disk | 25 GB SSD |
| Transfer | 1 TB/Monat | | Transfer | 1 TB/Monat |
| Docker | Docker CE 29.x + docker-compose-plugin | | 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` | | Fingerprint | `SHA256:J/qjVt9r8CqnoshZFQWutau+3KG7JxDzRLHPyX41+gA` |
| Private Key | `C:\Users\JensR\.ssh\id_ed25519` (passphrase-geschützt) | | Private Key | `C:\Users\JensR\.ssh\id_ed25519` (passphrase-geschützt) |
| Public Key | `C:\Users\JensR\.ssh\id_ed25519.pub` | | Public Key | `C:\Users\JensR\.ssh\id_ed25519.pub` |
| Kommentar | `krisenvorrat-vps` | | Kommentar | `bollwerk-vps` |
--- ---
@ -69,27 +69,27 @@ ssh-add -l
```powershell ```powershell
# 1. Fat-JAR lokal bauen # 1. Fat-JAR lokal bauen
cd x:\krisenvorrat cd x:\bollwerk
.\gradlew.bat :server:buildFatJar .\gradlew.bat :server:buildFatJar
# 2. JAR auf VPS kopieren # 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 # 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) ### Nur Container neustarten (ohne neues JAR)
```powershell ```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 ## Docker-Konfiguration auf dem VPS
### Dockerfile (`/opt/krisenvorrat/Dockerfile`) ### Dockerfile (`/opt/bollwerk/Dockerfile`)
```dockerfile ```dockerfile
FROM eclipse-temurin:21-jre-alpine 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. **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 ```yaml
services: services:
krisenvorrat: bollwerk:
build: . build: .
container_name: krisenvorrat-server container_name: bollwerk-server
restart: unless-stopped restart: unless-stopped
ports: ports:
- '8080:8080' - '8080:8080'
environment: environment:
- KRISENVORRAT_JWT_SECRET=<secret> - BOLLWERK_JWT_SECRET=<secret>
volumes: volumes:
- ./data:/app/data - ./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-UI:** `http://195.246.231.210:8080/admin/`
- **Admin-User:** `admin` - **Admin-User:** `admin`
- **Admin-Passwort:** Der User muss das Passwort selbst eingeben. Es ist NICHT gespeichert bei Bedarf den User fragen. - **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 ### Environment-Variablen
| Variable | Pflicht | Beschreibung | | Variable | Pflicht | Beschreibung |
| ------------------------------- | ------- | --------------------------------------------------- | | ------------------------------- | ------- | --------------------------------------------------- |
| `KRISENVORRAT_JWT_SECRET` | ja | Secret für JWT-Token-Signierung (mind. 32 Zeichen) | | `BOLLWERK_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_ADMIN_PASSWORD` | nein | Admin-Passwort beim ersten Start (sonst auto-gen.) |
--- ---
@ -173,10 +173,10 @@ ssh root@195.246.231.210 "docker ps"
```powershell ```powershell
# Letzte 50 Zeilen # 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) # 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 ### Health-Check
@ -192,9 +192,9 @@ ssh root@195.246.231.210 "curl -s http://localhost:8080/api/health"
### Container stoppen/starten ### Container stoppen/starten
```powershell ```powershell
ssh root@195.246.231.210 "cd /opt/krisenvorrat && docker compose stop" ssh root@195.246.231.210 "cd /opt/bollwerk && docker compose stop"
ssh root@195.246.231.210 "cd /opt/krisenvorrat && docker compose start" ssh root@195.246.231.210 "cd /opt/bollwerk && 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 down" # Container entfernen
``` ```
### RAM-Nutzung prüfen ### RAM-Nutzung prüfen
@ -205,7 +205,7 @@ ssh root@195.246.231.210 "free -h && echo '---' && docker stats --no-stream"
### Daten-Persistenz ### 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. - **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 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. - **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. - **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 **Version:** 1.0
**Datum:** 2026-05-13 **Datum:** 2026-05-13
@ -8,7 +8,7 @@
## 1. Projektziel ## 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 - **Design:** Klar, funktional, industriell Material 3 Komponenten
- **Navigation:** Bottom Navigation Bar (Übersicht / Inventur / Warnungen / Einstellungen) - **Navigation:** Bottom Navigation Bar (Übersicht / Inventur / Warnungen / Einstellungen)
- **Eingabe:** Große Touch-Targets, Dropdown für Einheiten/Kategorien/Lagerorte - **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 | | Name | Seed-Hex | Primär (Dark) | Charakter | M3-kompatibel | Lesbarkeit | Score |
| ----------------------- | --------- | ------------------- | ----------------------------------------- | ------------- | ---------- | ----- | | ----------------------- | --------- | ------------------- | ----------------------------------------- | ------------- | ---------- | ----- |
| A1 Forest Green | `#2E7D32` | `#6EC072` (tone 80) | Klassisch dunkelgrün, bekannt, klar | ✅ | ✅ | 8 | | 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 | | 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 | | 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 - ✅ Must: Alle erfüllt
- ✅ Should: Erkennbarer Charakter, solide Kontraste - ✅ 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`) #### 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. **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 - ✅ Must: Alle erfüllt
- ✅ Should: Maximale thematische Eigenständigkeit, excellent Lesbarkeit - ✅ Should: Maximale thematische Eigenständigkeit, excellent Lesbarkeit
@ -86,7 +86,7 @@ MaterialTheme(colorScheme = DarkColorScheme) { ... }
``` ```
- ✅ Funktioniert auf allen Android-Versionen - ✅ Funktioniert auf allen Android-Versionen
- ✅ Konsistente "Krisenvorrat"-Markenidentität bei jedem User - ✅ Konsistente "Bollwerk"-Markenidentität bei jedem User
- ✅ Einfache Implementierung, geringer Wartungsaufwand - ✅ Einfache Implementierung, geringer Wartungsaufwand
- ✅ Die grün/anthrazite Ästhetik wird IMMER angezeigt - ✅ 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 - 🔴 Verliert grüne Ästhetik App sieht aus wie jede andere App
- 🔴 Schließt Android 811 aus (>30% Marktanteil) - 🔴 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 #### B3 Hybrid
- ⚠️ Komplexität ohne echten Mehrwert für diesen Use Case - ⚠️ 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 ### A Seed Color
**Gewählt:** `#4A6741` (Olivgrün / Militärgrün) **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) **Alternativen:** `#2E7D32` (Forest Green, zu generisch), `#1B5E20` (zu dunkel), `#3A5F3A` (zu ähnlich zu Forest Green)
### B Dynamic Color ### B Dynamic Color
**Gewählt:** Fixed Custom Palette (B1) **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) **Alternativen:** Dynamic Color (verliert Branding), Hybrid (unnötige Komplexität)
### C Typography ### C Typography

View file

@ -1,7 +1,7 @@
# Technology Requirements DB-Migrationsstrategie # Technology Requirements DB-Migrationsstrategie
Date: 2026-05-17 Date: 2026-05-17
Author: Krisenvorrat-Projekt Author: Bollwerk-Projekt
## Must-Have (eliminators) ## 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 - **Stil:** Klar, funktional, industriell
- **UI-Framework:** Material 3 Komponenten - **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 ### 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) - Anthrazit-Töne für Oberflächen (nicht reines Schwarz, nicht Hellgrau)
- Erkennbarer visueller Charakter App soll eigenständig aussehen - Erkennbarer visueller Charakter App soll eigenständig aussehen

View file

@ -8,7 +8,7 @@
## Kontext ## 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. Das bestehende Client-Datenmodell nutzt kotlinx.serialization für JSON-Export/Import.

View file

@ -8,7 +8,7 @@ Author: Tech-Decision Workflow
## Kontext ## 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:** **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 ## Projektstruktur
@ -94,15 +94,15 @@ java -jar server/build/libs/server.jar
```bash ```bash
# Image bauen # Image bauen
docker build -t krisenvorrat-server . docker build -t bollwerk-server .
# Container starten # Container starten
docker run -d \ docker run -d \
--name krisenvorrat \ --name bollwerk \
-p 8080:8080 \ -p 8080:8080 \
-e KRISENVORRAT_API_KEY="mein-sicherer-api-key" \ -e BOLLWERK_API_KEY="mein-sicherer-api-key" \
-v krisenvorrat-data:/app/data \ -v bollwerk-data:/app/data \
krisenvorrat-server bollwerk-server
``` ```
### LAN-Setup ### LAN-Setup
@ -113,7 +113,7 @@ docker run -d \
- Die Start-Skripte zeigen die IP automatisch an - Die Start-Skripte zeigen die IP automatisch an
2. **Firewall-Regel:** Port **8080** (TCP eingehend) muss freigeschaltet sein: 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` - Linux: `sudo ufw allow 8080/tcp`
3. **App konfigurieren:** 3. **App konfigurieren:**
@ -134,7 +134,7 @@ docker run -d \
| Variable | Standard | Beschreibung | | 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 ### Sicherheitshinweise

View file

@ -8,11 +8,11 @@ plugins {
} }
android { android {
namespace = "de.krisenvorrat.app" namespace = "de.bollwerk.app"
compileSdk = 35 compileSdk = 35
defaultConfig { defaultConfig {
applicationId = "de.krisenvorrat.app" applicationId = "de.bollwerk.app"
minSdk = 26 minSdk = 26
targetSdk = 35 targetSdk = 35
versionCode = 3 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.room.Room
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry import androidx.test.platform.app.InstrumentationRegistry
import de.krisenvorrat.app.data.db.entity.CategoryEntity import de.bollwerk.app.data.db.entity.CategoryEntity
import de.krisenvorrat.app.data.db.entity.LocationEntity import de.bollwerk.app.data.db.entity.LocationEntity
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import org.junit.After import org.junit.After
@ -22,9 +22,9 @@ import org.junit.runner.RunWith
* Neue AutoMigrations werden automatisch durch Room validiert. * Neue AutoMigrations werden automatisch durch Room validiert.
*/ */
@RunWith(AndroidJUnit4::class) @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 private val context get() = InstrumentationRegistry.getInstrumentation().targetContext
@Before @Before
@ -39,7 +39,7 @@ internal class KrisenvorratDatabaseMigrationTest {
@Test @Test
fun freshInstall_allTablesExist() { fun freshInstall_allTablesExist() {
val db = Room.inMemoryDatabaseBuilder(context, KrisenvorratDatabase::class.java) val db = Room.inMemoryDatabaseBuilder(context, BollwerkDatabase::class.java)
.build() .build()
try { try {
val tables = mutableListOf<String>() val tables = mutableListOf<String>()
@ -64,7 +64,7 @@ internal class KrisenvorratDatabaseMigrationTest {
@Test @Test
fun freshInstall_crudOperationsWork() { fun freshInstall_crudOperationsWork() {
val db = Room.inMemoryDatabaseBuilder(context, KrisenvorratDatabase::class.java) val db = Room.inMemoryDatabaseBuilder(context, BollwerkDatabase::class.java)
.build() .build()
try { try {
runBlocking { 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.room.Room
import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import de.krisenvorrat.app.data.db.KrisenvorratDatabase import de.bollwerk.app.data.db.BollwerkDatabase
import de.krisenvorrat.app.data.db.entity.CategoryEntity import de.bollwerk.app.data.db.entity.CategoryEntity
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import org.junit.After import org.junit.After
@ -17,14 +17,14 @@ import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
internal class CategoryDaoTest { internal class CategoryDaoTest {
private lateinit var db: KrisenvorratDatabase private lateinit var db: BollwerkDatabase
private lateinit var dao: CategoryDao private lateinit var dao: CategoryDao
@Before @Before
fun setup() { fun setup() {
db = Room.inMemoryDatabaseBuilder( db = Room.inMemoryDatabaseBuilder(
ApplicationProvider.getApplicationContext(), ApplicationProvider.getApplicationContext(),
KrisenvorratDatabase::class.java BollwerkDatabase::class.java
).allowMainThreadQueries().build() ).allowMainThreadQueries().build()
dao = db.categoryDao() 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.room.Room
import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import de.krisenvorrat.app.data.db.KrisenvorratDatabase import de.bollwerk.app.data.db.BollwerkDatabase
import de.krisenvorrat.app.data.db.entity.CategoryEntity import de.bollwerk.app.data.db.entity.CategoryEntity
import de.krisenvorrat.app.data.db.entity.ItemEntity import de.bollwerk.app.data.db.entity.ItemEntity
import de.krisenvorrat.app.data.db.entity.LocationEntity import de.bollwerk.app.data.db.entity.LocationEntity
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import org.junit.After import org.junit.After
@ -20,14 +20,14 @@ import java.time.LocalDate
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
internal class ItemDaoTest { internal class ItemDaoTest {
private lateinit var db: KrisenvorratDatabase private lateinit var db: BollwerkDatabase
private lateinit var dao: ItemDao private lateinit var dao: ItemDao
@Before @Before
fun setup() { fun setup() {
db = Room.inMemoryDatabaseBuilder( db = Room.inMemoryDatabaseBuilder(
ApplicationProvider.getApplicationContext(), ApplicationProvider.getApplicationContext(),
KrisenvorratDatabase::class.java BollwerkDatabase::class.java
).allowMainThreadQueries().build() ).allowMainThreadQueries().build()
dao = db.itemDao() dao = db.itemDao()
runBlocking { 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.room.Room
import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import de.krisenvorrat.app.data.db.KrisenvorratDatabase import de.bollwerk.app.data.db.BollwerkDatabase
import de.krisenvorrat.app.data.db.entity.LocationEntity import de.bollwerk.app.data.db.entity.LocationEntity
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import org.junit.After import org.junit.After
@ -17,14 +17,14 @@ import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
internal class LocationDaoTest { internal class LocationDaoTest {
private lateinit var db: KrisenvorratDatabase private lateinit var db: BollwerkDatabase
private lateinit var dao: LocationDao private lateinit var dao: LocationDao
@Before @Before
fun setup() { fun setup() {
db = Room.inMemoryDatabaseBuilder( db = Room.inMemoryDatabaseBuilder(
ApplicationProvider.getApplicationContext(), ApplicationProvider.getApplicationContext(),
KrisenvorratDatabase::class.java BollwerkDatabase::class.java
).allowMainThreadQueries().build() ).allowMainThreadQueries().build()
dao = db.locationDao() 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.room.Room
import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4
import de.krisenvorrat.app.data.db.KrisenvorratDatabase import de.bollwerk.app.data.db.BollwerkDatabase
import de.krisenvorrat.app.data.db.entity.SettingsEntity import de.bollwerk.app.data.db.entity.SettingsEntity
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import org.junit.After import org.junit.After
@ -17,14 +17,14 @@ import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class) @RunWith(AndroidJUnit4::class)
internal class SettingsDaoTest { internal class SettingsDaoTest {
private lateinit var db: KrisenvorratDatabase private lateinit var db: BollwerkDatabase
private lateinit var dao: SettingsDao private lateinit var dao: SettingsDao
@Before @Before
fun setup() { fun setup() {
db = Room.inMemoryDatabaseBuilder( db = Room.inMemoryDatabaseBuilder(
ApplicationProvider.getApplicationContext(), ApplicationProvider.getApplicationContext(),
KrisenvorratDatabase::class.java BollwerkDatabase::class.java
).allowMainThreadQueries().build() ).allowMainThreadQueries().build()
dao = db.settingsDao() dao = db.settingsDao()
} }

View file

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

View file

@ -5,19 +5,19 @@
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<application <application
android:name=".KrisenvorratApp" android:name=".BollwerkApp"
android:allowBackup="true" android:allowBackup="true"
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="@string/app_name" android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round" android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true" android:supportsRtl="true"
android:usesCleartextTraffic="true" android:usesCleartextTraffic="true"
android:theme="@style/Theme.Krisenvorrat"> android:theme="@style/Theme.Bollwerk">
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:exported="true" android:exported="true"
android:label="@string/app_name" android:label="@string/app_name"
android:theme="@style/Theme.Krisenvorrat"> android:theme="@style/Theme.Bollwerk">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" /> <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 android.app.Application
import dagger.hilt.android.HiltAndroidApp import dagger.hilt.android.HiltAndroidApp
@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 android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
@ -10,9 +10,9 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import de.krisenvorrat.app.domain.usecase.SeedDatabaseUseCase import de.bollwerk.app.domain.usecase.SeedDatabaseUseCase
import de.krisenvorrat.app.ui.MainScreen import de.bollwerk.app.ui.MainScreen
import de.krisenvorrat.app.ui.theme.KrisenvorratTheme import de.bollwerk.app.ui.theme.BollwerkTheme
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@ -26,7 +26,7 @@ class MainActivity : ComponentActivity() {
lifecycleScope.launch { seedDatabaseUseCase() } lifecycleScope.launch { seedDatabaseUseCase() }
enableEdgeToEdge() enableEdgeToEdge()
setContent { setContent {
KrisenvorratTheme { BollwerkTheme {
MainScreen() MainScreen()
} }
} }
@ -36,9 +36,9 @@ class MainActivity : ComponentActivity() {
@Preview(showBackground = true) @Preview(showBackground = true)
@Composable @Composable
fun DefaultPreview() { fun DefaultPreview() {
KrisenvorratTheme { BollwerkTheme {
Text( Text(
text = "Krisenvorrat", text = "Bollwerk",
style = MaterialTheme.typography.headlineLarge 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 androidx.room.TypeConverter
import java.time.LocalDate 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. * Ab Version 6 nutzt die App Room @AutoMigration für Schema-Änderungen.
* Manuelle Migrationen werden nur noch benötigt, wenn AutoMigration nicht * Manuelle Migrationen werden nur noch benötigt, wenn AutoMigration nicht
* ausreicht (z.B. Table-Rebuild, Daten-Transformation). * ausreicht (z.B. Table-Rebuild, Daten-Transformation).
* *
* Checkliste für neue Schema-Änderungen: * 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 * 2. @AutoMigration(from = X, to = Y) in der @Database-Annotation ergänzen
* 3. Falls AutoMigration nicht reicht: Migration(X, Y) hier 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 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.Dao
import androidx.room.Delete import androidx.room.Delete
@ -6,7 +6,7 @@ import androidx.room.Insert
import androidx.room.Query import androidx.room.Query
import androidx.room.Update import androidx.room.Update
import androidx.room.Upsert 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 import kotlinx.coroutines.flow.Flow
@Dao @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.Dao
import androidx.room.Delete import androidx.room.Delete
@ -6,7 +6,7 @@ import androidx.room.Insert
import androidx.room.Query import androidx.room.Query
import androidx.room.Update import androidx.room.Update
import androidx.room.Upsert 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 kotlinx.coroutines.flow.Flow
import java.time.LocalDate 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.Dao
import androidx.room.Delete import androidx.room.Delete
@ -6,7 +6,7 @@ import androidx.room.Insert
import androidx.room.Query import androidx.room.Query
import androidx.room.Update import androidx.room.Update
import androidx.room.Upsert 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 import kotlinx.coroutines.flow.Flow
@Dao @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.Dao
import androidx.room.Insert import androidx.room.Insert
import androidx.room.OnConflictStrategy import androidx.room.OnConflictStrategy
import androidx.room.Query import androidx.room.Query
import androidx.room.Upsert 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 import kotlinx.coroutines.flow.Flow
@Dao @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.Dao
import androidx.room.Insert import androidx.room.Insert
import androidx.room.OnConflictStrategy import androidx.room.OnConflictStrategy
import androidx.room.Query 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 import kotlinx.coroutines.flow.Flow
@Dao @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.Dao
import androidx.room.Query import androidx.room.Query
import androidx.room.Upsert 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 import kotlinx.coroutines.flow.Flow
@Dao @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.ColumnInfo
import androidx.room.Entity 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.ColumnInfo
import androidx.room.Entity 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.ColumnInfo
import androidx.room.Entity 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.ColumnInfo
import androidx.room.Entity 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.ColumnInfo
import androidx.room.Entity 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.ColumnInfo
import androidx.room.Entity 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.bollwerk.app.data.db.entity.CategoryEntity
import de.krisenvorrat.app.data.db.entity.ItemEntity import de.bollwerk.app.data.db.entity.ItemEntity
import de.krisenvorrat.app.data.db.entity.LocationEntity import de.bollwerk.app.data.db.entity.LocationEntity
import java.time.format.DateTimeFormatter import java.time.format.DateTimeFormatter
import java.util.Locale 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 { internal fun interface DatabaseTransaction {
suspend fun execute(block: suspend () -> Unit) 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.bollwerk.app.data.db.dao.CategoryDao
import de.krisenvorrat.app.data.db.dao.ItemDao import de.bollwerk.app.data.db.dao.ItemDao
import de.krisenvorrat.app.data.db.dao.LocationDao import de.bollwerk.app.data.db.dao.LocationDao
import de.krisenvorrat.app.data.db.dao.SettingsDao import de.bollwerk.app.data.db.dao.SettingsDao
import de.krisenvorrat.app.data.db.entity.CategoryEntity import de.bollwerk.app.data.db.entity.CategoryEntity
import de.krisenvorrat.app.data.db.entity.ItemEntity import de.bollwerk.app.data.db.entity.ItemEntity
import de.krisenvorrat.app.data.db.entity.LocationEntity import de.bollwerk.app.data.db.entity.LocationEntity
import de.krisenvorrat.app.data.db.entity.SettingsEntity import de.bollwerk.app.data.db.entity.SettingsEntity
import de.krisenvorrat.app.domain.model.SettingsKeys import de.bollwerk.app.domain.model.SettingsKeys
import de.krisenvorrat.app.domain.model.parseAgeGroupsFromJson import de.bollwerk.app.domain.model.parseAgeGroupsFromJson
import de.krisenvorrat.app.domain.model.totalDailyKcal import de.bollwerk.app.domain.model.totalDailyKcal
import de.krisenvorrat.app.domain.repository.ImportExportRepository import de.bollwerk.app.domain.repository.ImportExportRepository
import de.krisenvorrat.shared.model.CategoryDto import de.bollwerk.shared.model.CategoryDto
import de.krisenvorrat.shared.model.InventoryDto import de.bollwerk.shared.model.InventoryDto
import de.krisenvorrat.shared.model.ItemDto import de.bollwerk.shared.model.ItemDto
import de.krisenvorrat.shared.model.LocationDto import de.bollwerk.shared.model.LocationDto
import de.krisenvorrat.shared.model.SettingDto import de.bollwerk.shared.model.SettingDto
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@ -151,7 +151,7 @@ internal class ImportExportRepositoryImpl @Inject constructor(
val dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy", Locale.GERMAN) val dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy", Locale.GERMAN)
val sb = StringBuilder() val sb = StringBuilder()
sb.appendLine("# Krisenvorrat Inventar") sb.appendLine("# Bollwerk Inventar")
sb.appendLine() sb.appendLine()
for (category in categories) { 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.Paint
import android.graphics.Typeface import android.graphics.Typeface
import android.graphics.pdf.PdfDocument import android.graphics.pdf.PdfDocument
import de.krisenvorrat.app.data.db.entity.CategoryEntity import de.bollwerk.app.data.db.entity.CategoryEntity
import de.krisenvorrat.app.data.db.entity.ItemEntity import de.bollwerk.app.data.db.entity.ItemEntity
import de.krisenvorrat.app.data.db.entity.LocationEntity import de.bollwerk.app.data.db.entity.LocationEntity
import java.io.File import java.io.File
import java.io.FileOutputStream import java.io.FileOutputStream
import java.time.LocalDate import java.time.LocalDate
@ -64,7 +64,7 @@ internal object PdfExporter {
} }
// Title // Title
canvas.drawText("Krisenvorrat Inventar", MARGIN_LEFT, yPos, titlePaint) canvas.drawText("Bollwerk Inventar", MARGIN_LEFT, yPos, titlePaint)
yPos += 8f yPos += 8f
canvas.drawText( canvas.drawText(
"Erstellt am ${LocalDate.now().format(DATE_FORMATTER)}", "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.HttpClient
import io.ktor.client.call.body import io.ktor.client.call.body
import io.ktor.client.request.bearerAuth 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.Context
import android.content.Intent import android.content.Intent
import androidx.core.content.FileProvider import androidx.core.content.FileProvider
import dagger.hilt.android.qualifiers.ApplicationContext 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 java.io.File
import javax.inject.Inject 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.bollwerk.app.data.db.dao.CategoryDao
import de.krisenvorrat.app.data.db.entity.CategoryEntity import de.bollwerk.app.data.db.entity.CategoryEntity
import de.krisenvorrat.app.domain.repository.CategoryRepository import de.bollwerk.app.domain.repository.CategoryRepository
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.withContext 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.bollwerk.app.data.db.dao.ItemDao
import de.krisenvorrat.app.data.db.dao.PendingSyncOpDao import de.bollwerk.app.data.db.dao.PendingSyncOpDao
import de.krisenvorrat.app.data.db.entity.ItemEntity import de.bollwerk.app.data.db.entity.ItemEntity
import de.krisenvorrat.app.data.db.entity.PendingSyncOpEntity import de.bollwerk.app.data.db.entity.PendingSyncOpEntity
import de.krisenvorrat.app.data.sync.WebSocketClient import de.bollwerk.app.data.sync.WebSocketClient
import de.krisenvorrat.app.data.sync.WebSocketEvent import de.bollwerk.app.data.sync.WebSocketEvent
import de.krisenvorrat.app.di.ApplicationScope import de.bollwerk.app.di.ApplicationScope
import de.krisenvorrat.app.domain.model.SettingsKey.StringKey import de.bollwerk.app.domain.model.SettingsKey.StringKey
import de.krisenvorrat.app.domain.model.SyncError import de.bollwerk.app.domain.model.SyncError
import de.krisenvorrat.app.domain.repository.ItemRepository import de.bollwerk.app.domain.repository.ItemRepository
import de.krisenvorrat.app.domain.repository.SettingsRepository import de.bollwerk.app.domain.repository.SettingsRepository
import de.krisenvorrat.app.domain.repository.SyncService import de.bollwerk.app.domain.repository.SyncService
import de.krisenvorrat.shared.model.ItemDto import de.bollwerk.shared.model.ItemDto
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow 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.bollwerk.app.data.db.dao.LocationDao
import de.krisenvorrat.app.data.db.entity.LocationEntity import de.bollwerk.app.data.db.entity.LocationEntity
import de.krisenvorrat.app.domain.repository.LocationRepository import de.bollwerk.app.domain.repository.LocationRepository
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.withContext 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.bollwerk.app.data.db.dao.MessageDao
import de.krisenvorrat.app.data.db.entity.MessageEntity import de.bollwerk.app.data.db.entity.MessageEntity
import de.krisenvorrat.app.data.sync.WebSocketClient import de.bollwerk.app.data.sync.WebSocketClient
import de.krisenvorrat.app.data.sync.WebSocketEvent import de.bollwerk.app.data.sync.WebSocketEvent
import de.krisenvorrat.app.di.ApplicationScope import de.bollwerk.app.di.ApplicationScope
import de.krisenvorrat.app.domain.model.SettingsKey.StringKey import de.bollwerk.app.domain.model.SettingsKey.StringKey
import de.krisenvorrat.app.domain.model.SyncError import de.bollwerk.app.domain.model.SyncError
import de.krisenvorrat.app.domain.repository.MessageRepository import de.bollwerk.app.domain.repository.MessageRepository
import de.krisenvorrat.app.domain.repository.SettingsRepository import de.bollwerk.app.domain.repository.SettingsRepository
import de.krisenvorrat.shared.model.UserListItemDto import de.bollwerk.shared.model.UserListItemDto
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.call.body import io.ktor.client.call.body
import io.ktor.client.request.get 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.bollwerk.app.data.db.dao.SettingsDao
import de.krisenvorrat.app.data.db.entity.SettingsEntity import de.bollwerk.app.data.db.entity.SettingsEntity
import de.krisenvorrat.app.data.security.SecureTokenStorage import de.bollwerk.app.data.security.SecureTokenStorage
import de.krisenvorrat.app.domain.model.SettingsKey import de.bollwerk.app.domain.model.SettingsKey
import de.krisenvorrat.app.domain.model.SettingsKeys import de.bollwerk.app.domain.model.SettingsKeys
import de.krisenvorrat.app.domain.repository.SettingsRepository import de.bollwerk.app.domain.repository.SettingsRepository
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map 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.bollwerk.app.domain.model.VersionInfo
import de.krisenvorrat.app.domain.repository.UpdateRepository import de.bollwerk.app.domain.repository.UpdateRepository
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.call.body import io.ktor.client.call.body
import io.ktor.client.request.get 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.Context
import android.content.SharedPreferences import android.content.SharedPreferences
@ -13,7 +13,7 @@ internal class EncryptedPrefsTokenStorage(context: Context) : SecureTokenStorage
.build() .build()
EncryptedSharedPreferences.create( EncryptedSharedPreferences.create(
context, context,
"krisenvorrat_secure_prefs", "bollwerk_secure_prefs",
masterKey, masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM 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 { internal interface SecureTokenStorage {
fun get(key: String): String? 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 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 { internal sealed interface ConnectionState {
data object Connected : 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.bollwerk.app.domain.model.SettingsKey.StringKey
import de.krisenvorrat.app.domain.model.SyncError import de.bollwerk.app.domain.model.SyncError
import de.krisenvorrat.app.domain.repository.SettingsRepository import de.bollwerk.app.domain.repository.SettingsRepository
import de.krisenvorrat.app.domain.repository.SyncService import de.bollwerk.app.domain.repository.SyncService
import de.krisenvorrat.shared.model.CreateInventoryRequest import de.bollwerk.shared.model.CreateInventoryRequest
import de.krisenvorrat.shared.model.InventoryDto import de.bollwerk.shared.model.InventoryDto
import de.krisenvorrat.shared.model.InventoryInfoDto import de.bollwerk.shared.model.InventoryInfoDto
import de.krisenvorrat.shared.model.ItemDto import de.bollwerk.shared.model.ItemDto
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.call.body import io.ktor.client.call.body
import io.ktor.client.request.delete 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.SharedFlow
import kotlinx.coroutines.flow.StateFlow 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.HttpClient
import io.ktor.client.engine.okhttp.OkHttp import io.ktor.client.engine.okhttp.OkHttp
@ -120,7 +120,7 @@ internal class WebSocketClientImpl @Inject constructor() : WebSocketClient {
"inventoryUpdated" -> _events.emit(WebSocketEvent.InventoryUpdated(event.itemId ?: "")) "inventoryUpdated" -> _events.emit(WebSocketEvent.InventoryUpdated(event.itemId ?: ""))
"fullSyncRequired" -> _events.emit(WebSocketEvent.FullSyncRequired) "fullSyncRequired" -> _events.emit(WebSocketEvent.FullSyncRequired)
"new_message" -> { "new_message" -> {
val msg = de.krisenvorrat.shared.model.MessageDto( val msg = de.bollwerk.shared.model.MessageDto(
id = event.id ?: return, id = event.id ?: return,
senderId = event.senderId ?: return, senderId = event.senderId ?: return,
senderUsername = event.senderUsername ?: 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 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 android.content.Context
import androidx.room.Room import androidx.room.Room
@ -10,14 +10,14 @@ import dagger.Provides
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import de.krisenvorrat.app.data.db.KrisenvorratDatabase import de.bollwerk.app.data.db.BollwerkDatabase
import de.krisenvorrat.app.data.db.dao.CategoryDao import de.bollwerk.app.data.db.dao.CategoryDao
import de.krisenvorrat.app.data.db.dao.ItemDao import de.bollwerk.app.data.db.dao.ItemDao
import de.krisenvorrat.app.data.db.dao.LocationDao import de.bollwerk.app.data.db.dao.LocationDao
import de.krisenvorrat.app.data.db.dao.MessageDao import de.bollwerk.app.data.db.dao.MessageDao
import de.krisenvorrat.app.data.db.dao.PendingSyncOpDao import de.bollwerk.app.data.db.dao.PendingSyncOpDao
import de.krisenvorrat.app.data.db.dao.SettingsDao import de.bollwerk.app.data.db.dao.SettingsDao
import de.krisenvorrat.app.data.export.DatabaseTransaction import de.bollwerk.app.data.export.DatabaseTransaction
import javax.inject.Singleton import javax.inject.Singleton
@Module @Module
@ -26,8 +26,8 @@ internal object DatabaseModule {
@Provides @Provides
@Singleton @Singleton
fun provideDatabase(@ApplicationContext context: Context): KrisenvorratDatabase = fun provideDatabase(@ApplicationContext context: Context): BollwerkDatabase =
Room.databaseBuilder(context, KrisenvorratDatabase::class.java, "krisenvorrat.db") Room.databaseBuilder(context, BollwerkDatabase::class.java, "bollwerk.db")
.addCallback(DefaultDataCallback) .addCallback(DefaultDataCallback)
.fallbackToDestructiveMigration() .fallbackToDestructiveMigration()
.build() .build()
@ -51,25 +51,25 @@ internal object DatabaseModule {
} }
@Provides @Provides
fun provideItemDao(db: KrisenvorratDatabase): ItemDao = db.itemDao() fun provideItemDao(db: BollwerkDatabase): ItemDao = db.itemDao()
@Provides @Provides
fun provideCategoryDao(db: KrisenvorratDatabase): CategoryDao = db.categoryDao() fun provideCategoryDao(db: BollwerkDatabase): CategoryDao = db.categoryDao()
@Provides @Provides
fun provideLocationDao(db: KrisenvorratDatabase): LocationDao = db.locationDao() fun provideLocationDao(db: BollwerkDatabase): LocationDao = db.locationDao()
@Provides @Provides
fun providePendingSyncOpDao(db: KrisenvorratDatabase): PendingSyncOpDao = db.pendingSyncOpDao() fun providePendingSyncOpDao(db: BollwerkDatabase): PendingSyncOpDao = db.pendingSyncOpDao()
@Provides @Provides
fun provideSettingsDao(db: KrisenvorratDatabase): SettingsDao = db.settingsDao() fun provideSettingsDao(db: BollwerkDatabase): SettingsDao = db.settingsDao()
@Provides @Provides
fun provideMessageDao(db: KrisenvorratDatabase): MessageDao = db.messageDao() fun provideMessageDao(db: BollwerkDatabase): MessageDao = db.messageDao()
@Provides @Provides
@Singleton @Singleton
fun provideDatabaseTransaction(db: KrisenvorratDatabase): DatabaseTransaction = fun provideDatabaseTransaction(db: BollwerkDatabase): DatabaseTransaction =
DatabaseTransaction { block -> db.withTransaction(block) } 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 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.Binds
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import de.krisenvorrat.app.data.remote.OpenAiVisionService import de.bollwerk.app.data.remote.OpenAiVisionService
import de.krisenvorrat.app.data.remote.OpenAiVisionServiceImpl import de.bollwerk.app.data.remote.OpenAiVisionServiceImpl
import de.krisenvorrat.app.data.sync.SyncServiceImpl import de.bollwerk.app.data.sync.SyncServiceImpl
import de.krisenvorrat.app.data.sync.WebSocketClient import de.bollwerk.app.data.sync.WebSocketClient
import de.krisenvorrat.app.data.sync.WebSocketClientImpl import de.bollwerk.app.data.sync.WebSocketClientImpl
import de.krisenvorrat.app.domain.repository.SyncService import de.bollwerk.app.domain.repository.SyncService
import io.ktor.client.HttpClient import io.ktor.client.HttpClient
import io.ktor.client.engine.okhttp.OkHttp import io.ktor.client.engine.okhttp.OkHttp
import io.ktor.client.plugins.contentnegotiation.ContentNegotiation 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.Binds
import dagger.Module import dagger.Module
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import de.krisenvorrat.app.data.export.ImportExportRepositoryImpl import de.bollwerk.app.data.export.ImportExportRepositoryImpl
import de.krisenvorrat.app.data.repository.ApkInstallerImpl import de.bollwerk.app.data.repository.ApkInstallerImpl
import de.krisenvorrat.app.data.repository.CategoryRepositoryImpl import de.bollwerk.app.data.repository.CategoryRepositoryImpl
import de.krisenvorrat.app.data.repository.ItemRepositoryImpl import de.bollwerk.app.data.repository.ItemRepositoryImpl
import de.krisenvorrat.app.data.repository.LocationRepositoryImpl import de.bollwerk.app.data.repository.LocationRepositoryImpl
import de.krisenvorrat.app.data.repository.MessageRepositoryImpl import de.bollwerk.app.data.repository.MessageRepositoryImpl
import de.krisenvorrat.app.data.repository.SettingsRepositoryImpl import de.bollwerk.app.data.repository.SettingsRepositoryImpl
import de.krisenvorrat.app.data.repository.UpdateRepositoryImpl import de.bollwerk.app.data.repository.UpdateRepositoryImpl
import de.krisenvorrat.app.domain.repository.CategoryRepository import de.bollwerk.app.domain.repository.CategoryRepository
import de.krisenvorrat.app.domain.repository.ImportExportRepository import de.bollwerk.app.domain.repository.ImportExportRepository
import de.krisenvorrat.app.domain.repository.ItemRepository import de.bollwerk.app.domain.repository.ItemRepository
import de.krisenvorrat.app.domain.repository.LocationRepository import de.bollwerk.app.domain.repository.LocationRepository
import de.krisenvorrat.app.domain.repository.MessageRepository import de.bollwerk.app.domain.repository.MessageRepository
import de.krisenvorrat.app.domain.repository.SettingsRepository import de.bollwerk.app.domain.repository.SettingsRepository
import de.krisenvorrat.app.domain.repository.UpdateRepository import de.bollwerk.app.domain.repository.UpdateRepository
import de.krisenvorrat.app.domain.usecase.ApkInstaller import de.bollwerk.app.domain.usecase.ApkInstaller
import javax.inject.Singleton import javax.inject.Singleton
@Module @Module

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.di package de.bollwerk.app.di
import android.content.Context import android.content.Context
import dagger.Module import dagger.Module
@ -6,8 +6,8 @@ import dagger.Provides
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import de.krisenvorrat.app.data.security.EncryptedPrefsTokenStorage import de.bollwerk.app.data.security.EncryptedPrefsTokenStorage
import de.krisenvorrat.app.data.security.SecureTokenStorage import de.bollwerk.app.data.security.SecureTokenStorage
import javax.inject.Singleton import javax.inject.Singleton
@Module @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.Serializable
import kotlinx.serialization.json.Json 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( internal data class CategorySummary(
val categoryId: Int, 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 { internal enum class ExpiryUrgency {
URGENT, URGENT,

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.Serializable

View file

@ -1,4 +1,4 @@
package de.krisenvorrat.app.domain.model package de.bollwerk.app.domain.model
/** /**
* Type-safe Settings-Key-Definition. * 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. * 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) { internal sealed class SyncError(message: String, cause: Throwable? = null) : Exception(message, cause) {
class ConnectionError(cause: Throwable? = null) : 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 { internal sealed interface UpdateCheckResult {
data class UpdateAvailable(val versionInfo: VersionInfo) : 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 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 import kotlinx.coroutines.flow.Flow
internal interface CategoryRepository { 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 import java.io.File
internal interface ImportExportRepository { 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 import kotlinx.coroutines.flow.Flow
internal interface ItemRepository { 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 import kotlinx.coroutines.flow.Flow
internal interface LocationRepository { 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.bollwerk.app.data.db.entity.MessageEntity
import de.krisenvorrat.shared.model.UserListItemDto import de.bollwerk.shared.model.UserListItemDto
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
internal interface MessageRepository { 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.bollwerk.app.data.db.entity.SettingsEntity
import de.krisenvorrat.app.domain.model.SettingsKey import de.bollwerk.app.domain.model.SettingsKey
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
internal interface SettingsRepository { 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.bollwerk.shared.model.InventoryDto
import de.krisenvorrat.shared.model.InventoryInfoDto import de.bollwerk.shared.model.InventoryInfoDto
import de.krisenvorrat.shared.model.ItemDto import de.bollwerk.shared.model.ItemDto
internal interface SyncService { internal interface SyncService {
suspend fun downloadInventory(since: Long? = null): Result<InventoryDto> 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 import java.io.File
internal interface UpdateRepository { 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 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.bollwerk.app.data.db.entity.CategoryEntity
import de.krisenvorrat.app.data.db.entity.ItemEntity import de.bollwerk.app.data.db.entity.ItemEntity
import de.krisenvorrat.app.domain.model.CategorySummary import de.bollwerk.app.domain.model.CategorySummary
import javax.inject.Inject import javax.inject.Inject
internal class CalculateCategorySummaryUseCase @Inject constructor() { 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 import javax.inject.Inject
internal class CalculateSupplyRangeUseCase @Inject constructor() { 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 import javax.inject.Inject
internal class CalculateTotalValueUseCase @Inject constructor() { internal class CalculateTotalValueUseCase @Inject constructor() {

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