Commit Graph
15 Commits
Author SHA1 Message Date
bruno 4917dad351 feat: route /api/ping + message d'erreur affiche l'URL cible
- Ajout route GET /api/ping pour diagnostic connectivité rapide
- Le message 'serveur injoignable' affiche maintenant l'URL exacte tentée
- Aide à identifier les problèmes de proxy/iframe (mauvaise origine)
2026-06-25 15:28:30 -04:00
bruno 0309359231 fix: déduplication SQLite AVANT upload — bloque tout doublon, même séquentiel
- Vérifie already_seen() dans la DB SQLite avant chaque upload vers Imago
- Si le hash existe déjà → retourne status=duplicate sans re-uploader
- Protège contre les doublons séquentiels (pas juste concurrents)
- Testé: 1er upload OK (ID 81), 2e upload même fichier → duplicate, 3e fichier différent → OK (ID 82)
2026-06-25 14:35:24 -04:00
bruno 5a2e12da01 fix: anti-doublon upload — lock mémoire in-flight + garde click/drag frontend
- Backend: Mutex<HashSet> pour bloquer les uploads concurrents du même hash (409 Conflict)
- Backend: logs tracing pour tracer chaque upload entrant
- Frontend: flag isDragging pour éviter le double déclenchement click+drag
- Dépendance: ajout hex = 0.4 pour log du hash

Corrige le bug où un seul fichier uploadé générait 4 copies sur Imago.
2026-06-25 14:23:55 -04:00
bruno 3254c33ae5 feat: versionnement automatique basé sur git (build number + hash)
- build.rs génère version dynamique : X.Y.Z+build.N-abc1234
- Version injectée dans l'API (IMAGOD_BUILD_VERSION) et pages HTML
- Suffixe -dirty si modifications non commitées
- replace_all_versions() consomme le suffixe build metadata
- Suppression auto-changelog — reste manuel pour contrôle qualité
2026-06-25 13:27:13 -04:00
bruno e867dadb1f fix: synchronisation dédoublonnage entre upload web et watcher
- Ajout de dedup_db_path dans AppState (partagé avec le watcher)
- upload_image() calcule le SHA-256 avant upload et marque le hash
  dans la DB de dédoublonnage après succès
- Le watcher voit maintenant les fichiers uploadés via le dashboard
  comme 'déjà vus' → plus de doublons watcher/drag-and-drop
- Correction compilation: indentation du match upload_image
2026-06-25 13:18:08 -04:00
bruno f51d70a646 feat: reset sélection batch au chargement + style toast warning
- initApp() appelle deselectAll() au démarrage (sécurité)
- Toast warning : fond jaune transparent + icône colorée
- Ajout classe toast-icon pour colorer l'icône selon le type
- Correction broadcast WebSocket batch delete (type mismatch)
- Correction compilation Linux : service install/uninstall gated
2026-06-25 12:25:50 -04:00
bruno 898117cad8 fix: thumbnails accessibles sans header X-API-Key (balises img)
Problème: les balises <img> du navigateur ne peuvent pas envoyer
X-API-Key, donc les thumbnails étaient 404 car la clé configurée
était expirée.

Solution:
- get_thumbnail() utilise TOUJOURS la clé serveur (state.api_key)
  au lieu de chercher le header utilisateur
- Mise à jour de la clé API dans imagod.toml avec la clé valide

Test: HTTP 200 sans header personnalisé ✓
2026-06-25 10:33:29 -04:00
bruno 3bab62733d feat: watcher (phase 3+6) + navigation dashboard (version, changelog, aide)
Phase 3 — Clipboard Watcher (Windows):
- clipboard.rs: détection d'images via arboard, conversion BGRA→PNG
- Gère les doublons consécutifs (même image dans le presse-papier)

Phase 6 — Watcher Loop:
- Windows: polling clipboard → hash → dédoublonnage → upload
- Linux/macOS: polling de dossier configurable (watch_dir)
- Ajout champ watch_dir dans WatcherConfig
- Client Imago cloné avant await (évite problème Send/Sync)

Dashboard:
- Badge version v0.1.0 dans le header
- Barre de navigation: Galerie / Changelog / Aide
- Pages changelog.html et help.html (chargement dynamique)
- Endpoint GET /api/version avec infos build
- Correction import delete inutilisé dans routes.rs
2026-06-25 09:41:51 -04:00
bruno 1ec0d4fbe8 feat: suppression images + gestion tags (ajout/suppression)
Backend:
- ImagoClient::delete_image() — DELETE /api/v1/images/{id}
- ImagoClient::update_tags() — PUT /api/v1/images/{id}/tags
- Route DELETE /api/images/{id}
- Route PUT /api/images/{id}/tags

