# API et autres

Pas de problème, on reste **minimaliste et efficace** : juste le partage de fichiers/dossiers, avec une intégration simple pour gérer les utilisateurs depuis ton app existante.

---

## **1. Intégration des Utilisateurs via l’API REST de Seafile**

Seafile propose une **API REST complète** pour gérer les utilisateurs, les groupes et les permissions. C’est la solution la plus propre pour automatiser la création de comptes depuis ton app.

### **a. Documentation de l’API**

- **Lien officiel** : [Seafile API v2.1](https://download.seafile.com/published/seafile-manual/deploy/using_seafile_api.md)
- **Authentification** : Utilise un **token admin** (à générer depuis l’interface web).

---

### **b. Étapes pour Utiliser l’API**

#### **Étape 1 : Générer un Token Admin**

1. Connecte-toi à Seafile en tant qu’admin (`https://seafile.tacampagne.fr`).
2. Va dans **Profil → Générer un token API**.
3. Copie ce token (ex: `abc123...xyz`), il servira pour toutes les requêtes API.

#### **Étape 2 : Créer un Utilisateur via l’API**

**Exemple en `curl`** :

<div class="border-default bg-default relative m-0 rounded-md border whitespace-break-spaces" data-testid="code-block" id="bkmrk-curl--v--h-%22authoriz"><div class="text-default text-sm select-text">`curl -v -H "Authorization: Token abc123...xyz" \     -H "Content-Type: application/json" \     -d '{"email": "user1@tacampagne.fr", "password": "motdepasse123", "name": "Jean Dupont"}' \     https://seafile.tacampagne.fr/api2/accounts/`</div></div>- **Réponse réussie** : <div class="border-default bg-default relative m-0 rounded-md border whitespace-break-spaces" data-testid="code-block"><div class="text-default text-sm select-text">`{"email": "user1@tacampagne.fr", "name": "Jean Dupont"}`</div></div>

#### **Étape 3 : Créer un Groupe et Ajouter des Utilisateurs**

1. **Créer un groupe** (ex: "Membres Campagne") : <div class="border-default bg-default relative m-0 rounded-md border whitespace-break-spaces" data-testid="code-block"><div class="text-default text-sm select-text">`curl -v -H "Authorization: Token abc123...xyz" \     -H "Content-Type: application/json" \     -d '{"name": "Membres Campagne"}' \     https://seafile.tacampagne.fr/api2/groups/`</div></div>
2. **Ajouter un utilisateur au groupe** : <div class="border-default bg-default relative m-0 rounded-md border whitespace-break-spaces" data-testid="code-block"><div class="text-default text-sm select-text">`curl -v -H "Authorization: Token abc123...xyz" \     -X PUT \     https://seafile.tacampagne.fr/api2/groups/Membres%20Campagne/members/user1@tacampagne.fr/`</div></div>

#### **Étape 4 : Partager un Dossier avec un Groupe**

1. **Récupérer l’ID de la bibliothèque (library)** : <div class="border-default bg-default relative m-0 rounded-md border whitespace-break-spaces" data-testid="code-block"><div class="text-default text-sm select-text">`curl -H "Authorization: Token abc123...xyz" \     https://seafile.tacampagne.fr/api2/repos/`</div></div>
    - Exemple de réponse : <div class="border-default bg-default relative m-0 rounded-md border whitespace-break-spaces" data-testid="code-block"><div class="text-default text-sm select-text">`[  {    "id": "a1b2c3d4-5678-90ef-ghij-klmnopqrstuv",    "name": "Documents Campagne",    "permission": "rw"  }]`</div></div>
2. **Partager le dossier avec le groupe** : <div class="border-default bg-default relative m-0 rounded-md border whitespace-break-spaces" data-testid="code-block"><div class="text-default text-sm select-text">`curl -v -H "Authorization: Token abc123...xyz" \     -H "Content-Type: application/json" \     -d '{"share_type": "group", "group": "Membres Campagne", "permission": "rw"}' \     https://seafile.tacampagne.fr/api2/repos/a1b2c3d4-5678-90ef-ghij-klmnopqrstuv/shares/`</div></div>

---

### **c. Exemple en Python (pour ton app)**

Si ton app est en Python, voici un script pour créer des utilisateurs depuis une liste :

<div class="border-default bg-default relative m-0 rounded-md border whitespace-break-spaces" data-testid="code-block" id="bkmrk-import-requests-impo"><div class="text-default text-sm select-text">`import requestsimport json# ConfigSEAFILE_URL = "https://seafile.tacampagne.fr"API_TOKEN = "abc123...xyz"  # Remplace par ton tokenHEADERS = {"Authorization": f"Token {API_TOKEN}", "Content-Type": "application/json"}# Liste des utilisateurs (ex: extraite de ton app)users = [    {"email": "user1@tacampagne.fr", "password": "motdepasse1", "name": "Jean Dupont"},    {"email": "user2@tacampagne.fr", "password": "motdepasse2", "name": "Marie Martin"}]# Créer les utilisateursfor user in users:    response = requests.post(        f"{SEAFILE_URL}/api2/accounts/",        headers=HEADERS,        data=json.dumps(user)    )    if response.status_code == 200:        print(f"Utilisateur {user['email']} créé avec succès.")    else:        print(f"Erreur pour {user['email']}: {response.text}")# Créer un groupe et ajouter les utilisateursgroup_name = "Membres Campagne"requests.post(    f"{SEAFILE_URL}/api2/groups/",    headers=HEADERS,    data=json.dumps({"name": group_name}))for user in users:    requests.put(        f"{SEAFILE_URL}/api2/groups/{group_name}/members/{user['email']}/",        headers=HEADERS    )`</div></div>---

## **2. Alternative : Synchronisation via Base de Données**

Si tu préfères éviter l’API (ou si ton app tourne sur le même serveur), tu peux **interagir directement avec la base de données MariaDB** de Seafile. **Attention** : Cette méthode est **moins recommandée** (risque de corruption si mal utilisée), mais elle est possible.

### **a. Structure de la Base de Données**

- **Table `EmailUser`** : Stocke les utilisateurs.
    
    <div class="border-default bg-default relative m-0 rounded-md border whitespace-break-spaces" data-testid="code-block"><div class="text-default text-sm select-text">`SELECT <span class="hljs-operator">*</span> FROM EmailUser;`</div></div><div><table><thead><tr><th>Champ</th><th>Description</th></tr></thead><tbody><tr><td>email</td><td>Email de l’utilisateur</td></tr><tr><td>password</td><td>Mot de passe (hashé)</td></tr><tr><td>name</td><td>Nom complet</td></tr><tr><td>is\_staff</td><td>1 = admin, 0 = utilisateur normal</td></tr></tbody></table>
    
    </div>
- **Table `GroupUser`** : Stocke les groupes.
- **Table `GroupUser_Group`** : Lie les utilisateurs aux groupes.

### **b. Exemple de Requête SQL**

Pour ajouter un utilisateur :

<div class="border-default bg-default relative m-0 rounded-md border whitespace-break-spaces" data-testid="code-block" id="bkmrk-insert-into-emailuse"><div class="text-default text-sm select-text">`INSERT INTO EmailUser (email, password, name, is_staff)VALUES ('user1@tacampagne.fr', 'motdepasse_hashé', 'Jean Dupont', 0);`</div></div>**Problème** : Le mot de passe doit être **hashé** (Seafile utilise un algorithme spécifique). Pour le générer, utilise l’API ou le script Python ci-dessus.

---

## **3. Automatisation avec un Script Bash**

Si tu veux un script **simple et robuste** pour synchroniser tes utilisateurs depuis un fichier CSV (ex: exporté depuis ton app) :

<div class="border-default bg-default relative m-0 rounded-md border whitespace-break-spaces" data-testid="code-block" id="bkmrk-%23%21%2Fbin%2Fbash-api_toke"><div class="text-default text-sm select-text">`#!/bin/bashAPI_TOKEN="abc123...xyz"SEAFILE_URL="https://seafile.tacampagne.fr"CSV_FILE="users.csv"  # Format: email,password,namewhile IFS=, read -r email password name; do  # Créer l'utilisateur  curl -s -H "Authorization: Token $API_TOKEN" \       -H "Content-Type: application/json" \       -d "{\"email\": \"$email\", \"password\": \"$password\", \"name\": \"$name\"}" \       "$SEAFILE_URL/api2/accounts/" | grep -q "email"  if [ $? -eq 0 ]; then    echo "Utilisateur $email créé."    # Ajouter au groupe "Membres Campagne"    curl -s -X PUT -H "Authorization: Token $API_TOKEN" \         "$SEAFILE_URL/api2/groups/Membres%20Campagne/members/$email/"  else    echo "Erreur pour $email."  fidone < "$CSV_FILE"`</div></div>---

## **4. Bonnes Pratiques**

1. **Gère les mots de passe** :
    
    
    - Génère des mots de passe aléatoires pour les utilisateurs et envoie-les par email (ex: avec `sendmail` ou un service comme Mailgun).
    - Ou utilise un **lien d’invitation** (Seafile permet d’envoyer des invitations par email).
2. **Sécurise ton token API** :
    
    
    - Ne le stocke **jamais en clair** dans ton code. Utilise des variables d’environnement ou un gestionnaire de secrets (ex: `dotenv`).
    - Restreins les permissions du token (ex: uniquement création d’utilisateurs).
3. **Logs et monitoring** :
    
    
    - Active les logs de l’API Seafile pour déboguer : <div class="border-default bg-default relative m-0 rounded-md border whitespace-break-spaces" data-testid="code-block"><div class="text-default text-sm select-text">`docker-compose logs -f seafile | grep api2`</div></div>
4. **Teste en staging** :
    
    
    - Déploie une instance Seafile de test pour valider ton script avant de l’exécuter en production.

---

## **5. Exemple Complet : Intégration avec ton App**

### **Scénario** :

- Ton app gère une liste de contacts (ex: `contacts.csv`).
- Tu veux : 
    1. Créer un utilisateur Seafile pour chaque contact.
    2. Les ajouter au groupe "Membres Campagne".
    3. Partager un dossier "Documents Campagne" avec ce groupe.

### **Étapes** :

1. **Exporte tes contacts** depuis ton app au format CSV :
    
    <div class="border-default bg-default relative m-0 rounded-md border whitespace-break-spaces" data-testid="code-block"><div class="text-default text-sm select-text">`email,password,nameuser1@tacampagne.fr,motdepasse1,Jean Dupontuser2@tacampagne.fr,motdepasse2,Marie Martin`</div></div>
2. **Exécute le script Python** (ou Bash) pour créer les utilisateurs et les groupes.
3. **Partage le dossier** via l’API (comme montré plus haut).

---

## **6. Résumé des Commandes Utiles**

<div id="bkmrk-action-commande-curl"><table><thead><tr><th>Action</th><th>Commande curl</th></tr></thead><tbody><tr><td>**Lister les utilisateurs**</td><td>`curl -H "Authorization: Token ABC" "$SEAFILE_URL/api2/accounts/"`</td></tr><tr><td>**Créer un utilisateur**</td><td>`curl -H "Authorization: Token ABC" -d '{"email": "...", "password": "...", ...}' "$SEAFILE_URL/api2/accounts/"`</td></tr><tr><td>**Créer un groupe**</td><td>`curl -H "Authorization: Token ABC" -d '{"name": "Groupe"}' "$SEAFILE_URL/api2/groups/"`</td></tr><tr><td>**Ajouter un utilisateur à un groupe**</td><td>`curl -X PUT -H "Authorization: Token ABC" "$SEAFILE_URL/api2/groups/Groupe/members/email/"`</td></tr><tr><td>**Partager un dossier**</td><td>`curl -H "Authorization: Token ABC" -d '{"share_type": "group", "group": "Groupe", "permission": "rw"}' "$SEAFILE_URL/api2/repos/ID_DU_DOSSIER/shares/"`</td></tr></tbody></table>

</div>---

## **7. Prochaines Étapes**

1. **Veux-tu que je t’aide à adapter le script Python/Bash pour ton format de données spécifique ?**
2. **As-tu besoin d’un exemple pour générer des mots de passe aléatoires et les envoyer par email ?**
3. **Veux-tu tester l’API en direct avec un exemple de `curl` pour vérifier que tout fonctionne ?**

Dis-moi ce qui te serait le plus utile, et on avance ! 🚀