- 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>
53 lines
2.0 KiB
TypeScript
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 });
|
|
}
|
|
}
|