Frontend:
- Bouton 🗑️ sur chaque carte (visible au hover)
- Boîte de confirmation avant suppression
- Tags cliquables avec × pour suppression
- Bouton + tag pour ajouter un tag (Enter pour valider)
- Bouton Supprimer + tags éditables dans la modale
- Suppression + modif tags aussi dans la modale

⚠️ Nécessite redéploiement Imago pour le endpoint PUT /tags
2026-06-23 15:20:26 -04:00
bruno 8256d4c362 fix: affichage des images via URLs signées Imago
- ImagoClient::get_thumbnail() utilise maintenant /thumbnail-url (URL signée)
- ImagoClient::get_file() utilise maintenant /download-url (URL signée)
- Fallback automatique thumbnail → fichier original si thumbnail indisponible
- Les images s'affichent dans la gallery même sans thumbnail généré
2026-06-23 12:53:29 -04:00
bruno a020cc3099 feat: login écran + clé API utilisateur + affichage nom connecté
- Route POST /api/auth/validate (backend) : valide la clé contre Imago
- AppState supporte clé dynamique (X-Api-Key header utilisateur)
- Écran de login overlay avec champ clé API + validation
- Nom d'utilisateur affiché dans le header (👤 bruno) avec bouton logout
- Stockage clé + nom dans localStorage (persiste entre sessions)
- Tous les appels API incluent X-Api-Key du frontend
2026-06-23 11:14:44 -04:00
bruno f25174f143 feat: upload drag-drop + responsive mobile
Backend:
- Route POST /api/upload avec multipart (axum 0.8)
- Proxy vers Imago, validation MIME, feedback JSON

Frontend:
- Zone de drop avec drag & drop (effet visuel au survol)
- Bouton Upload dans le header + FAB flottant mobile
- Support Ctrl+V (coller depuis presse-papier)
- Upload multiple, feedback toast (succès/erreur)
- Raccourci Ctrl+U pour upload
- Responsive: 2 breakpoints (768px, 400px)
- Gallery 2 colonnes sur mobile, FAB, toasts bottom
- user-scalable=no, tap-highlight transparent
2026-06-23 10:31:02 -04:00
bruno 80fc4f6bce fix: adaptation structs Imago API v2 - ExifCamera/ExifGps/AiData/OcrData
- Corrige ExifData pour matcher l'API réelle (camera/gps/raw nestés)
- Corrige OcrData (has_text ajouté)
- Corrige AiData (confidence, model_used, processed_at, prompt/output_tokens)
- Supprime les champs obsolètes (category, url_summary, window_title)
- get_image expose maintenant les champs EXIF/GPS complets
- Plus d'erreur 'missing field tags' sur le list/detail
2026-06-23 09:16:07 -04:00
bruno e92da02067 feat: Phase 9 — Dashboard web embarqué
- Frontend vanilla JS (18.9KB) : dark theme, gallery grid, search, stats, WebSocket
- rust-embed : frontend servi depuis le binaire (zéro dépendance externe)
- API REST fonctionnelle : /api/health, /api/images, /api/search, /api/images/:id, /api/stats
- WebSocket hub (dashmap + broadcast) : notifications temps réel
- ImagoClient: méthode get_raw() pour proxy thumbnails, Serialize sur ImageInfo
- MIME guess pour servir CSS/JS/images avec bons headers
- Fallback SPA : routes inconnues → index.html
- Dépendances : tokio-stream, futures-util, dashmap, chrono
- Testé : health OK, stats JSON, dashboard 18.9KB HTML, WS upgrade 400 (HTTP)

0 errors, 0 warnings (cargo check + build --release)
2026-06-22 17:05:49 -04:00
bruno a3b853de04 chore: initialiser le projet imagod-web (Rust)
- Structure du projet Cargo avec dépendances (clap, axum, reqwest, rusqlite, arboard, tray-icon)
- CLI avec sous-commandes start, serve, stop, status, config, install, uninstall, logs
- Module config: parsing TOML, chemins Windows/Linux
- Module dedup: dédoublonnage SHA-256 avec cache SQLite
- Module imago_client: client HTTP pour API Imago (upload, search, get)
- Module watcher: boucle de polling stub
- Module server: serveur web axum avec routes API REST stub
- Platform-specific: clipboard, tray, service, window_info (Windows)
- Frontend placeholder HTML
- Config par défaut (imagod.toml)
- README.md, LICENSE (MIT), .gitignore
2026-06-22 16:44:47 -04:00