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)
This commit is contained in:
2026-06-25 14:35:24 -04:00
parent 5a2e12da01
commit 0309359231
4 changed files with 28 additions and 7 deletions
+21
View File
@@ -227,6 +227,27 @@ async fn upload_image(
// Calculer le hash AVANT de consommer `data` (upload_image prend ownership)
let file_hash = crate::dedup::Dedup::hash_bytes(&data);
// ═══ Déduplication SQLite : vérifier si ce hash a déjà été uploadé ═══
if let Ok(dedup) = crate::dedup::Dedup::open(&state.dedup_db_path, 1000) {
if dedup.already_seen(&file_hash).unwrap_or(false) {
tracing::info!(
"🔄 Fichier déjà connu — hash {}... ignoré (uploadeur : {})",
hex::encode(&file_hash[..8.min(file_hash.len())]),
filename
);
return (
axum::http::StatusCode::OK,
Json(serde_json::json!({
"id": null,
"uuid": null,
"filename": filename,
"status": "duplicate",
"message": "Image déjà existante (hash identique)"
})),
);
}
}
// ═══ Garde anti-doublon : vérifier qu'aucun upload concurrent n'est en cours pour ce hash ═══
{
let mut in_flight = state.in_flight.lock().await;