Files
CollectFlow/src/features/settings/actions.ts
T
Claude 4142e7c73e Paramètres : clé d'API FF Nancy (en-tête X-API-Key)
L'API api.ffnancy.fr exige désormais une clé (401 « Clé d'API requise »).
- Nouveau champ « Clé d'API » dans Paramètres → API FF Nancy, stocké dans
  data/.db-config.json (ffApiKey), jamais renvoyé au navigateur ; vide =
  conserver la clé enregistrée. Repli sur la variable FF_API_KEY.
- Tous les appels à l'API FF envoient l'en-tête X-API-Key (ff_get, proxy
  commandes-auto, publicités, /api/diag, test de connexion).
- Le test de connexion signale explicitement une clé manquante ou refusée.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KdY28Lq8Q8xX4RZsAvWRQ7
2026-10-17 12:44:28 +00:00

87 lines
3.2 KiB
TypeScript

/**
* Actions des Paramètres — réservées aux administrateurs, exécutées par le
* serveur Rust : `POST /api/actions/{nom}`.
*
* Aucun secret ne repart vers le navigateur : les mots de passe (base, Qlik) et
* les clés d'IA restent dans `data/.db-config.json`. Un mot de passe laissé vide
* dans le formulaire signifie « conserver celui qui est enregistré ».
*/
import { callAction } from "@/lib/rpc";
import type { FfSyncStatus } from "@/types/ff";
export interface ChampsBaseDeDonnees {
host: string;
port: string;
database: string;
user: string;
/** Vide ou absent : le mot de passe enregistré est conservé. */
password?: string;
ssl: boolean;
}
/** Ce que le formulaire peut afficher : jamais de mot de passe ni de clé. */
export interface ParametresAffichables {
db: {
host: string;
port: string;
database: string;
user: string;
ssl: boolean;
motDePasseEnregistre: boolean;
} | null;
qlik: { host: string; user: string; motDePasseEnregistre: boolean };
ffApiBaseUrl: string;
/** Une clé d'API FF est enregistrée (la clé elle-même ne quitte pas le serveur). */
ffApiKeyEnregistree: boolean;
}
export interface ResultatAction {
success: boolean;
error?: string;
}
/** Diagnostic de l'API FF Nancy (bouton « Tester »). */
export type DiagnosticApiFf =
| { success: true; url: string; ms: number; status: FfSyncStatus }
| { success: false; url: string; error: string };
/** Réglages enregistrés, sans aucun secret. */
export async function getParametresAffichables(): Promise<ParametresAffichables> {
return callAction("getParametresAffichables", []);
}
export async function testDatabaseConnection(champs: ChampsBaseDeDonnees): Promise<ResultatAction> {
return callAction("testDatabaseConnection", [champs]);
}
export async function saveDatabaseSettings(champs: ChampsBaseDeDonnees): Promise<ResultatAction> {
return callAction("saveDatabaseSettings", [champs]);
}
/** Mot de passe vide ou absent : celui qui est enregistré est conservé. */
export async function saveQlikSettings(qlikHost: string, qlikUser: string, qlikPassword?: string): Promise<ResultatAction> {
return callAction("saveQlikSettings", [qlikHost, qlikUser, qlikPassword]);
}
/** Mot de passe vide ou absent : on teste avec celui qui est enregistré. */
export async function testQlikConnection(qlikHost: string, qlikUser: string, qlikPassword?: string): Promise<ResultatAction> {
return callAction("testQlikConnection", [qlikHost, qlikUser, qlikPassword]);
}
/**
* Enregistre l'URL de l'API FF Nancy (chaîne vide = revenir au défaut) et sa clé
* d'API (vide ou absente : celle qui est enregistrée est conservée).
*/
export async function saveFfApiSettings(ffApiBaseUrl: string, ffApiKey?: string): Promise<ResultatAction> {
return callAction("saveFfApiSettings", [ffApiBaseUrl, ffApiKey]);
}
/**
* Teste l'API FF Nancy (diagnostic détaillé : DNS, refus, délai, code HTTP, clé).
* Clé vide ou absente : on teste avec celle qui est enregistrée.
*/
export async function testFfApiConnection(ffApiBaseUrl?: string, ffApiKey?: string): Promise<DiagnosticApiFf> {
return callAction("testFfApiConnection", [ffApiBaseUrl, ffApiKey]);
}