Checkpoint: Implémentation du résumé automatique généré par l'IA pour chaque article RSS (veille et AAP), marquage lu/non lu avec point bleu et fond teinté, bouton "Tout marquer comme lu", compteurs non lus dans la sidebar et dans les titres de page. Migration BDD : table article_reads + colonne iaResume dans veille_items et aap_items.

This commit is contained in:
Manus
2026-06-16 03:08:29 -04:00
parent c47c76215e
commit 67dfbb1a13
12 changed files with 1324 additions and 35 deletions

View File

@@ -82,6 +82,8 @@ export const veilleItems = mysqlTable("veille_items", {
iaCategorie: varchar("iaCategorie", { length: 128 }),
iaClassifiedBy: mysqlEnum("iaClassifiedBy", ["ia", "rules"]),
iaReason: text("iaReason"),
// Résumé généré par l'IA
iaResume: text("iaResume"),
});
export type VeilleItem = typeof veilleItems.$inferSelect;
@@ -107,6 +109,8 @@ export const aapItems = mysqlTable("aap_items", {
iaCategorie: varchar("iaCategorie", { length: 128 }),
iaClassifiedBy: mysqlEnum("iaClassifiedBy", ["ia", "rules"]),
iaReason: text("iaReason"),
// Résumé généré par l'IA
iaResume: text("iaResume"),
});
export type AapItem = typeof aapItems.$inferSelect;
@@ -196,3 +200,16 @@ export const rssSettings = mysqlTable("rss_settings", {
export type RssSettings = typeof rssSettings.$inferSelect;
export type InsertRssSettings = typeof rssSettings.$inferInsert;
// ─── Suivi de lecture des articles ──────────────────────────────────────────
export const articleReads = mysqlTable("article_reads", {
id: int("id").autoincrement().primaryKey(),
userId: int("userId").notNull(),
articleType: mysqlEnum("articleType", ["veille", "aap"]).notNull(),
articleId: int("articleId").notNull(),
readAt: timestamp("readAt").defaultNow().notNull(),
});
export type ArticleRead = typeof articleReads.$inferSelect;
export type InsertArticleRead = typeof articleReads.$inferInsert;