Checkpoint: Ajout de la page de gestion des flux RSS : liste des flux, formulaire d'ajout/édition avec type (Veille/AAP), type par défaut, règles d'automatisme par mots-clés, paramètres de fréquence (heure fixe ou intervalle), activation/désactivation. Tables BDD rss_feeds et rss_settings. Procédures tRPC complètes. Navigation sidebar mise à jour.

This commit is contained in:
Manus
2026-04-25 16:44:09 -04:00
parent 4a17eaa04a
commit c3e1720e83
11 changed files with 1958 additions and 5 deletions

View File

@@ -11,6 +11,12 @@ import {
InsertLocalUser,
ideas,
InsertIdea,
rssFeeds,
rssSettings,
type InsertRssFeed,
type InsertRssSettings,
type RssFeed,
type RssSettings,
} from "../drizzle/schema";
import { ENV } from "./_core/env";
@@ -360,3 +366,70 @@ export async function updateIdeaStatut(id: number, statut: "ouvert" | "en_cours"
if (!db) throw new Error("Database not available");
await db.update(ideas).set({ statut }).where(eq(ideas.id, id));
}
// ─── Flux RSS ────────────────────────────────────────────────────────────────────────────────────
export async function getRssFeeds(): Promise<RssFeed[]> {
const db = await getDb();
if (!db) return [];
return db.select().from(rssFeeds).orderBy(rssFeeds.name);
}
export async function getRssFeedById(id: number): Promise<RssFeed | null> {
const db = await getDb();
if (!db) return null;
const rows = await db.select().from(rssFeeds).where(eq(rssFeeds.id, id)).limit(1);
return rows[0] ?? null;
}
export async function createRssFeed(data: Omit<InsertRssFeed, "id" | "createdAt" | "updatedAt">): Promise<number> {
const db = await getDb();
if (!db) throw new Error("Database not available");
const result = await db.insert(rssFeeds).values(data);
return (result[0] as any).insertId as number;
}
export async function updateRssFeed(id: number, data: Partial<Omit<InsertRssFeed, "id" | "createdAt" | "updatedAt">>): Promise<void> {
const db = await getDb();
if (!db) throw new Error("Database not available");
await db.update(rssFeeds).set(data).where(eq(rssFeeds.id, id));
}
export async function deleteRssFeed(id: number): Promise<void> {
const db = await getDb();
if (!db) throw new Error("Database not available");
await db.delete(rssFeeds).where(eq(rssFeeds.id, id));
}
export async function getRssSettings(): Promise<RssSettings | null> {
const db = await getDb();
if (!db) return null;
const rows = await db.select().from(rssSettings).limit(1);
if (rows.length > 0) return rows[0];
// Créer les paramètres par défaut si inexistants
await db.insert(rssSettings).values({
fetchIntervalMinutes: 360,
scheduledTime: "06:00",
fetchMode: "scheduled",
autoFetchEnabled: true,
});
const newRows = await db.select().from(rssSettings).limit(1);
return newRows[0] ?? null;
}
export async function saveRssSettings(data: Partial<Omit<InsertRssSettings, "id" | "updatedAt">>): Promise<void> {
const db = await getDb();
if (!db) throw new Error("Database not available");
const existing = await db.select().from(rssSettings).limit(1);
if (existing.length > 0) {
await db.update(rssSettings).set(data).where(eq(rssSettings.id, existing[0].id));
} else {
await db.insert(rssSettings).values({
fetchIntervalMinutes: 360,
scheduledTime: "06:00",
fetchMode: "scheduled",
autoFetchEnabled: true,
...data,
});
}
}