'use server' import { auth } from '@/auth' import { prisma } from '@/lib/prisma' import { revalidatePath } from 'next/cache' export type UserAISettingsData = { titleSuggestions?: boolean semanticSearch?: boolean paragraphRefactor?: boolean memoryEcho?: boolean memoryEchoFrequency?: 'daily' | 'weekly' | 'custom' aiProvider?: 'auto' | 'openai' | 'ollama' preferredLanguage?: 'auto' | 'en' | 'fr' | 'es' | 'de' | 'fa' | 'it' | 'pt' | 'ru' | 'zh' | 'ja' | 'ko' | 'ar' | 'hi' | 'nl' | 'pl' demoMode?: boolean } /** * Update AI settings for the current user */ export async function updateAISettings(settings: UserAISettingsData) { const session = await auth() if (!session?.user?.id) { throw new Error('Unauthorized') } try { // Upsert settings (create if not exists, update if exists) await prisma.userAISettings.upsert({ where: { userId: session.user.id }, create: { userId: session.user.id, ...settings }, update: settings }) revalidatePath('/settings/ai') revalidatePath('/') return { success: true } } catch (error) { console.error('Error updating AI settings:', error) throw new Error('Failed to update AI settings') } } /** * Get AI settings for the current user */ export async function getAISettings() { const session = await auth() // Return defaults for non-logged-in users if (!session?.user?.id) { return { titleSuggestions: true, semanticSearch: true, paragraphRefactor: true, memoryEcho: true, memoryEchoFrequency: 'daily' as const, aiProvider: 'auto' as const, preferredLanguage: 'auto' as const, demoMode: false } } try { const settings = await prisma.userAISettings.findUnique({ where: { userId: session.user.id } }) // Return settings or defaults if not found if (!settings) { return { titleSuggestions: true, semanticSearch: true, paragraphRefactor: true, memoryEcho: true, memoryEchoFrequency: 'daily' as const, aiProvider: 'auto' as const, preferredLanguage: 'auto' as const, demoMode: false } } // Type-cast database values to proper union types return { titleSuggestions: settings.titleSuggestions, semanticSearch: settings.semanticSearch, paragraphRefactor: settings.paragraphRefactor, memoryEcho: settings.memoryEcho, memoryEchoFrequency: (settings.memoryEchoFrequency || 'daily') as 'daily' | 'weekly' | 'custom', aiProvider: (settings.aiProvider || 'auto') as 'auto' | 'openai' | 'ollama', preferredLanguage: (settings.preferredLanguage || 'auto') as 'auto' | 'en' | 'fr' | 'es' | 'de' | 'fa' | 'it' | 'pt' | 'ru' | 'zh' | 'ja' | 'ko' | 'ar' | 'hi' | 'nl' | 'pl', demoMode: settings.demoMode || false } } catch (error) { console.error('Error getting AI settings:', error) // Return defaults on error return { titleSuggestions: true, semanticSearch: true, paragraphRefactor: true, memoryEcho: true, memoryEchoFrequency: 'daily' as const, aiProvider: 'auto' as const, preferredLanguage: 'auto' as const, demoMode: false } } } /** * Get user's preferred AI provider */ export async function getUserAIPreference(): Promise<'auto' | 'openai' | 'ollama'> { const settings = await getAISettings() return settings.aiProvider } /** * Check if a specific AI feature is enabled for the user */ export async function isAIFeatureEnabled(feature: keyof UserAISettingsData): Promise { const settings = await getAISettings() switch (feature) { case 'titleSuggestions': return settings.titleSuggestions case 'semanticSearch': return settings.semanticSearch case 'paragraphRefactor': return settings.paragraphRefactor case 'memoryEcho': return settings.memoryEcho default: return true } }