diff --git a/client/public/__manus__/version.json b/client/public/__manus__/version.json index 0b4a46e..b76fc12 100644 --- a/client/public/__manus__/version.json +++ b/client/public/__manus__/version.json @@ -1,4 +1,4 @@ { - "version": "3967f6c2", - "timestamp": 1782655834971 + "version": "598c445e", + "timestamp": 1782826461485 } \ No newline at end of file diff --git a/server/rssEngine.ts b/server/rssEngine.ts index e1e3b34..90f8289 100644 --- a/server/rssEngine.ts +++ b/server/rssEngine.ts @@ -48,50 +48,106 @@ interface FetchResult { newItems: number; skippedItems: number; mergedItems: number; - error?: string; + errorMessage?: string; } -// ─── Dictionnaire des départements d'Auvergne-Rhône-Alpes ──────────────────── -// IMPORTANT : les départements composés (Haute-Loire, Haute-Savoie, Puy-de-Dôme) -// doivent être AVANT leurs variantes simples (Loire, Savoie) pour éviter les faux positifs. +// ─── Dictionnaire des départements (AuRA, PACA, Nouvelle-Aquitaine, Occitanie, Bourgogne-FC) ────── +// IMPORTANT : les départements composés doivent être AVANT leurs variantes simples +// pour éviter les faux positifs (ex. Haute-Loire avant Loire). -const AURA_DEPARTMENTS: Array<{ pattern: RegExp; name: string; num: string }> = [ - // Composés en premier - { pattern: /haute-savoie|haute savoie|(? = [ + + // ─── AUVERGNE-RHÔNE-ALPES ───────────────────────────────────────────────────────────────── + { pattern: /haute-savoie|haute savoie|(? [ + d.name.toLowerCase(), + d.name.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""), + ]).concat([ "métropole de lyon", "metropole de lyon", "lyon", - "allier", - ]; + "marseille", "toulouse", "bordeaux", "montpellier", "nice", "dijon", "besançon", "besancon", + ]); // Protéger "auvergne-rhône-alpes" et "rhône-alpes" key = key.replace(/auvergne.?rh.?ne.?alpes/gi, "__AURA__"); @@ -189,14 +243,16 @@ export function detectVeilleCategorie(text: string): VeilleCategorie { /** * Déduit le niveau et le territoire d'un article de veille. + * Retourne le niveau le plus fin détecté : départemental > régional > national. */ export function detectVeilleNiveauTerritoire(text: string): { niveau: VeilleNiveau; territoire: string } { const dept = detectDepartment(text); if (dept) { return { niveau: "departemental", territoire: dept.name }; } - if (isRegional(text)) { - return { niveau: "regional", territoire: "Auvergne-Rhône-Alpes" }; + const region = detectRegion(text); + if (region) { + return { niveau: "regional", territoire: region }; } return { niveau: "national", territoire: "France" }; } @@ -205,21 +261,22 @@ export function detectVeilleNiveauTerritoire(text: string): { niveau: VeilleNive /** * Détecte le niveau de localisation le plus fin dans le texte : - * - Département AuRA si mentionné → region = "Auvergne-Rhône-Alpes", departement = "Nom (num)" - * - Région AuRA si mentionnée → region = "Auvergne-Rhône-Alpes", departement = null + * - Département connu → region = région du département, departement = "Nom (num)" + * - Région connue → region = nom de la région, departement = null * - Sinon → region = "National", departement = null */ export function detectAapGeo(text: string): { region: string; departement: string | null } { const dept = detectDepartment(text); if (dept) { return { - region: "Auvergne-Rhône-Alpes", + region: dept.region, departement: `${dept.name} (${dept.num})`, }; } - if (isRegional(text)) { + const region = detectRegion(text); + if (region) { return { - region: "Auvergne-Rhône-Alpes", + region, departement: null, }; } @@ -524,10 +581,10 @@ async function processFeed(feed: RssFeed): Promise { } catch (e: any) { result.status = "error"; - result.error = e?.message ?? String(e); + result.errorMessage = e?.message ?? String(e); try { await db.update(rssFeeds) - .set({ lastFetchedAt: new Date(), lastFetchStatus: "error", lastFetchError: result.error }) + .set({ lastFetchedAt: new Date(), lastFetchStatus: "error", lastFetchError: result.errorMessage }) .where(eq(rssFeeds.id, feed.id)); } catch (_) { /* ignore */ } }