302 lines
8.0 KiB
Markdown
302 lines
8.0 KiB
Markdown
# VaultDrop — Application de Gestion de Fichiers V1
|
|
|
|
## Vision
|
|
|
|
Application mobile tout-en-un permettant de centraliser, organiser et retrouver ses documents. Upload depuis l'appareil, scan caméra avec OCR, tagging et recherche rapide. Le back-end Go assure le traitement asynchrone (OCR, indexing) et la persistence. Le front React Native reste léger : il affiche, interagit et met en cache.
|
|
|
|
## Scope V1
|
|
|
|
On livre un produit fonctionnel utilisable au quotidien, pas un framework. V1 = gestion de fichiers avec scan OCR intégré. Pas de mode collaboratif, pas de plugins, pas de partage avancé.
|
|
|
|
## Non-Goals (V1)
|
|
|
|
- Mode collaboratif / multi-utilisateur
|
|
- Système de plugins
|
|
- Synchronisation offline complexe
|
|
- Plateforme de partage publique
|
|
|
|
---
|
|
|
|
## Vue d'Ensemble Architecture
|
|
|
|
```
|
|
┌─────────────────────┐ ┌─────────────────────┐
|
|
│ React Native App │ ────> │ API Go Backend │
|
|
│ (Expo managed) │ HTTPS │ (REST) │
|
|
│ - Upload │ │ - Upload fichiers │
|
|
│ - Caméra / Scan │ │ - OCR async │
|
|
│ - Tags / Recherche│ │ - Index/search │
|
|
│ - Affichage │ │ - Persistance │
|
|
└─────────────────────┘ └─────────────────────┘
|
|
```
|
|
|
|
Le mobile ne contient pas de logique métier. Tout traitement lourd (OCR, extraction de texte, indexation) est géré côté back-end.
|
|
|
|
---
|
|
|
|
## Fonctionnalités Attendues
|
|
|
|
### Upload de fichiers
|
|
- Sélection depuis la galerie appareil
|
|
- Upload par drag-and-drop interne
|
|
- Support des formats : PDF, images (JPG, PNG)
|
|
- Feedback visuel pendant l'envoi (progress)
|
|
- Retry automatique en cas d'échec réseau
|
|
|
|
### Scan Documents (Caméra)
|
|
- Prise de photo depuis l'app
|
|
- Recadrage et orientation automatique
|
|
- Envoi direct vers le back-end pour OCR
|
|
- Retour du texte extrait affiché à l'utilisateur
|
|
|
|
### Tagging
|
|
- Ajout de tags manuels sur chaque fichier
|
|
- Suggestion de tags basée sur le contenu OCR
|
|
- Filtrage par tag dans la liste
|
|
|
|
### Recherche
|
|
- Recherche full-text sur le contenu OCR
|
|
- Recherche par nom de fichier
|
|
- Filtres combinés (tag + texte)
|
|
|
|
### Listing
|
|
- Liste des fichiers uploadés avec aperçu
|
|
- Tri par date, nom, tag
|
|
- Pagination côté serveur
|
|
|
|
### Partage (Optionnel, Phase Later)
|
|
- Génération de lien temporaire
|
|
- Pas prioritaire en V1
|
|
|
|
---
|
|
|
|
## Exigences UX
|
|
|
|
- UI claire et épurée, minimaliste
|
|
- Temps de réponse < 2s pour les actions principales
|
|
- Feedback immédiat sur toutes les interactions
|
|
- Pas d'écran de chargement > 3s sans spinner
|
|
- Mode offline minimal : liste des fichiers déjà chargée visible même sans réseau
|
|
|
|
---
|
|
|
|
## Attentes API REST (Back-end Go)
|
|
|
|
### Endpoints
|
|
|
|
| Méthode | Path | Description |
|
|
|---|---|---|
|
|
| GET | /api/v1/files | Liste des fichiers (pagination) |
|
|
| POST | /api/v1/files/upload | Upload d'un fichier |
|
|
| GET | /api/v1/files/:id | Détail d'un fichier |
|
|
| DELETE | /api/v1/files/:id | Suppression d'un fichier |
|
|
| GET | /api/v1/files/search?q= | Recherche full-text |
|
|
| POST | /api/v1/files/:id/tags | Ajout de tags |
|
|
| GET | /api/v1/files/:id/tags | Tags d'un fichier |
|
|
| POST | /api/v1/ocr/jobs | Soumettre un job OCR |
|
|
| GET | /api/v1/ocr/jobs/:id | Statut d'un job OCR |
|
|
| GET | /api/v1/health | Health check |
|
|
|
|
### Format de réponse standard
|
|
|
|
```json
|
|
{
|
|
"data": { ... },
|
|
"meta": {
|
|
"page": 1,
|
|
"total": 42
|
|
}
|
|
}
|
|
```
|
|
|
|
### Erreurs
|
|
|
|
```json
|
|
{
|
|
"error": {
|
|
"code": "FILE_TOO_LARGE",
|
|
"message": "Fichier dépasse la limite de 50 Mo"
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Flux de Données
|
|
|
|
```
|
|
[Capture photo] ──> [Upload API] ──> [Back-end stocke]
|
|
│
|
|
v
|
|
[Job OCR créé]
|
|
│
|
|
v (async)
|
|
[Traitement OCR]
|
|
[Extraction texte]
|
|
[Indexation search]
|
|
│
|
|
v
|
|
[App affiche fichier] <──── [Polling statut] <── [Résultat prêt]
|
|
```
|
|
|
|
1. L'utilisateur prend une photo ou sélectionne un fichier
|
|
2. Le fichier est uploadé vers POST /api/v1/files/upload
|
|
3. Le back-end crée un job OCR et retourne immédiatement un ID
|
|
4. L'app poll GET /api/v1/ocr/jobs/:id ou utilise un webhook
|
|
5. Une fois l'OCR terminé, le texte est indexé et le fichier apparaît avec son contenu searchable
|
|
|
|
---
|
|
|
|
## Choix Techniques
|
|
|
|
### Front-end (React Native)
|
|
- Expo managed workflow (développement rapide, build plus simple)
|
|
- TanStack Query (gestion serveur state, cache, refetch)
|
|
- React Navigation (navigation entre écrans)
|
|
- react-native-image-picker (sélection + caméra)
|
|
- MMKV (stockage clé-valeur pour cache local)
|
|
|
|
### Back-end (Go)
|
|
- Framework HTTP : Gin ou Fiber (au choix implémenteur)
|
|
- Persistance : SQLite pour V1 (volumétrie faible attendue)
|
|
- OCR : Tesseract en ligne de commande (appel système)
|
|
- Search : SQLite FTS5 pour la recherche full-text
|
|
- Stockage fichiers : disque local avec chemin référencé en base
|
|
|
|
---
|
|
|
|
## Structure de Dossiers Suggérée
|
|
|
|
### Front-end (React Native / Expo)
|
|
|
|
```
|
|
mobile/
|
|
├── app/ # Expo Router ou navigation
|
|
│ ├── index.tsx # Ecran principal (liste)
|
|
│ ├── upload.tsx # Ecran upload
|
|
│ ├── scan.tsx # Ecran scan caméra
|
|
│ └── search.tsx # Ecran recherche
|
|
├── components/
|
|
│ ├── FileCard.tsx
|
|
│ ├── TagChip.tsx
|
|
│ └── UploadProgress.tsx
|
|
├── hooks/
|
|
│ ├── useFiles.ts # TanStack Query hooks
|
|
│ ├── useSearch.ts
|
|
│ └── useUpload.ts
|
|
├── api/
|
|
│ └── client.ts # Client API (axios ou fetch)
|
|
├── types/
|
|
│ └── index.ts # Types TypeScript
|
|
├── constants/
|
|
│ └── api.ts # URLs, clés API
|
|
└── package.json
|
|
```
|
|
|
|
### Back-end (Go)
|
|
|
|
```
|
|
backend/
|
|
├── cmd/
|
|
│ └── server/
|
|
│ └── main.go # Point d'entrée
|
|
├── internal/
|
|
│ ├── handlers/ # Handlers HTTP
|
|
│ ├── models/ # Modèles de données
|
|
│ ├── repository/ # Accès données
|
|
│ ├── service/ # Logique métier
|
|
│ └── ocr/ # Module OCR
|
|
├── pkg/
|
|
│ └── api/
|
|
│ └── response.go # Helpers réponse
|
|
├── uploads/ # Fichiers stockés
|
|
├── go.mod
|
|
└── go.sum
|
|
```
|
|
|
|
---
|
|
|
|
## Getting Started
|
|
|
|
### Prérequis
|
|
|
|
- Node.js latest lts
|
|
- npm ou yarn
|
|
- Expo CLI (`npm install -g expo-cli`)
|
|
- Go latest lts
|
|
- Tesseract OCR installé (`apt install tesseract-ocr` sur Debian/Ubuntu)
|
|
|
|
### Installation (Front-end)
|
|
|
|
```bash
|
|
cd mobile
|
|
npm install
|
|
npx expo start
|
|
```
|
|
|
|
### Installation (Back-end)
|
|
|
|
```bash
|
|
cd backend
|
|
go mod download
|
|
go run cmd/server/main.go
|
|
```
|
|
|
|
### Build APK Android (Expo)
|
|
|
|
```bash
|
|
npx expo run:android --variant release
|
|
```
|
|
|
|
---
|
|
|
|
## Variables d'Environnement
|
|
|
|
### Front-end (.env)
|
|
|
|
```
|
|
API_BASE_URL=http://localhost:8080/api/v1
|
|
TESSERACT_LANG=fr+eng
|
|
```
|
|
|
|
### Back-end (.env)
|
|
|
|
```
|
|
PORT=8080
|
|
UPLOAD_DIR=./uploads
|
|
MAX_FILE_SIZE_MB=50
|
|
OCR_LANG=fra+eng
|
|
```
|
|
|
|
---
|
|
|
|
## Itérations Futures
|
|
|
|
### V2 — Fiabilité et Performance
|
|
- Remplacement SQLite par PostgreSQL
|
|
- Upload chunked pour gros fichiers
|
|
- Compression d'images côté client
|
|
|
|
### V3 — Organisation Avancée
|
|
- Dossiers virtuels / hiérarchie
|
|
- Tags suggérés par IA
|
|
- OCR multilingue amélioré
|
|
|
|
### V4 — Collaboration
|
|
- Comptes utilisateurs
|
|
- Partage avec lien temporaire
|
|
- Rôle et permissions
|
|
|
|
### V5 — Plateforme
|
|
- Système de plugins (event bus)
|
|
- API publique
|
|
- Extensions tierces
|
|
|
|
---
|
|
|
|
## Statut du Projet
|
|
|
|
Phase : Conception et prototypage
|
|
Backend Go : En cours de structuration
|
|
Frontend React Native : À initier
|