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:
73
server/db.ts
73
server/db.ts
@@ -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,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user