import { NextRequest, NextResponse } from 'next/server' import { auth } from '@/auth' import { getChatProvider } from '@/lib/ai/factory' import { getSystemConfig } from '@/lib/config' import { hasUserAiConsent } from '@/lib/consent/server-consent' import { withAiQuota, handleQuotaHttpError } from '@/lib/ai-quota' export async function POST(request: NextRequest) { try { const session = await auth() if (!session?.user?.id) { return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }) } if (!(await hasUserAiConsent())) { return NextResponse.json({ error: 'ai_consent_required' }, { status: 403 }) } const { text } = await request.json() if (!text || typeof text !== 'string') { return NextResponse.json({ error: 'Text is required' }, { status: 400 }) } const wordCount = text.split(/\s+/).length if (wordCount < 10) { return NextResponse.json( { errorKey: 'ai.wordCountMin', params: { min: 10, current: wordCount } }, { status: 400 } ) } if (wordCount > 5000) { return NextResponse.json( { errorKey: 'ai.wordCountMax', params: { max: 5000, current: wordCount } }, { status: 400 } ) } const config = await getSystemConfig() const provider = getChatProvider(config) const hasFrench = /[àâäéèêëïîôùûüÿç]/i.test(text) const responseLanguage = hasFrench ? 'French' : 'English' const prompt = hasFrench ? `Tu es un expert en Markdown. Transforme ce texte ${responseLanguage} en Markdown bien formaté. IMPORTANT : - Ajoute des titres avec ## pour les sections principales - Utilise des listes à puces (-) ou numérotées (1.) quand approprié - Ajoute de l'emphase (gras **texte**, italique *texte*) pour les mots clés - Utilise des blocs de code pour le code ou les commandes - Présente l'information de manière claire et structurée - GARDE le même sens et le contenu, seul le format change Texte à transformer : ${text} Réponds SEULEMENT avec le texte transformé en Markdown, sans explications.` : `You are a Markdown expert. Transform this ${responseLanguage} text into well-formatted Markdown. IMPORTANT: - Add headings with ## for main sections - Use bullet lists (-) or numbered lists (1.) when appropriate - Add emphasis (bold **text**, italic *text*) for key terms - Use code blocks for code or commands - Present information clearly and structured - KEEP the same meaning and content, only change the format Text to transform: ${text} Respond ONLY with the transformed Markdown text, no explanations.` const transformedText = await withAiQuota( session.user.id, 'reformulate', () => provider.generateText(prompt), { lane: 'chat' }, ) return NextResponse.json({ originalText: text, transformedText, language: responseLanguage }) } catch (error: unknown) { const quotaResp = handleQuotaHttpError(error) if (quotaResp) return quotaResp const message = error instanceof Error ? error.message : 'Failed to transform text to Markdown' return NextResponse.json({ error: message }, { status: 500 }) } }