180 lines
5.8 KiB
Markdown
Executable File
180 lines
5.8 KiB
Markdown
Executable File
# ✅ Import .md avec détection de doublons - COMPLÉTÉ
|
|
|
|
## Modifications apportées
|
|
|
|
La fonctionnalité d'import de fichiers .md a été améliorée avec une **vérification automatique des doublons**.
|
|
|
|
### Backend modifié
|
|
|
|
**[backend/app/api/endpoints/peripherals.py](backend/app/api/endpoints/peripherals.py)**
|
|
|
|
Ajout de la vérification de doublon dans l'endpoint `/api/peripherals/import/markdown` :
|
|
|
|
```python
|
|
# Check for existing peripheral with same vendor_id and product_id
|
|
existing_peripheral = None
|
|
vendor_id = suggested.get("caracteristiques_specifiques", {}).get("vendor_id")
|
|
product_id = suggested.get("caracteristiques_specifiques", {}).get("product_id")
|
|
|
|
if vendor_id and product_id:
|
|
# Search for peripheral with matching vendor_id and product_id
|
|
all_peripherals = db.query(Peripheral).all()
|
|
for periph in all_peripherals:
|
|
if periph.caracteristiques_specifiques:
|
|
p_vendor = periph.caracteristiques_specifiques.get("vendor_id")
|
|
p_product = periph.caracteristiques_specifiques.get("product_id")
|
|
if p_vendor == vendor_id and p_product == product_id:
|
|
existing_peripheral = periph
|
|
break
|
|
```
|
|
|
|
**Retour API :**
|
|
- Si **nouveau** : `already_exists: false` + `suggested_peripheral`
|
|
- Si **existe** : `already_exists: true` + `existing_peripheral`
|
|
|
|
### Frontend modifié
|
|
|
|
**[frontend/js/peripherals.js](frontend/js/peripherals.js)**
|
|
|
|
La fonction `importMarkdown()` gère maintenant deux cas :
|
|
|
|
#### Cas 1 : Périphérique nouveau
|
|
```javascript
|
|
if (result.already_exists) {
|
|
// Doublon détecté...
|
|
} else if (result.suggested_peripheral) {
|
|
// Nouveau périphérique
|
|
closeModal('modal-import-md');
|
|
showAddModal();
|
|
|
|
// Pré-remplir tous les champs du formulaire
|
|
if (suggested.nom) document.getElementById('nom').value = suggested.nom;
|
|
if (suggested.type_principal) { ... }
|
|
// etc.
|
|
|
|
showSuccess(`Fichier ${result.filename} importé avec succès. Vérifiez et complétez les informations.`);
|
|
}
|
|
```
|
|
|
|
#### Cas 2 : Périphérique existant (doublon)
|
|
```javascript
|
|
if (result.already_exists) {
|
|
closeModal('modal-import-md');
|
|
|
|
const existing = result.existing_peripheral;
|
|
const message = `Ce périphérique existe déjà dans la base de données:\n\n` +
|
|
`Nom: ${existing.nom}\n` +
|
|
`Marque: ${existing.marque || 'N/A'}\n` +
|
|
`Modèle: ${existing.modele || 'N/A'}\n` +
|
|
`Quantité: ${existing.quantite_totale}\n\n` +
|
|
`Voulez-vous voir ce périphérique?`;
|
|
|
|
if (confirm(message)) {
|
|
// Redirige vers la page de détail
|
|
window.location.href = `peripheral-detail.html?id=${existing.id}`;
|
|
} else {
|
|
showInfo(`Import annulé - le périphérique "${existing.nom}" existe déjà.`);
|
|
}
|
|
}
|
|
```
|
|
|
|
### Documentation mise à jour
|
|
|
|
**[FEATURE_IMPORT_MD.md](FEATURE_IMPORT_MD.md)**
|
|
|
|
Ajout de deux workflows détaillés :
|
|
- Workflow Cas 1 : Périphérique nouveau (18 étapes)
|
|
- Workflow Cas 2 : Périphérique existant avec doublon (13 étapes)
|
|
|
|
## Fonctionnement
|
|
|
|
### Détection des doublons
|
|
|
|
La vérification se fait sur **vendor_id + product_id** :
|
|
|
|
1. Le fichier .md est parsé
|
|
2. On extrait `vendor_id` et `product_id` (depuis le contenu ou le nom de fichier)
|
|
3. On recherche dans la base tous les périphériques existants
|
|
4. On compare les `vendor_id` et `product_id` de chaque périphérique
|
|
5. Si match trouvé → **Doublon détecté**
|
|
|
|
**Exemple :**
|
|
```markdown
|
|
Fichier : ID_0781_55ab.md
|
|
→ vendor_id = 0x0781
|
|
→ product_id = 0x55ab
|
|
|
|
Recherche dans la base :
|
|
→ Périphérique #42 : vendor_id=0x0781, product_id=0x55ab
|
|
→ MATCH ! → Doublon détecté
|
|
```
|
|
|
|
### Expérience utilisateur
|
|
|
|
**Si nouveau périphérique :**
|
|
1. Modal import se ferme
|
|
2. Modal ajout s'ouvre
|
|
3. Formulaire pré-rempli avec toutes les données du fichier .md
|
|
4. L'utilisateur complète (prix, localisation, photos)
|
|
5. Enregistre → Périphérique créé
|
|
|
|
**Si périphérique existe déjà :**
|
|
1. Modal import se ferme
|
|
2. Dialog de confirmation s'affiche :
|
|
```
|
|
Ce périphérique existe déjà dans la base de données:
|
|
|
|
Nom: SanDisk USB Flash Drive
|
|
Marque: SanDisk
|
|
Modèle: 3.2Gen1
|
|
Quantité: 2
|
|
|
|
Voulez-vous voir ce périphérique?
|
|
```
|
|
3. Si **OUI** → Redirige vers la page de détail du périphérique existant
|
|
4. Si **NON** → Message "Import annulé - le périphérique existe déjà"
|
|
|
|
## Test rapide
|
|
|
|
```bash
|
|
# 1. Redémarrer le backend
|
|
docker compose restart backend
|
|
|
|
# 2. Importer un nouveau fichier (ex: ID_0b05_17cb.md)
|
|
# Via interface : http://localhost:8087/peripherals.html
|
|
# Bouton "Importer .md" → Sélectionner fichier → Importer
|
|
# Résultat : Formulaire pré-rempli
|
|
|
|
# 3. Réimporter le MÊME fichier
|
|
# Résultat : Message "Ce périphérique existe déjà..." avec option de voir
|
|
|
|
# 4. Test API direct
|
|
curl -X POST http://localhost:8007/api/peripherals/import/markdown \
|
|
-F "file=@fichier_usb/ID_0b05_17cb.md" | jq
|
|
|
|
# Premier import : already_exists = false
|
|
# Second import : already_exists = true
|
|
```
|
|
|
|
## Avantages
|
|
|
|
✅ **Évite les doublons** - Impossible d'importer deux fois le même périphérique (vendor_id + product_id)
|
|
✅ **Navigation rapide** - Si doublon, option de voir directement le périphérique existant
|
|
✅ **Informé** - L'utilisateur sait immédiatement si le périphérique existe déjà
|
|
✅ **Transparence** - Affiche les infos du périphérique existant (nom, marque, modèle, quantité)
|
|
✅ **Workflow fluide** - Modal se ferme automatiquement, pas de confusion
|
|
|
|
## Fichiers modifiés
|
|
|
|
| Fichier | Modifications |
|
|
|---------|---------------|
|
|
| [backend/app/api/endpoints/peripherals.py](backend/app/api/endpoints/peripherals.py) | +40 lignes - Vérification doublon |
|
|
| [frontend/js/peripherals.js](frontend/js/peripherals.js) | +35 lignes - Gestion cas doublon |
|
|
| [FEATURE_IMPORT_MD.md](FEATURE_IMPORT_MD.md) | +50 lignes - Documentation workflows |
|
|
|
|
**Total :** ~125 lignes ajoutées
|
|
|
|
---
|
|
|
|
**Développé avec Claude Code** - 2025-12-30
|