'use server' import prisma from '@/lib/prisma' import { auth } from '@/auth' import { sendEmail } from '@/lib/mail' async function checkAdmin() { const session = await auth() if (!session?.user?.id || (session.user as any).role !== 'ADMIN') { throw new Error('Unauthorized: Admin access required') } return session } export async function testEmail(provider: 'resend' | 'smtp' = 'smtp') { const session = await checkAdmin() const email = session.user?.email if (!email) throw new Error("No admin email found") const subject = provider === 'resend' ? "Memento Resend Test" : "Memento SMTP Test" const html = provider === 'resend' ? "

This is a test email from your Memento instance. Resend is working!

" : "

This is a test email from your Memento instance. SMTP is working!

" const result = await sendEmail({ to: email, subject, html, }, provider) return result } export async function getSystemConfig() { await checkAdmin() // Reuse the cached version from lib/config const { getSystemConfig: getCachedConfig } = await import('@/lib/config') return getCachedConfig() } /** Keys that may be cleared (empty string) to fall back to chat / defaults. */ const CLEARABLE_CONFIG_KEYS = new Set([ 'AI_PROVIDER_SLIDES', 'AI_MODEL_SLIDES', ]) export async function updateSystemConfig(data: Record) { await checkAdmin() try { // Filter out empty values but keep 'false' as valid. // Slides provider/model may be empty intentionally (= use Chat fallback). const toUpsert: Record = {} const toDelete: string[] = [] for (const [key, value] of Object.entries(data)) { if (value === null || value === undefined) continue if (value === '' && CLEARABLE_CONFIG_KEYS.has(key)) { toDelete.push(key) continue } if (value === '') continue toUpsert[key] = value } const operations = [ ...Object.entries(toUpsert).map(([key, value]) => prisma.systemConfig.upsert({ where: { key }, update: { value }, create: { key, value }, }), ), ...toDelete.map((key) => prisma.systemConfig.deleteMany({ where: { key } }), ), ] if (operations.length > 0) { await prisma.$transaction(operations) } return { success: true } } catch (error) { console.error('Failed to update settings:', error) return { error: 'Failed to update settings' } } }