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
This commit is contained in:
2026-06-23 15:20:26 -04:00
parent 8256d4c362
commit 1ec0d4fbe8
3 changed files with 238 additions and 10 deletions
+23
View File
@@ -311,4 +311,27 @@ impl ImagoClient {
let data = response.bytes().await?.to_vec();
Ok((data, content_type))
}
/// Supprime une image (nécessite le scope images:delete)
pub async fn delete_image(&self, id: i64) -> Result<()> {
self.client
.delete(format!("{}/{}", self.images_base(), id))
.header("X-API-Key", &self.api_key)
.send()
.await?
.error_for_status()?;
Ok(())
}
/// Met à jour les tags d'une image
pub async fn update_tags(&self, id: i64, tags: Vec<String>) -> Result<()> {
self.client
.put(format!("{}/{}/tags", self.images_base(), id))
.header("X-API-Key", &self.api_key)
.json(&serde_json::json!({"tags": tags}))
.send()
.await?
.error_for_status()?;
Ok(())
}
}