Checkpoint: Moteur RSS : server/rssEngine.ts (parseur RSS/Atom, règles d'automatisme, déduplication), server/scheduledRoutes.ts (endpoint POST /api/scheduled/rss-fetch), montage dans _core/index.ts
This commit is contained in:
62
server/scheduledRoutes.ts
Normal file
62
server/scheduledRoutes.ts
Normal file
@@ -0,0 +1,62 @@
|
||||
/**
|
||||
* Routes pour les tâches planifiées.
|
||||
* POST /api/scheduled/rss-fetch — déclenche la lecture de tous les flux RSS actifs.
|
||||
* Protégé par cookie de session (rôle "user" minimum, conforme aux tâches planifiées Manus).
|
||||
*/
|
||||
import express, { Router, Request, Response } from "express";
|
||||
import { parse as parseCookieHeader } from "cookie";
|
||||
import { verifyLocalToken, LOCAL_AUTH_COOKIE } from "./localAuth";
|
||||
import { sdk } from "./_core/sdk";
|
||||
import { runRssFetch } from "./rssEngine";
|
||||
|
||||
const router: Router = express.Router();
|
||||
|
||||
/**
|
||||
* Middleware d'authentification léger :
|
||||
* accepte soit un cookie veille_local_auth (utilisateurs locaux),
|
||||
* soit un cookie Manus OAuth (app_session_id via sdk.authenticateRequest).
|
||||
*/
|
||||
async function requireAuth(req: Request, res: Response, next: () => void) {
|
||||
try {
|
||||
const cookieHeader = req.headers.cookie ?? "";
|
||||
const cookies = parseCookieHeader(cookieHeader);
|
||||
|
||||
// 1. Cookie local
|
||||
const localToken = cookies[LOCAL_AUTH_COOKIE];
|
||||
if (localToken) {
|
||||
const user = await verifyLocalToken(localToken);
|
||||
if (user) return next();
|
||||
}
|
||||
|
||||
// 2. Cookie Manus OAuth
|
||||
try {
|
||||
await sdk.authenticateRequest(req);
|
||||
return next();
|
||||
} catch (_) { /* pas de session OAuth valide */ }
|
||||
|
||||
res.status(401).json({ error: "Non authentifié" });
|
||||
} catch (e) {
|
||||
res.status(401).json({ error: "Erreur d'authentification" });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* POST /api/scheduled/rss-fetch
|
||||
* Déclenche la lecture de tous les flux RSS actifs et insère les nouveaux articles.
|
||||
*/
|
||||
router.post("/api/scheduled/rss-fetch", requireAuth, async (req: Request, res: Response) => {
|
||||
console.log("[Scheduled] Déclenchement de la lecture RSS...");
|
||||
try {
|
||||
const summary = await runRssFetch();
|
||||
res.json({
|
||||
success: true,
|
||||
summary,
|
||||
});
|
||||
} catch (e: unknown) {
|
||||
const msg = e instanceof Error ? e.message : String(e);
|
||||
console.error("[Scheduled/rss-fetch] Erreur:", msg);
|
||||
res.status(500).json({ success: false, error: msg });
|
||||
}
|
||||
});
|
||||
|
||||
export default router;
|
||||
Reference in New Issue
Block a user