Date : 26/01/2026 Projet : connectors-api Status : En attente validation
Trois problèmes identifiés :
| Connecteur | auth_type actuel | Réalité | Disponible par défaut ? |
|---|---|---|---|
| ai-orchestrator | none | Pas d'auth | Non (devrait être oui) |
| yolo | none | Pas d'auth | Non (devrait être oui) |
| scraper | custom | Pas d'auth | Non (devrait être oui) |
| web-search | custom | Pas d'auth | Non (devrait être oui) |
| github | bearer | Token requis | Non |
| jellyfin | api_key | API key requise | Non |
| ... | ... | ... | ... |
config (connecteur) tokens (credentials)
├── id ├── connector_id ─┐
├── name (UNIQUE) ├── user_id ──────┼── UNIQUE ensemble
├── type ├── api_key │
├── auth_type └── access_token │
└── base_url │
▼
1 seul token par connector/user
auth_type: none proprementBackend :
none à la contrainte CHECK SQLtokens pour ces connecteurs/api/user/connectors/:id/token si auth_type: noneFrontend :
auth_type: noneNouvelle architecture :
connector_types (prédéfinis) user_connectors (instances)
├── type (github, jellyfin) ├── id
├── display_name ├── user_id
├── auth_type ├── connector_type ──► type
├── endpoints[] ├── name (ex: "Jellyfin Perso")
└── default_base_url ├── base_url (override)
├── api_key / token
└── is_default
Avantages :
Option A : Évolution douce (recommandée)
config comme "types de connecteurs"user_connectors pour les instancesOption B : Refactoring complet
config → connector_typestokens dans user_connectors-- Nouvelle table pour les instances utilisateur
CREATE TABLE connectors.user_connectors (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL,
connector_type_id UUID NOT NULL REFERENCES connectors.config(id),
-- Instance config
name TEXT NOT NULL, -- "Jellyfin Perso"
base_url TEXT, -- Override de l'URL par défaut
-- Credentials (fusionné depuis tokens)
api_key TEXT,
access_token TEXT,
refresh_token TEXT,
expires_at TIMESTAMPTZ,
token_metadata JSONB DEFAULT '{}',
-- Metadata
is_default BOOLEAN DEFAULT false, -- Instance par défaut pour ce type
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(user_id, name) -- Nom unique par utilisateur
);
# Lister les instances de l'utilisateur
GET /api/user/connectors
→ [{"id": "...", "name": "Jellyfin Perso", "type": "jellyfin", ...}]
# Créer une nouvelle instance
POST /api/user/connectors
{
"type": "jellyfin",
"name": "Jellyfin Famille",
"base_url": "https://jellyfin-famille.example.com",
"api_key": "..."
}
# Appeler via une instance spécifique
POST /api/fetch
{
"connector": "jellyfin", // type OU
"instance": "Jellyfin Famille", // nom d'instance
"method": "GET",
"path": "/System/Info"
}
| Tâche | Effort |
|---|---|
| Migration SQL | Faible |
| Backend (endpoints) | Moyen |
| Frontend (UI instances) | Moyen |
| Tests | Faible |
| Total | ~4-6h |
scraper et web-search sont marqués custom mais n'ont pas d'authyolo + ai-orchestrator devraient être utilisables immédiatementis_connected: false → l'UI suggère qu'il faut configurer quelque choseNouveau champ is_public dans la table config :
ALTER TABLE connectors.config ADD COLUMN is_public BOOLEAN DEFAULT false;
-- Connecteurs publics (sans auth, disponibles pour tous)
UPDATE connectors.config SET is_public = true, auth_type = 'none'
WHERE name IN ('ai-orchestrator', 'yolo', 'scraper', 'web-search');
Comportement :
is_public = true → Toujours is_connected = true dans l'APItokens⚠️ Important : "public" ne signifie PAS accessible sans auth !
/api/fetch nécessitent toujours le header Authorization: Bearer <token>Liste des connecteurs publics : | Connecteur | Usage | |------------|-------| | ai-orchestrator | Queue IA, GPU status | | yolo | Détection objets | | web-search | Recherche web (SearXNG) | | scraper | Web scraping (Playwright) |
Aucune donnée ne sera perdue !
Toutes les migrations sont additives :
ALTER TABLE ADD COLUMN → ajoute sans toucher aux données existantesUPDATE ... SET is_public = true → modifie uniquement le nouveau champScript de migration sécurisé :
-- Transaction pour rollback si erreur
BEGIN;
-- 1. Ajouter colonne (sans impact sur données)
ALTER TABLE connectors.config ADD COLUMN IF NOT EXISTS is_public BOOLEAN DEFAULT false;
-- 2. Mettre à jour UNIQUEMENT les connecteurs sans auth
UPDATE connectors.config
SET is_public = true, auth_type = 'none'
WHERE name IN ('ai-orchestrator', 'yolo', 'scraper', 'web-search');
-- 3. Vérifier avant commit
SELECT name, auth_type, is_public FROM connectors.config;
COMMIT;
| Changement | Table | Effort | Impact données |
|---|---|---|---|
Ajouter none à CHECK constraint |
config | 5 min | Aucun |
| Corriger auth_type scraper/web-search | config | 5 min | Aucun |
Ajouter is_public |
config | 10 min | Aucun |
Table user_connectors (multi-instances) |
nouvelle | 1h | Aucun (nouvelle table) |
| Backend endpoints modifiés | index.ts | 2h | Aucun |
| Frontend (masquer credentials, multi-instances) | front | 2h | Aucun |