feat(flashcards): révision SM-2, génération IA et page /revision
Some checks failed
CI / Lint, Test & Build (push) Failing after 32s
CI / Deploy production (on server) (push) Has been skipped

Livre US-FLASHCARDS avec decks, session de révision, stats et migration Prisma. Finalise le Web Clipper (i18n 15 langues) et corrige les erreurs ESLint bloquant la CI.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Antigravity
2026-05-24 19:22:20 +00:00
parent 8697ae244f
commit 36336e6b0d
50 changed files with 7687 additions and 98 deletions

View File

@@ -0,0 +1,55 @@
import prisma from '@/lib/prisma'
export async function getOrCreateDeckForNotebook(params: {
userId: string
notebookId: string | null
notebookName?: string | null
manualName?: string
}) {
const { userId, notebookId, notebookName, manualName } = params
if (notebookId) {
const existing = await prisma.flashcardDeck.findFirst({
where: { userId, notebookId },
})
if (existing) return existing
const notebook = await prisma.notebook.findFirst({
where: { id: notebookId, userId },
select: { name: true },
})
if (!notebook) {
throw new Error('Notebook not found')
}
return prisma.flashcardDeck.create({
data: {
userId,
notebookId,
name: notebook.name,
},
})
}
const name = (manualName || notebookName || 'Deck').trim().slice(0, 120)
if (!name) {
throw new Error('Deck name required')
}
return prisma.flashcardDeck.create({
data: {
userId,
name,
},
})
}
export function stripHtmlToText(html: string): string {
return html
.replace(/<script[\s\S]*?<\/script>/gi, ' ')
.replace(/<style[\s\S]*?<\/style>/gi, ' ')
.replace(/<[^>]+>/g, ' ')
.replace(/&nbsp;/g, ' ')
.replace(/\s+/g, ' ')
.trim()
}