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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user