Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
c261a76
feat(store): migrate app stores from hive to sqlite
lollipopkit Feb 28, 2026
82684cf
fix(migration): harden hive to sqlite migration
lollipopkit Feb 28, 2026
f36874b
fix(review): address migration and store follow-up findings
lollipopkit Feb 28, 2026
10590d8
fix(migration): skip already migrated boxes on retry
lollipopkit Feb 28, 2026
b469c6d
fix(ui): resolve compact dialog sqlite db path
lollipopkit Feb 28, 2026
10d237d
fix(store): avoid duplicate entries during fetch re-persist
lollipopkit Feb 28, 2026
0129fec
ref(store): simplify private key fetch parsing and writes
lollipopkit Feb 28, 2026
813e487
fix(store): avoid snippet rewrites in fetch
lollipopkit Feb 28, 2026
67818d3
merge: origin/main into fix/sqlite-migration-safety
lollipopkit Feb 28, 2026
3d7e16b
fix(migration): skip null normalized values
lollipopkit Feb 28, 2026
5bc6976
ref(store): migrate core stores to async drift and pref
lollipopkit Feb 28, 2026
00b98e1
fix(import): await server batch writes
lollipopkit Mar 1, 2026
708e492
fix: address migration and async safety findings
lollipopkit Mar 1, 2026
a186fea
fix: harden async flows and stats persistence
lollipopkit Mar 1, 2026
ba89423
fix: stabilize snippet async flow and restore container type
lollipopkit Mar 1, 2026
1311da5
fix(store): handle nullable MAX(updated_at) safely
lollipopkit Mar 1, 2026
9060a26
fix(backup): restore servers before snippets in v1 merge
lollipopkit Mar 1, 2026
4896bef
fix: harden backup restore and async store flows
lollipopkit Mar 1, 2026
7088a95
fix: harden backup2 restore and stats query paths
lollipopkit Mar 1, 2026
ca745c2
fix(restore): harden backup parsing and stats store safety
lollipopkit Mar 1, 2026
0e3e0be
fix(server): preserve cascade data in migrateIds
lollipopkit Mar 1, 2026
168917c
fix(server): harden id migration and host-key flow
lollipopkit Mar 1, 2026
93c67ae
fix(server): fail fast on missing jump host and safe migrate order
lollipopkit Mar 1, 2026
2dfa714
rm: CLAUDE.md
lollipopkit Mar 1, 2026
1a07950
fix: Hive in docs
lollipopkit Mar 6, 2026
fdcdce3
chore: docs
lollipopkit Mar 6, 2026
c583c68
merge(main): keep drift connection stats
lollipopkit Mar 6, 2026
00c697d
chore
lollipopkit Mar 6, 2026
3a77f48
Merge branch 'main' of github.com:lollipopkit/flutter_server_box into…
lollipopkit Mar 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 0 additions & 95 deletions CLAUDE.md

This file was deleted.

10 changes: 5 additions & 5 deletions docs/src/content/docs/de/development/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,12 @@ Server Box folgt den Prinzipien der Clean Architecture mit einer klaren Trennung
- Integrierte JSON-Serialisierung
- CopyWith-Erweiterungen für Aktualisierungen

### Lokale Speicherung: Hive
### Lokale Speicherung: AppDb/SQLCipher + PrefStore

- **hive_ce**: Community-Edition von Hive
- Keine manuellen `@HiveField` oder `@HiveType` erforderlich
- Typ-Adapter werden automatisch generiert
- Persistenter Key-Value-Speicher
- **AppDb + Drift**: Relationale lokale Persistenz für strukturierte Daten
- **SQLCipher**: Verschlüsselt sensible Datenbanktabellen im Ruhezustand
- **PrefStore**: Verwaltet leichte Key-Value-Einstellungen und Historien
- **Store-APIs**: Verbergen Backend-Details hinter einer einheitlichen Schnittstelle

## Dependency Injection

Expand Down
4 changes: 2 additions & 2 deletions docs/src/content/docs/de/development/structure.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ lib/
├── data/ # Datenschicht
│ ├── model/ # Datenmodelle nach Funktionen
│ ├── provider/ # Riverpod Provider
│ └── store/ # Lokale Speicherung (Hive)
│ └── store/ # Abstraktionen für lokale Speicherung (AppDb/SQLCipher + PrefStore)
├── view/ # UI-Schicht
│ ├── page/ # Hauptseiten
│ └── widget/ # Wiederverwendbare Widgets
Expand Down Expand Up @@ -52,7 +52,7 @@ Riverpod Provider für Dependency Injection und Zustandsverwaltung:

