feat: add danger zone to settings

This commit is contained in:
Vasily Zubarev
2025-04-24 21:33:39 +02:00
parent 088d596480
commit 1fe0cc25a7
5 changed files with 120 additions and 6 deletions

View File

@@ -0,0 +1,59 @@
"use server"
import { prisma } from "@/lib/db"
import { DEFAULT_CATEGORIES, DEFAULT_CURRENCIES, DEFAULT_FIELDS, DEFAULT_SETTINGS } from "@/models/defaults"
import { User } from "@prisma/client"
import { redirect } from "next/navigation"
export async function resetLLMSettings(user: User) {
const llmSettings = DEFAULT_SETTINGS.filter((setting) => setting.code === "prompt_analyse_new_file")
for (const setting of llmSettings) {
await prisma.setting.upsert({
where: { userId_code: { code: setting.code, userId: user.id } },
update: { value: setting.value },
create: { ...setting, userId: user.id },
})
}
redirect("/settings/llm")
}
export async function resetFieldsAndCategories(user: User) {
// Reset categories
for (const category of DEFAULT_CATEGORIES) {
await prisma.category.upsert({
where: { userId_code: { code: category.code, userId: user.id } },
update: { name: category.name, color: category.color, llm_prompt: category.llm_prompt },
create: { ...category, userId: user.id },
})
}
// Reset currencies
for (const currency of DEFAULT_CURRENCIES) {
await prisma.currency.upsert({
where: { userId_code: { code: currency.code, userId: user.id } },
update: { name: currency.name },
create: { ...currency, userId: user.id },
})
}
// Reset fields
for (const field of DEFAULT_FIELDS) {
await prisma.field.upsert({
where: { userId_code: { code: field.code, userId: user.id } },
update: {
name: field.name,
type: field.type,
llm_prompt: field.llm_prompt,
isVisibleInList: field.isVisibleInList,
isVisibleInAnalysis: field.isVisibleInAnalysis,
isRequired: field.isRequired,
isExtra: field.isExtra,
},
create: { ...field, userId: user.id },
})
}
redirect("/settings/fields")
}

View File

@@ -0,0 +1,51 @@
import { Button } from "@/components/ui/button"
import { getCurrentUser } from "@/lib/auth"
import { resetFieldsAndCategories, resetLLMSettings } from "./actions"
export default async function DangerSettingsPage() {
const user = await getCurrentUser()
return (
<div className="container">
<h1 className="text-2xl font-bold mb-2 text-red-500">The Danger Zone</h1>
<p className="text-sm text-red-400 mb-8 max-w-prose">
The settings here will overwrite your existing fields, categories and prompts. Use them only if something is
broken.
</p>
<div className="space-y-10">
<div className="space-y-2">
<h3 className="text-lg font-bold">LLM settings</h3>
<p className="text-sm text-gray-500 mb-6 max-w-prose">
This will reset the system prompt and other LLM settings to their default values
</p>
<form
action={async () => {
"use server"
await resetLLMSettings(user)
}}
>
<Button variant="destructive" type="submit">
Reset main LLM prompt
</Button>
</form>
</div>
<div className="space-y-2">
<h3 className="text-lg font-bold">Fields, currencies and categories</h3>
<p className="text-sm text-gray-500 mb-6 max-w-prose">
This will reset all fields, currencies and categories to their default values
</p>
<form
action={async () => {
"use server"
await resetFieldsAndCategories(user)
}}
>
<Button variant="destructive" type="submit">
Reset fields, currencies and categories
</Button>
</form>
</div>
</div>
</div>
)
}

View File

@@ -40,6 +40,10 @@ const settingsCategories = [
title: "Backups",
href: "/settings/backups",
},
{
title: "Danger Zone",
href: "/settings/danger",
},
]
export default function SettingsLayout({ children }: { children: React.ReactNode }) {