feat: add config API with encrypted secret storage
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
import { prisma } from "@/lib/db";
|
||||
import { encryptSecret } from "@/lib/crypto";
|
||||
|
||||
// settings field -> (config key, is secret)
|
||||
const FIELDS: Record<string, { key: string; secret: boolean }> = {
|
||||
qobuzEmail: { key: "qobuz.email", secret: false },
|
||||
qobuzPassword: { key: "qobuz.password", secret: true },
|
||||
slskdUrl: { key: "slskd.url", secret: false },
|
||||
slskdApiKey: { key: "slskd.api_key", secret: true },
|
||||
};
|
||||
|
||||
export async function PUT(request: Request) {
|
||||
let body: Record<string, unknown>;
|
||||
try {
|
||||
body = (await request.json()) as Record<string, unknown>;
|
||||
} catch {
|
||||
return Response.json({ error: "invalid JSON" }, { status: 400 });
|
||||
}
|
||||
|
||||
for (const [field, { key, secret }] of Object.entries(FIELDS)) {
|
||||
const raw = body[field];
|
||||
if (typeof raw !== "string" || raw === "") continue; // absent or "unchanged"
|
||||
const value = secret ? encryptSecret(raw) : raw;
|
||||
await prisma.config.upsert({
|
||||
where: { key },
|
||||
create: { key, value, secret },
|
||||
update: { value, secret },
|
||||
});
|
||||
}
|
||||
|
||||
return Response.json({ ok: true });
|
||||
}
|
||||
|
||||
export async function GET() {
|
||||
const rows = await prisma.config.findMany();
|
||||
const byKey = new Map(rows.map((r) => [r.key, r]));
|
||||
return Response.json({
|
||||
qobuzEmail: byKey.get("qobuz.email")?.value ?? "",
|
||||
slskdUrl: byKey.get("slskd.url")?.value ?? "",
|
||||
qobuzPasswordSet: byKey.has("qobuz.password"),
|
||||
slskdApiKeySet: byKey.has("slskd.api_key"),
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user