"use server" import { categoryFormSchema, currencyFormSchema, fieldFormSchema, projectFormSchema, settingsFormSchema, } from "@/forms/settings" import { userFormSchema } from "@/forms/users" import { getCurrentUser } from "@/lib/auth" import { codeFromName, randomHexColor } from "@/lib/utils" import { createCategory, deleteCategory, updateCategory } from "@/models/categories" import { createCurrency, deleteCurrency, updateCurrency } from "@/models/currencies" import { createField, deleteField, updateField } from "@/models/fields" import { createProject, deleteProject, updateProject } from "@/models/projects" import { updateSettings } from "@/models/settings" import { updateUser } from "@/models/users" import { Prisma } from "@prisma/client" import { revalidatePath } from "next/cache" import { redirect } from "next/navigation" export async function saveSettingsAction(prevState: any, formData: FormData) { const user = await getCurrentUser() const validatedForm = settingsFormSchema.safeParse(Object.fromEntries(formData)) if (!validatedForm.success) { return { success: false, error: validatedForm.error.message } } for (const key in validatedForm.data) { await updateSettings(user.id, key, validatedForm.data[key as keyof typeof validatedForm.data]) } revalidatePath("/settings") redirect("/settings") // return { success: true } } export async function saveProfileAction(prevState: any, formData: FormData) { const user = await getCurrentUser() const validatedForm = userFormSchema.safeParse(Object.fromEntries(formData)) if (!validatedForm.success) { return { success: false, error: validatedForm.error.message } } await updateUser(user.id, { name: validatedForm.data.name, }) revalidatePath("/settings/profile") redirect("/settings/profile") } export async function addProjectAction(userId: string, data: Prisma.ProjectCreateInput) { const validatedForm = projectFormSchema.safeParse(data) if (!validatedForm.success) { return { success: false, error: validatedForm.error.message } } const project = await createProject(userId, { code: codeFromName(validatedForm.data.name), name: validatedForm.data.name, llm_prompt: validatedForm.data.llm_prompt || null, color: validatedForm.data.color || randomHexColor(), }) revalidatePath("/settings/projects") return { success: true, project } } export async function editProjectAction(userId: string, code: string, data: Prisma.ProjectUpdateInput) { const validatedForm = projectFormSchema.safeParse(data) if (!validatedForm.success) { return { success: false, error: validatedForm.error.message } } const project = await updateProject(userId, code, { name: validatedForm.data.name, llm_prompt: validatedForm.data.llm_prompt, color: validatedForm.data.color || "", }) revalidatePath("/settings/projects") return { success: true, project } } export async function deleteProjectAction(userId: string, code: string) { try { await deleteProject(userId, code) } catch (error) { return { success: false, error: "Failed to delete project" + error } } revalidatePath("/settings/projects") return { success: true } } export async function addCurrencyAction(userId: string, data: Prisma.CurrencyCreateInput) { const validatedForm = currencyFormSchema.safeParse(data) if (!validatedForm.success) { return { success: false, error: validatedForm.error.message } } const currency = await createCurrency(userId, { code: validatedForm.data.code, name: validatedForm.data.name, }) revalidatePath("/settings/currencies") return { success: true, currency } } export async function editCurrencyAction(userId: string, code: string, data: Prisma.CurrencyUpdateInput) { const validatedForm = currencyFormSchema.safeParse(data) if (!validatedForm.success) { return { success: false, error: validatedForm.error.message } } const currency = await updateCurrency(userId, code, { name: validatedForm.data.name }) revalidatePath("/settings/currencies") return { success: true, currency } } export async function deleteCurrencyAction(userId: string, code: string) { try { await deleteCurrency(userId, code) } catch (error) { return { success: false, error: "Failed to delete currency" + error } } revalidatePath("/settings/currencies") return { success: true } } export async function addCategoryAction(userId: string, data: Prisma.CategoryCreateInput) { const validatedForm = categoryFormSchema.safeParse(data) if (!validatedForm.success) { return { success: false, error: validatedForm.error.message } } const category = await createCategory(userId, { code: codeFromName(validatedForm.data.name), name: validatedForm.data.name, llm_prompt: validatedForm.data.llm_prompt, color: validatedForm.data.color || "", }) revalidatePath("/settings/categories") return { success: true, category } } export async function editCategoryAction(userId: string, code: string, data: Prisma.CategoryUpdateInput) { const validatedForm = categoryFormSchema.safeParse(data) if (!validatedForm.success) { return { success: false, error: validatedForm.error.message } } const category = await updateCategory(userId, code, { name: validatedForm.data.name, llm_prompt: validatedForm.data.llm_prompt, color: validatedForm.data.color || "", }) revalidatePath("/settings/categories") return { success: true, category } } export async function deleteCategoryAction(userId: string, code: string) { try { await deleteCategory(userId, code) } catch (error) { return { success: false, error: "Failed to delete category" + error } } revalidatePath("/settings/categories") return { success: true } } export async function addFieldAction(userId: string, data: Prisma.FieldCreateInput) { const validatedForm = fieldFormSchema.safeParse(data) if (!validatedForm.success) { return { success: false, error: validatedForm.error.message } } const field = await createField(userId, { code: codeFromName(validatedForm.data.name), name: validatedForm.data.name, type: validatedForm.data.type, llm_prompt: validatedForm.data.llm_prompt, isVisibleInList: validatedForm.data.isVisibleInList, isVisibleInAnalysis: validatedForm.data.isVisibleInAnalysis, isExtra: true, }) revalidatePath("/settings/fields") return { success: true, field } } export async function editFieldAction(userId: string, code: string, data: Prisma.FieldUpdateInput) { const validatedForm = fieldFormSchema.safeParse(data) if (!validatedForm.success) { return { success: false, error: validatedForm.error.message } } const field = await updateField(userId, code, { name: validatedForm.data.name, type: validatedForm.data.type, llm_prompt: validatedForm.data.llm_prompt, isVisibleInList: validatedForm.data.isVisibleInList, isVisibleInAnalysis: validatedForm.data.isVisibleInAnalysis, }) revalidatePath("/settings/fields") return { success: true, field } } export async function deleteFieldAction(userId: string, code: string) { try { await deleteField(userId, code) } catch (error) { return { success: false, error: "Failed to delete field" + error } } revalidatePath("/settings/fields") return { success: true } }