Krisenvorrat Inventar-App – Android-App (Kotlin) zur Verwaltung eines Krisenvorrats-Inventars
- Routing.kt: Content-Length-Intercept (max 1 MB, HTTP 413) - InventoryRoutes.kt: String-Längen (name ≤255, unit ≤50, id ≤36, category/location ≤255, setting key ≤255), expiryDate-Regex YYYY-MM-DD, Array-Limits (items ≤10000, categories/locations ≤500) - AdminRoutes.kt: username-Länge ≤255 - InputValidationTest.kt: 16 neue negative Tests, alle 532 Tests grün |
||
|---|---|---|
| .github | ||
| .vscode | ||
| Anforderungen | ||
| app | ||
| gradle | ||
| memories/repo | ||
| server | ||
| shared | ||
| .dockerignore | ||
| .gitignore | ||
| build.gradle.kts | ||
| Dockerfile | ||
| gradle.properties | ||
| gradlew | ||
| gradlew.bat | ||
| README.md | ||
| run-integration-tests.ps1 | ||
| settings.gradle.kts | ||
| start-server.ps1 | ||
| start-server.sh | ||
Krisenvorrat
Android-App zur Verwaltung eines Krisenvorrats-Inventars mit lokaler Datenhaltung und Sync-Möglichkeit über einen LAN-Server.
Projektstruktur
| Modul | Beschreibung |
|---|---|
app |
Android-App (Kotlin, Jetpack Compose, Room) |
server |
Ktor REST-Server (H2-Datenbank, Fat-JAR) |
shared |
Gemeinsame DTOs (kotlinx.serialization) |
Voraussetzungen
- Android Studio oder IntelliJ IDEA
- JDK 21 (für Server) / JDK 11+ (für App)
- Android SDK (API Level 35)
App bauen
# Windows
.\gradlew assembleDebug
# Linux/Mac
./gradlew assembleDebug
Tests ausführen
# Alle Tests (App + Server)
./gradlew test
# Nur Server-Tests
./gradlew :server:test
# Nur App-Tests
./gradlew :app:test
Phase 2: Server-Setup (LAN-Sync)
Übersicht
Der Sync-Server empfängt das Inventar der App als JSON und gibt es an andere App-Instanzen im selben LAN weiter. Die Kommunikation läuft über einfaches HTTP mit API-Key-Authentifizierung.
┌──────────┐ PUT /api/inventory ┌──────────┐
│ App A │ ───────────────────────► │ Server │
│ (Upload) │ │ :8080 │
└──────────┘ └────┬─────┘
│
┌──────────┐ GET /api/inventory ┌────┴─────┐
│ App B │ ◄─────────────────────── │ Server │
│(Download)│ │ :8080 │
└──────────┘ └──────────┘
Schnellstart
Option A: Direkt starten (empfohlen für Entwicklung)
# Windows
.\start-server.ps1
# Linux/Mac
chmod +x start-server.sh
./start-server.sh
Das Skript baut automatisch das Fat-JAR und zeigt die LAN-IP an.
Option B: Manuell mit Gradle
./gradlew :server:run
Option C: Fat-JAR
# JAR bauen
./gradlew :server:buildFatJar
# Starten
java -jar server/build/libs/server.jar
Option D: Docker
# Image bauen
docker build -t krisenvorrat-server .
# Container starten
docker run -d \
--name krisenvorrat \
-p 8080:8080 \
-e KRISENVORRAT_API_KEY="mein-sicherer-api-key" \
-v krisenvorrat-data:/app/data \
krisenvorrat-server
LAN-Setup
-
Server-IP ermitteln:
- Windows:
ipconfig→ IPv4-Adresse des WLAN/LAN-Adapters - Linux/Mac:
ip addroderifconfig - Die Start-Skripte zeigen die IP automatisch an
- Windows:
-
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 - Linux:
sudo ufw allow 8080/tcp
- Windows:
-
App konfigurieren:
- Einstellungen → Server-URL:
http://<SERVER-IP>:8080 - Einstellungen → API-Key: den gleichen Key wie beim Server-Start
- Einstellungen → Server-URL:
API-Endpunkte
| Methode | Pfad | Auth | Beschreibung |
|---|---|---|---|
| GET | /api/health |
– | Health-Check, gibt "OK" zurück |
| GET | /api/inventory |
API-Key | Inventar vom Server laden (Pull) |
| PUT | /api/inventory |
API-Key | Inventar auf Server speichern (Push) |
Authentifizierung: API-Key als X-API-Key-Header oder Bearer-Token.
Umgebungsvariablen
| Variable | Standard | Beschreibung |
|---|---|---|
KRISENVORRAT_API_KEY |
change-me-to-a-secure-key-at-least-32-chars |
API-Key für Auth |
Sicherheitshinweise
- Der Dev-Server nutzt HTTP (kein HTTPS) – nur im vertrauenswürdigen LAN verwenden.
- Für Produktionseinsatz: HTTPS mit Reverse-Proxy (z.B. nginx/Caddy) konfigurieren.
- API-Key sollte mindestens 32 Zeichen lang sein.