mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-21 22:18:08 +02:00
feat: implement PostgreSQL client for FF Nancy API data with bulk SQL queries, replacing per-article HTTP calls.
This commit is contained in:
1 parent
2eb196861b
commit
c63a60c0cf
2 files changed
+16
-46
No files matched your search
@@ -579,18 +579,8 @@ export async function getSyncStatus(): Promise<FfSyncStatus | null> {
|
|||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
export async function getSitesFromApi(): Promise<{ code: string; nom: string }[]> {
|
export async function getSitesFromApi(): Promise<{ code: string; nom: string }[]> {
|
||||||
try {
|
return [
|
||||||
const res = await fetch(`${FF_API_BASE}/api/sites`, { cache: "no-store" });
|
{ code: "292", nom: "Frouard (Nancy)" },
|
||||||
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
{ code: "579", nom: "Houdemont" },
|
||||||
const data = await res.json();
|
];
|
||||||
const list = Array.isArray(data) ? data : ((data as any).items ?? (data as any).data ?? []);
|
|
||||||
return list.map((s: any) => ({ code: s.code ?? s.codesite ?? s.site, nom: s.nom ?? s.libelle ?? s.code }));
|
|
||||||
} catch (err) {
|
|
||||||
console.error("[api-ff] getSitesFromApi error:", err);
|
|
||||||
// Fallback : sites connus de FF Nancy
|
|
||||||
return [
|
|
||||||
{ code: "292", nom: "Frouard (Nancy)" },
|
|
||||||
{ code: "579", nom: "Houdemont" },
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
+12
-32
@@ -83,45 +83,25 @@ export interface PgRankingRow {
|
|||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retourne la liste des fournisseurs actifs et non suspendus depuis fouident.
|
* Retourne la liste des fournisseurs depuis fouadr1 + artfou1.
|
||||||
* 1 requête SQL — remplace getFournisseursFromApi().
|
|
||||||
*/
|
*/
|
||||||
export async function pgGetFournisseurs(search?: string): Promise<{ code: string; nom: string }[]> {
|
export async function pgGetFournisseurs(search?: string): Promise<{ code: string; nom: string }[]> {
|
||||||
try {
|
try {
|
||||||
const result = await db.execute(sql`
|
const result = await db.execute(sql`
|
||||||
SELECT DISTINCT
|
SELECT DISTINCT fa.code, fa.raisonsociale AS nom
|
||||||
fi.code,
|
FROM fouadr1 fa
|
||||||
fi.nom
|
INNER JOIN artfou1 af ON af.code = fa.code
|
||||||
FROM fouident fi
|
WHERE fa.sit_code = '000'
|
||||||
INNER JOIN artfou1 af ON af.code = fi.code
|
AND fa.raisonsociale IS NOT NULL
|
||||||
WHERE fi.actif = true
|
AND fa.raisonsociale !~ '^\s*\d'
|
||||||
AND fi.suspendu = false
|
${search ? sql`AND (fa.raisonsociale ILIKE ${'%' + search + '%'} OR fa.code ILIKE ${'%' + search + '%'})` : sql``}
|
||||||
AND fi.code IS NOT NULL
|
ORDER BY fa.raisonsociale
|
||||||
AND fi.nom IS NOT NULL
|
|
||||||
${search ? sql`AND (fi.nom ILIKE ${'%' + search + '%'} OR fi.code ILIKE ${'%' + search + '%'})` : sql``}
|
|
||||||
ORDER BY fi.nom
|
|
||||||
`);
|
`);
|
||||||
console.log(`[pg-ff] pgGetFournisseurs (fouident): ${result.rows.length} fournisseurs`);
|
console.log(`[pg-ff] pgGetFournisseurs: ${result.rows.length} fournisseurs`);
|
||||||
return (result.rows as unknown as { code: string; nom: string }[]).filter(r => r.code && r.nom);
|
return (result.rows as unknown as { code: string; nom: string }[]).filter(r => r.code && r.nom);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("[pg-ff] pgGetFournisseurs fouident error:", (e as Error).message?.slice(0, 200));
|
console.error("[pg-ff] pgGetFournisseurs error:", (e as Error).message?.slice(0, 200));
|
||||||
// Fallback : fouident inaccessible → fouadr1 avec artfou1
|
return [];
|
||||||
try {
|
|
||||||
const fallback = await db.execute(sql`
|
|
||||||
SELECT DISTINCT fa.code, fa.raisonsociale AS nom
|
|
||||||
FROM fouadr1 fa
|
|
||||||
INNER JOIN artfou1 af ON af.code = fa.code
|
|
||||||
WHERE fa.sit_code = '000'
|
|
||||||
AND fa.raisonsociale IS NOT NULL
|
|
||||||
AND fa.raisonsociale !~ '^\s*\d'
|
|
||||||
${search ? sql`AND (fa.raisonsociale ILIKE ${'%' + search + '%'} OR fa.code ILIKE ${'%' + search + '%'})` : sql``}
|
|
||||||
ORDER BY fa.raisonsociale
|
|
||||||
`);
|
|
||||||
return (fallback.rows as unknown as { code: string; nom: string }[]).filter(r => r.code && r.nom);
|
|
||||||
} catch (e2) {
|
|
||||||
console.error("[pg-ff] pgGetFournisseurs fallback error:", e2);
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user