import { Router } from "express"; import { createHash, randomBytes } from "crypto"; import { requireJwtAuth } from "./auth"; import { db, apiKeysTable } from "@workspace/db"; import { eq, and } from "drizzle-orm"; const router = Router(); router.get("/", requireJwtAuth, async (req: any, res) => { const keys = await db .select({ id: apiKeysTable.id, name: apiKeysTable.name, keyPrefix: apiKeysTable.keyPrefix, createdAt: apiKeysTable.createdAt, lastUsedAt: apiKeysTable.lastUsedAt, }) .from(apiKeysTable) .where(eq(apiKeysTable.userId, String(req.jwtUserId))); res.json({ keys }); }); router.post("/", requireJwtAuth, async (req: any, res) => { const name = (req.body?.name as string)?.trim() || "Default Key"; const rawKey = `sk-sf-${randomBytes(24).toString("hex")}`; const keyHash = createHash("sha256").update(rawKey).digest("hex"); const keyPrefix = rawKey.slice(0, 12) + "..."; const [inserted] = await db .insert(apiKeysTable) .values({ userId: String(req.jwtUserId), keyHash, keyPrefix, name }) .returning({ id: apiKeysTable.id, name: apiKeysTable.name, keyPrefix: apiKeysTable.keyPrefix, createdAt: apiKeysTable.createdAt, }); res.json({ key: rawKey, ...inserted }); }); router.delete("/:id", requireJwtAuth, async (req: any, res) => { const id = Number(req.params.id); if (isNaN(id)) return res.status(400).json({ error: "Invalid ID" }); const deleted = await db .delete(apiKeysTable) .where(and(eq(apiKeysTable.id, id), eq(apiKeysTable.userId, String(req.jwtUserId)))) .returning(); if (!deleted.length) return res.status(404).json({ error: "Not found" }); res.json({ success: true }); }); export default router;