import { prisma } from '@/db'; import { Setting } from '@/generated/prisma/client'; import { authMiddleware } from '@/lib/middleware'; import { createServerFn } from '@tanstack/react-start'; import { settingSchema, userSettingSchema } from './setting.schema'; // import { settingSchema } from './setting.schema'; type AdminSettingReturn = { [key: string]: Setting; }; // Settings for admin export const getAdminSettings = createServerFn({ method: 'GET' }) .middleware([authMiddleware]) .handler(async () => { const settings = await prisma.setting.findMany({ where: { relation: 'admin', }, }); const results: AdminSettingReturn = {}; settings.forEach((setting) => { results[setting.key] = setting; }); return results; }); export const updateAdminSettings = createServerFn({ method: 'POST' }) .inputValidator(settingSchema) .middleware([authMiddleware]) .handler(async ({ data }) => { // Update each setting const updates = Object.entries(data).map(([key, value]) => prisma.setting.upsert({ where: { key }, update: { value }, create: { key, value, description: key, // or provide proper descriptions relation: 'admin', }, }), ); await prisma.$transaction(updates); return { success: true }; }); // Setting for user type UserSetting = { language: string; }; export const getUserSettings = createServerFn({ method: 'GET' }) .middleware([authMiddleware]) .handler(async ({ context }) => { try { const settings = await prisma.setting.findUniqueOrThrow({ where: { relation: 'user', key: context.user.id, }, }); return { settings: settings as Setting, value: JSON.parse(settings.value) as UserSetting, }; } catch (error) { throw error; } }); export const updateUserSettings = createServerFn({ method: 'POST' }) .inputValidator(userSettingSchema) .middleware([authMiddleware]) .handler(async ({ data, context }) => { // Update each setting try { await prisma.setting.upsert({ where: { key: context.user.id }, update: { value: JSON.stringify(data) }, create: { key: context.user.id, value: JSON.stringify(data), description: 'User settings', // or provide proper descriptions relation: 'user', }, }); return { success: true }; } catch (error) { throw error; } });