# Guide d'utilisation de l'API Imago ## 📍 Sommaire - [🔐 Authentification](#-authentification) - [đŸ›Ąïž Scopes (Permissions)](#-scopes-permissions) - [📊 Plans et Rate Limiting](#-plans-et-rate-limiting) - [đŸ‘„ Gestion des Clients (Admin uniquement)](#-gestion-des-clients-admin-uniquement) - [📁 Multi-tenancy et Isolation](#-multi-tenancy-et-isolation) - [📖 RĂ©fĂ©rence des Endpoints](#-rĂ©fĂ©rence-des-endpoints) - [📾 Gestion des Images](#-gestion-des-images) - [đŸ€– Intelligence Artificielle](#-intelligence-artificielle) - [🔑 Administration (Admin uniquement)](#-administration-admin-uniquement) - [đŸ„ SantĂ© et Status](#-santĂ©-et-status) - [🚀 Exemples Rapides](#-exemples-rapides) --- ## 🔐 Authentification Tous les endpoints (sauf `/health` et `/`) nĂ©cessitent une authentification via une **ClĂ© API**. ### Header Authorization Vous devez inclure votre clĂ© dans le header `Authorization` de chaque requĂȘte : ```http Authorization: Bearer VOTRE_CLE_API_SECRET ``` > [!WARNING] > Traitez votre clĂ© API comme un mot de passe. Ne la partagez jamais et ne l'incluez pas dans du code client (frontend) accessible publiquement. --- ## đŸ›Ąïž Scopes (Permissions) L'accĂšs aux fonctionnalitĂ©s est contrĂŽlĂ© par des **scopes**. Chaque clĂ© API est limitĂ©e Ă  un ensemble de permissions : | Scope | Description | Fonctions incluses | |-------|-------------|-------------------| | `images:read` | Lecture seule | Lister les images, voir les dĂ©tails, EXIF, OCR, AI. | | `images:write` | Écriture | Uploader des images, relancer le pipeline de traitement. | | `images:delete`| Suppression | Supprimer dĂ©finitivement des images. | | `ai:use` | Utilisation IA | RĂ©sumĂ© d'URL, rĂ©daction de tĂąches. | | `admin` | Administration | GĂ©rer les clients API, voir les clĂ©s, modifier les plans. | --- ## 📊 Plans et Rate Limiting Le systĂšme applique des limites de requĂȘtes (Rate Limits) basĂ©es sur le **Plan** de votre client. Les compteurs sont rĂ©initialisĂ©s toutes les heures. | Plan | Uploads / heure | RequĂȘtes AI / heure | |------|-----------------|---------------------| | `free` | 20 | 50 | | `standard` | 100 | 200 | | `premium` | 500 | 1000 | *Les requĂȘtes de lecture (`GET`) ne sont pas limitĂ©es par dĂ©faut.* --- ## đŸ‘„ Gestion des Clients (Admin uniquement) Si vous avez le scope `admin`, vous pouvez gĂ©rer les accĂšs. ### CrĂ©er un nouveau client ```bash curl -X POST http://localhost:8000/auth/clients \ -H "Authorization: Bearer CLE_ADMIN" \ -H "Content-Type: application/json" \ -d '{ "name": "Application Mobile", "scopes": ["images:read", "images:write", "ai:use"], "plan": "standard" }' ``` **RĂ©ponse (Importante) :** ```json { "id": "uuid-...", "api_key": "cle_generee_en_clair_une_seule_fois", "name": "Application Mobile", ... } ``` > [!CAUTION] > La clĂ© API n'est affichĂ©e **qu'une seule fois** Ă  la crĂ©ation. Stockez-la immĂ©diatement de maniĂšre sĂ©curisĂ©e. ### RĂ©gĂ©nĂ©rer une clĂ© (Rotation) En cas de compromission, invalidez l'ancienne clĂ© et gĂ©nĂ©rez-en une nouvelle : ```bash curl -X POST http://localhost:8000/auth/clients/{id}/rotate-key \ -H "Authorization: Bearer CLE_ADMIN" ``` --- ## 📁 Multi-tenancy et Isolation L'API est **multi-tenant**. Cela signifie que : - Vous ne voyez **que** les images uploadĂ©es avec votre clĂ©. - Les IDs d'images sont globaux, mais si vous tentez d'accĂ©der Ă  l'ID d'un autre client, vous recevrez une erreur `404 Not Found`. - Vos fichiers physiques sont stockĂ©s dans un sous-rĂ©pertoire dĂ©diĂ© sur le serveur (`/data/uploads/{votre_client_id}/`). --- ## 📖 RĂ©fĂ©rence des Endpoints ### 📾 Gestion des Images #### Lister les images `GET /images` - **Scope required** : `images:read` - **Query Params** : - `page` : NumĂ©ro de page (dĂ©faut: 1) - `page_size` : Taille de page (dĂ©faut: 20, max: 100) - `tag` : Filtrer par tag AI - `status` : Filtrer par statut (`pending`, `processing`, `done`, `error`) - `search` : Recherche textuelle dans le nom, la description AI ou l'OCR. #### Uploader une image `POST /images/upload` - **Scope required** : `images:write` - **Body** : `multipart/form-data` - `file` : Le fichier image (JPEG, PNG, WebP, etc.) - **Note** : Lance automatiquement le pipeline AI en arriĂšre-plan. #### DĂ©tail complet d'une image `GET /images/{id}` - **Scope required** : `images:read` - **Description** : Retourne toutes les donnĂ©es (Source, EXIF, OCR, AI). #### Statut du traitement `GET /images/{id}/status` - **Scope required** : `images:read` - **Description** : Pour savoir si l'analyse par l'IA est terminĂ©e. #### MĂ©tadonnĂ©es spĂ©cifiques - `GET /images/{id}/exif` : DonnĂ©es techniques de l'appareil et GPS. - `GET /images/{id}/ocr` : Texte extrait de l'image. - `GET /images/{id}/ai` : Description textuelle et tags gĂ©nĂ©rĂ©s. #### Retraitement `POST /images/{id}/reprocess` - **Scope required** : `images:write` - **Description** : RĂ©initialise et relance le pipeline d'analyse AI. #### Suppression `DELETE /images/{id}` - **Scope required** : `images:delete` - **Description** : Supprime l'entrĂ©e en base et les fichiers sur le disque. #### Tags globaux `GET /images/tags/all` - **Scope required** : `images:read` - **Description** : Liste tous les tags uniques utilisĂ©s par le client. --- ### đŸ€– Intelligence Artificielle #### RĂ©sumĂ© d'URL `POST /ai/summarize` - **Scope required** : `ai:use` - **Body** (JSON) : ```json { "url": "https://...", "language": "français" } ``` #### RĂ©daction de tĂąche `POST /ai/draft-task` - **Scope required** : `ai:use` - **Body** (JSON) : ```json { "description": "Texte libre dĂ©crivant la tĂąche", "context": "Contexte optionnel", "language": "fr" } ``` --- ### 🔑 Administration (Admin uniquement) *NĂ©cessite le scope `admin`.* - `POST /auth/clients` : CrĂ©er un client (retourne la clĂ©). - `GET /auth/clients` : Lister tous les clients. - `GET /auth/clients/{id}` : Voir les dĂ©tails d'un client. - `PATCH /auth/clients/{id}` : Modifier un client (nom, scopes, plan). - `POST /auth/clients/{id}/rotate-key` : Changer la clĂ© API. - `DELETE /auth/clients/{id}` : DĂ©sactiver un client (suspension d'accĂšs). --- ### đŸ„ SantĂ© et Status Ces endpoints sont **publics** et ne nĂ©cessitent aucune clĂ© API. - `GET /` : Informations de base sur l'application (Version, Status). - `GET /health` : VĂ©rification complĂšte de l'Ă©tat (AI configurĂ©e, OCR actif, ModĂšle utilisĂ©). --- ## 🚀 Exemples Rapides ### Lister mes images (Python / httpx) ```python import httpx headers = {"Authorization": "Bearer ma_super_cle"} r = httpx.get("http://localhost:8000/images", headers=headers) for img in r.json()["items"]: print(f"ID: {img['id']} | Name: {img['original_name']}") ``` ### Uploader une image (Node.js / Axios) ```javascript const axios = require('axios'); const fs = require('fs'); const FormData = require('form-data'); const form = new FormData(); form.append('file', fs.createReadStream('vacances.jpg')); axios.post('http://localhost:8000/images/upload', form, { headers: { ...form.getHeaders(), 'Authorization': 'Bearer ma_super_cle' } }).then(console.log); ```