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:
parent
f1abc2cd23
commit
a5f89e6a69
246 changed files with 1074 additions and 1074 deletions
2
.github/copilot-instructions.md
vendored
2
.github/copilot-instructions.md
vendored
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
2
.github/kotlin-conventions.instructions.md
vendored
2
.github/kotlin-conventions.instructions.md
vendored
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
2
.github/prompts/workflow-planning.prompt.md
vendored
2
.github/prompts/workflow-planning.prompt.md
vendored
|
|
@ -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
|
||||||
|
|
|
||||||
6
.github/skills/android-build/SKILL.md
vendored
6
.github/skills/android-build/SKILL.md
vendored
|
|
@ -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
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
4
.github/skills/android-build/android-dev.ps1
vendored
4
.github/skills/android-build/android-dev.ps1
vendored
|
|
@ -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
|
||||||
|
|
|
||||||
16
.github/skills/android-device/SKILL.md
vendored
16
.github/skills/android-device/SKILL.md
vendored
|
|
@ -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"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
8
.github/skills/android-emulator/SKILL.md
vendored
8
.github/skills/android-emulator/SKILL.md
vendored
|
|
@ -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
|
||||||
|
|
|
||||||
6
.github/skills/gh-tickets/SKILL.md
vendored
6
.github/skills/gh-tickets/SKILL.md
vendored
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
2
.github/skills/gh-tickets/next-ticket.ps1
vendored
2
.github/skills/gh-tickets/next-ticket.ps1
vendored
|
|
@ -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
|
||||||
|
|
|
||||||
16
.github/skills/publish/SKILL.md
vendored
16
.github/skills/publish/SKILL.md
vendored
|
|
@ -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
|
||||||
|
|
|
||||||
10
.github/skills/publish/publish-apk.ps1
vendored
10
.github/skills/publish/publish-apk.ps1
vendored
|
|
@ -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 }
|
||||||
|
|
|
||||||
2
.github/skills/ship/watch-pipeline.ps1
vendored
2
.github/skills/ship/watch-pipeline.ps1
vendored
|
|
@ -21,7 +21,7 @@ param(
|
||||||
[string]$ExpectedSha = ""
|
[string]$ExpectedSha = ""
|
||||||
)
|
)
|
||||||
|
|
||||||
$repo = "jreinemann-euris/krisenvorrat"
|
$repo = "jreinemann-euris/bollwerk"
|
||||||
$poll = 10
|
$poll = 10
|
||||||
|
|
||||||
# --- Warten ---
|
# --- Warten ---
|
||||||
|
|
|
||||||
44
.github/skills/vps-deploy/SKILL.md
vendored
44
.github/skills/vps-deploy/SKILL.md
vendored
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 8–11 aus (>30% Marktanteil)
|
- 🔴 Schließt Android 8–11 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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 (2–10 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 (2–10 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.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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:**
|
||||||
|
|
||||||
|
|
|
||||||
18
README.md
18
README.md
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
@ -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 {
|
||||||
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
@ -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)
|
||||||
|
|
@ -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" />
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
@ -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
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
@ -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)
|
||||||
|
|
@ -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) {
|
||||||
|
|
@ -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)}",
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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?
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package de.krisenvorrat.app.data.sync
|
package de.bollwerk.app.data.sync
|
||||||
|
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
@ -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,
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package de.krisenvorrat.app.di
|
package de.bollwerk.app.di
|
||||||
|
|
||||||
import javax.inject.Qualifier
|
import javax.inject.Qualifier
|
||||||
|
|
||||||
|
|
@ -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) }
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package de.krisenvorrat.app.di
|
package de.bollwerk.app.di
|
||||||
|
|
||||||
import javax.inject.Qualifier
|
import javax.inject.Qualifier
|
||||||
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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,
|
||||||
|
|
@ -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,
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package de.krisenvorrat.app.domain.model
|
package de.bollwerk.app.domain.model
|
||||||
|
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
|
|
@ -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.
|
||||||
|
|
@ -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.
|
||||||
|
|
@ -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) :
|
||||||
|
|
@ -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
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package de.krisenvorrat.server.model
|
package de.bollwerk.app.domain.model
|
||||||
|
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
@ -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 {
|
||||||
|
|
@ -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 {
|
||||||
|
|
@ -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 {
|
||||||
|
|
@ -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 {
|
||||||
|
|
@ -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 {
|
||||||
|
|
@ -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>
|
||||||
|
|
@ -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 {
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
package de.krisenvorrat.app.domain.usecase
|
package de.bollwerk.app.domain.usecase
|
||||||
|
|
||||||
import java.io.File
|
import java.io.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() {
|
||||||
|
|
@ -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() {
|
||||||
|
|
@ -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
Loading…
Reference in a new issue