Files
Timo Uttenweiler ea93d674a2 feat: API Keys via Umgebungsvariablen konfigurierbar
- Neuer getApiKey() Helper: prüft zuerst ENV-Vars, dann DB
- Alle Job-Routes nutzen getApiKey() statt direktem DB-Lookup
- Credentials-Status berücksichtigt ENV-Vars (Sidebar-Haken)
- .env.local.example: Platzhalter für alle 4 API Keys

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 13:58:41 +01:00

53 lines
2.0 KiB
TypeScript

import { NextRequest, NextResponse } from "next/server";
import { prisma } from "@/lib/db";
import { encrypt, decrypt } from "@/lib/utils/encryption";
import { hasApiKeyFromEnv } from "@/lib/utils/apiKey";
const SERVICES = ["anymailfinder", "apify", "vayne", "airscale", "googlemaps"] as const;
export async function GET() {
try {
const creds = await prisma.apiCredential.findMany();
const result: Record<string, boolean> = {};
for (const svc of SERVICES) {
result[svc] = hasApiKeyFromEnv(svc) || creds.some(c => c.service === svc && c.value);
}
return NextResponse.json(result);
} catch (err) {
console.error("GET /api/credentials error:", err);
return NextResponse.json({ anymailfinder: false, apify: false, vayne: false, airscale: false, googlemaps: false });
}
}
export async function POST(req: NextRequest) {
try {
const body = await req.json() as Record<string, string>;
for (const [service, value] of Object.entries(body)) {
if (!SERVICES.includes(service as typeof SERVICES[number])) continue;
if (value === null || value === undefined) continue;
await prisma.apiCredential.upsert({
where: { service },
create: { service, value: value ? encrypt(value) : "" },
update: { value: value ? encrypt(value) : "" },
});
}
return NextResponse.json({ ok: true });
} catch (err) {
console.error("POST /api/credentials error:", err);
return NextResponse.json({ error: "Failed to save credentials" }, { status: 500 });
}
}
// GET a specific decrypted value (for internal API use only)
export async function PUT(req: NextRequest) {
try {
const { service } = await req.json() as { service: string };
const cred = await prisma.apiCredential.findUnique({ where: { service } });
if (!cred) return NextResponse.json({ value: null });
return NextResponse.json({ value: decrypt(cred.value) });
} catch (err) {
console.error("PUT /api/credentials error:", err);
return NextResponse.json({ error: "Failed" }, { status: 500 });
}
}