Files
veille-ia-gen/app/src/routes/registre/[id]/+page.server.ts
T
cyber-mawonaj 6978fbb5b8 feat(app) : phase 2 — endpoint /api/alerts, inbox, flows Node-RED
- POST /api/alerts : token Bearer (comparaison temps constant, 503 si non
  configuré), schéma d'alerte PRD §4.4 validé Zod, exempté du SSO dans les hooks
- Persistance alertes.yaml + commits git (réception, « traité »)
- Inbox /alertes : filtres par profil impacté et statut, actions « Marquer
  traité » et « Créer/MAJ fiche » avec pré-remplissage du formulaire registre
  depuis l'alerte (aucun champ licence/capacité inventé)
- nodered-flows/ : 4 flows importables (rss-ingest, license-watch, classifier
  avec le prompt figé du PRD §6 embarqué tel quel, notify) — nœuds core
  uniquement, configuration par variables d'env, README de câblage
- Vérifié : check/lint/test (27) /build verts, autofixer propre, JSON des flows
  et fonctions embarquées validés, test fumée HTTP (201/400/401 sur l'endpoint,
  inbox, traité + commit, pré-remplissage MAJ fiche)
2026-08-01 10:40:18 -04:00

60 lines
2.2 KiB
TypeScript

import { error, fail, redirect } from '@sveltejs/kit';
import { modeleSchema } from '$lib/schemas';
import { erreursZod, modeleDepuisFormulaire } from '$lib/server/formulaires';
import { lireAlertes } from '$lib/server/alertes';
import { ecrireRegistre, lireRegistre } from '$lib/server/stockage';
import type { Actions, PageServerLoad } from './$types';
export const load: PageServerLoad = async ({ params, url }) => {
const registre = await lireRegistre();
const modele = registre.find((m) => m.id === params.id);
if (!modele) error(404, 'Modèle introuvable');
// Pré-remplissage depuis une alerte (action « Mettre à jour la fiche » de l'inbox) :
// fusionne les sources, préfixe les notes du résumé — sans toucher aux champs vérifiés.
const alerteId = url.searchParams.get('depuis_alerte');
let brut: Record<string, unknown> | null = null;
if (alerteId) {
const alertes = await lireAlertes();
const alerte = alertes.find((a) => a.id === alerteId);
if (alerte) {
brut = {
...modele,
sources: [...new Set([...modele.sources, ...alerte.sources])],
notes: `${alerte.resume}\n\n${modele.notes ?? ''}`.trim()
};
}
}
return { modele, brut };
};
export const actions: Actions = {
enregistrer: async ({ request, params }) => {
const data = await request.formData();
const brut = modeleDepuisFormulaire(data);
// L'identifiant d'un modèle existant n'est pas modifiable (champ readonly).
const resultat = modeleSchema.safeParse({ ...(brut as object), id: params.id });
if (!resultat.success) {
return fail(400, { erreurs: erreursZod(resultat.error), brut });
}
const registre = await lireRegistre();
const index = registre.findIndex((m) => m.id === params.id);
if (index === -1) error(404, 'Modèle introuvable');
registre[index] = resultat.data;
await ecrireRegistre(registre, `feat : mise à jour du modèle ${params.id}`);
redirect(303, '/registre');
},
supprimer: async ({ params }) => {
const registre = await lireRegistre();
const restant = registre.filter((m) => m.id !== params.id);
if (restant.length === registre.length) error(404, 'Modèle introuvable');
await ecrireRegistre(restant, `feat : suppression du modèle ${params.id}`);
redirect(303, '/registre');
}
};