### Stores (`lib/data/store/`)

Hive-basierte lokale Speicherung:
Lokale Speicherung auf Basis von AppDb/SQLCipher und PrefStore:

- Server-Speicher
- Einstellungs-Speicher
Expand Down
19 changes: 11 additions & 8 deletions docs/src/content/docs/de/principles/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Server Box folgt einer Schichtarchitektur mit klarer Trennung der Belange (Separ
┌─────────────────────────────────────────────────┐
│ Datenzugriffsschicht │
│ lib/data/store/, lib/data/model/ │
│ - Hive Stores, Datenmodelle
│ - Store-Abstraktionen, Datenmodelle │
└─────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────┐
Expand Down Expand Up @@ -79,19 +79,22 @@ void main() {
- `StreamProvider`: Echtzeit-Datenströme
- Future Provider: Einmalige asynchrone Operationen

### Datenpersistenz: Hive CE
### Datenpersistenz: Store-Schicht

**Warum Hive CE?**
- Keine Abhängigkeiten von nativem Code
- Schneller Key-Value-Speicher
- Typsicher durch Codegenerierung
- Keine manuellen Feld-Annotationen erforderlich
**Warum diese Store-Schicht?**
- `AppDb` + Drift verarbeiten relationale und abfrageintensive Daten
- `PrefStore` deckt leichte Key-Value-Persistenz ab
- `SQLCipher` schützt sensible Einträge in der lokalen Datenbank
- Store-APIs halten Persistenzdetails aus UI und Geschäftslogik heraus

**Stores:**
- `SettingStore`: App-Einstellungen
- `HistoryStore`: Befehls- und Navigationsverlauf
- `ServerStore`: Server-Konfigurationen
- `ContainerStore`: Container-Host-Zuordnungen und Präferenzen
- `SnippetStore`: Befehls-Snippets
- `KeyStore`: SSH-Schlüssel
- `PrivateKeyStore`: SSH-Schlüssel
- `ConnectionStatsStore`: Verbindungs-Telemetrie und Aggregate

### Immutable Modelle: Freezed

Expand Down
2 changes: 1 addition & 1 deletion docs/src/content/docs/de/principles/ssh.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ if (spi.jumpId != null) {
onPasswordRequest: () => spi.pwd
```

- Passwort verschlüsselt in Hive gespeichert
- Passwort verschlüsselt im lokalen Speicher abgelegt
- Bei Verbindung entschlüsselt
- Zur Verifizierung an den Server gesendet

Expand Down
10 changes: 5 additions & 5 deletions docs/src/content/docs/development/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,12 @@ Server Box follows clean architecture principles with clear separation between d
- Built-in JSON serialization
- CopyWith extensions for updates

### Local Storage: Hive
### Local Storage: AppDb/SQLCipher + PrefStore

- **hive_ce**: Community edition of Hive
- No manual `@HiveField` or `@HiveType` needed
- Type adapters auto-generated
- Persistent key-value storage
- **AppDb + Drift**: Relational local persistence for structured data
- **SQLCipher**: Encrypts sensitive database tables at rest
- **PrefStore**: Handles lightweight key-value settings and history
- **Store APIs**: Hide backend details behind a consistent interface

## Dependency Injection

Expand Down
4 changes: 2 additions & 2 deletions docs/src/content/docs/development/structure.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ lib/
├── data/ # Data layer
│ ├── model/ # Data models by feature
│ ├── provider/ # Riverpod providers
│ └── store/ # Local storage (Hive)
│ └── store/ # Local storage abstractions (AppDb/SQLCipher + PrefStore)
├── view/ # UI layer
│ ├── page/ # Main pages
│ └── widget/ # Reusable widgets
Expand Down Expand Up @@ -52,7 +52,7 @@ Riverpod providers for dependency injection and state management:

### Stores (`lib/data/store/`)

Hive-based local storage:
Store-based local storage backed by AppDb/SQLCipher and PrefStore:

- Server storage
- Settings storage
Expand Down
10 changes: 5 additions & 5 deletions docs/src/content/docs/es/development/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,12 @@ Server Box sigue los principios de Clean Architecture con una clara separación
- Serialización JSON integrada
- Extensiones CopyWith para actualizaciones

### Almacenamiento Local: Hive
### Almacenamiento Local: AppDb/SQLCipher + PrefStore

- **hive_ce**: Edición comunitaria de Hive
- No se requiere `@HiveField` o `@HiveType` manual
- Adaptadores de tipo generados automáticamente
- Almacenamiento persistente clave-valor
- **AppDb + Drift**: Persistencia local relacional para datos estructurados
- **SQLCipher**: Cifra las tablas sensibles de la base de datos en reposo
- **PrefStore**: Gestiona ajustes e historial ligeros en clave-valor
- **Store APIs**: Ocultan los detalles del backend tras una interfaz consistente

## Inyección de Dependencias

Expand Down
4 changes: 2 additions & 2 deletions docs/src/content/docs/es/development/structure.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ lib/
├── data/ # Capa de datos
│ ├── model/ # Modelos de datos por función
│ ├── provider/ # Riverpod providers
│ └── store/ # Almacenamiento local (Hive)
│ └── store/ # Abstracciones de almacenamiento local (AppDb/SQLCipher + PrefStore)
├── view/ # Capa de UI
│ ├── page/ # Páginas principales
│ └── widget/ # Widgets reutilizables
Expand Down Expand Up @@ -52,7 +52,7 @@ Providers de Riverpod para inyección de dependencias y gestión de estado:

### Almacenes (`lib/data/store/`)

Almacenamiento local basado en Hive:
Almacenamiento local basado en AppDb/SQLCipher y PrefStore:

- Almacén de servidores
- Almacén de ajustes
Expand Down
21 changes: 12 additions & 9 deletions docs/src/content/docs/es/principles/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Server Box sigue una arquitectura por capas con una clara separación de respons
┌─────────────────────────────────────────────────┐
│ Capa de Acceso a Datos │
│ lib/data/store/, lib/data/model/ │
│ - Hive Stores, Modelos de Datos
│ - Abstracciones de Store, Modelos de Datos │
└─────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────┐
Expand Down Expand Up @@ -79,19 +79,22 @@ void main() {
- `StreamProvider`: Flujos de datos en tiempo real
- Future providers: Operaciones asíncronas únicas

### Persistencia de Datos: Hive CE
### Persistencia de Datos: Capa de stores

**¿Por qué Hive CE?**
- Sin dependencias de código nativo
- Almacenamiento clave-valor rápido
- Tipado seguro con generación de código
- Sin necesidad de anotaciones manuales de campos
**¿Por qué esta capa de stores?**
- `AppDb` + Drift gestionan datos relacionales y consultas pesadas
- `PrefStore` cubre la persistencia ligera de clave-valor
- `SQLCipher` protege los registros sensibles de la base local
- Las Store APIs mantienen los detalles de persistencia fuera de la UI y la lógica de negocio

**Almacenes (Stores):**
**Almacenes (stores):**
- `SettingStore`: Preferencias de la app
- `HistoryStore`: Historial de comandos y navegación reciente
- `ServerStore`: Configuraciones de servidores
- `ContainerStore`: Mapeos y preferencias de hosts de contenedores
- `SnippetStore`: Fragmentos de comandos
- `KeyStore`: Claves SSH
- `PrivateKeyStore`: Claves SSH
- `ConnectionStatsStore`: Telemetría y agregados de conexión

### Modelos Inmutables: Freezed

Expand Down
2 changes: 1 addition & 1 deletion docs/src/content/docs/es/principles/ssh.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ if (spi.jumpId != null) {
onPasswordRequest: () => spi.pwd
```

- Contraseña almacenada cifrada en Hive
- Contraseña almacenada de forma cifrada en el almacenamiento local
- Descifrada al conectar
- Enviada al servidor para verificación

Expand Down
10 changes: 5 additions & 5 deletions docs/src/content/docs/fr/development/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,12 +44,12 @@ Server Box suit les principes de la Clean Architecture avec une séparation clai
- Sérialisation JSON intégrée
- Extensions CopyWith pour les mises à jour

### Stockage local : Hive
### Stockage local : AppDb/SQLCipher + PrefStore

- **hive_ce** : Édition communautaire de Hive
- Pas de `@HiveField` ou `@HiveType` manuel requis
- Adaptateurs de type auto-générés
- Stockage clé-valeur persistant
- **AppDb + Drift** : Persistance locale relationnelle pour les données structurées
- **SQLCipher** : Chiffre au repos les tables sensibles de la base locale
- **PrefStore** : Gère les réglages et l'historique légers en clé-valeur
- **Store APIs** : Masquent les détails du backend derrière une interface cohérente

## Injection de dépendances

Expand Down
4 changes: 2 additions & 2 deletions docs/src/content/docs/fr/development/structure.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ lib/
├── data/ # Couche de données
│ ├── model/ # Modèles de données par fonctionnalité
│ ├── provider/ # Providers Riverpod
│ └── store/ # Stockage local (Hive)
│ └── store/ # Abstractions de stockage local (AppDb/SQLCipher + PrefStore)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Resolve policy/docs mismatch for storage architecture before merging.

These lines document AppDb/SQLCipher + PrefStore as the store standard, but the current repository policy still requires Hive-backed stores under lib/data/store/. Please either update the canonical policy source in this PR or adjust this doc to clearly mark it as a pending/transition state.

Based on learnings: "Applies to lib/data/store/**/*.dart : Persist state using Hive stores placed under lib/data/store/".

Also applies to: 55-55

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/src/content/docs/fr/development/structure.md` at line 16, The docs line
under the store section references "AppDb/SQLCipher + PrefStore" which conflicts
with the repo policy requiring Hive-backed stores under
lib/data/store/**/*.dart; update the documentation to reflect the repository
canonical policy or mark this doc as transitional/pending: either replace
"AppDb/SQLCipher + PrefStore" with the current canonical "Hive-backed stores
(lib/data/store/)" text or add a clear note next to the store/ entry that the
repository currently enforces Hive persists for lib/data/store/**/*.dart and
that AppDb/SQLCipher + PrefStore is a proposed/transition option until the
policy is changed.

├── view/ # Couche UI
│ ├── page/ # Pages principales
│ └── widget/ # Widgets réutilisables
Expand Down Expand Up @@ -52,7 +52,7 @@ Providers Riverpod pour l'injection de dépendances et la gestion de l'état :

### Stores (`lib/data/store/`)

Stockage local basé sur Hive :
Stockage local avec AppDb/SQLCipher et PrefStore :

- Stockage des serveurs
- Stockage des paramètres
Expand Down
19 changes: 11 additions & 8 deletions docs/src/content/docs/fr/principles/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Server Box suit une architecture en couches avec une séparation claire des pré
┌─────────────────────────────────────────────────┐
│ Couche d'accès aux données │
│ lib/data/store/, lib/data/model/ │
│ - Hive Stores, Modèles de données
│ - Abstractions de Store, Modèles de données │
└─────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────┐
Expand Down Expand Up @@ -79,19 +79,22 @@ void main() {
- `StreamProvider` : Flux de données en temps réel
- Future providers : Opérations asynchrones uniques

### Persistance des données : Hive CE
### Persistance des données : Couche Store

**Pourquoi Hive CE ?**
- Pas de dépendances de code natif
- Stockage clé-valeur rapide
- Type-safe avec génération de code
- Pas d'annotations de champs manuelles requises
**Pourquoi cette couche Store ?**
- `AppDb` + Drift gèrent les données relationnelles et les requêtes lourdes
- `PrefStore` couvre la persistance clé-valeur légère
- `SQLCipher` protège les enregistrements sensibles de la base locale
- Les API de Store gardent les détails de persistance hors de l'UI et de la logique métier

**Stores :**
- `SettingStore` : Préférences de l'application
- `HistoryStore` : Historique des commandes et de navigation
- `ServerStore` : Configurations de serveur
- `ContainerStore` : Mappages d'hôtes de conteneurs et préférences
- `SnippetStore` : Extraits de commande
- `KeyStore` : Clés SSH
- `PrivateKeyStore` : Clés SSH
- `ConnectionStatsStore` : Télémétrie et agrégats de connexion

### Modèles immuables : Freezed

Expand Down
2 changes: 1 addition & 1 deletion docs/src/content/docs/fr/principles/ssh.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ if (spi.jumpId != null) {
onPasswordRequest: () => spi.pwd
```

- Mot de passe stocké chiffré dans Hive
- Mot de passe stocké chiffré dans AppDb (SQLite + SQLCipher)
- Déchiffré lors de la connexion
- Envoyé au serveur pour vérification

Expand Down
Loading