Files
cfw-autumn/server/src/internal/dev/devRouter.ts

107 lines
2.7 KiB
TypeScript

import { withOrgAuth } from "@/middleware/authMiddleware.js";
import { AppEnv } from "@autumn/shared";
import { Router } from "express";
import { ApiKeyService } from "./ApiKeyService.js";
import { OrgService } from "../orgs/OrgService.js";
import { createKey } from "./api-keys/apiKeyUtils.js";
import { getSvixDashboardUrl } from "@/external/svix/svixHelpers.js";
import { handleRequestError } from "@/utils/errorUtils.js";
import { CacheManager } from "@/external/caching/CacheManager.js";
import { CacheType } from "@/external/caching/cacheActions.js";
import { routeHandler } from "@/utils/routerUtils.js";
export const devRouter: Router = Router();
devRouter.get("/data", withOrgAuth, async (req: any, res) => {
try {
const { db, env, orgId } = req;
const apiKeys = await ApiKeyService.getByOrg({
db,
orgId,
env,
});
const org = await OrgService.getFromReq(req);
const dashboardUrl = await getSvixDashboardUrl({
env: req.env,
org: org,
});
res.status(200).json({
api_keys: apiKeys,
org,
svix_dashboard_url: dashboardUrl,
});
} catch (error) {
handleRequestError({ error, req, res, action: "Get /dev/data" });
}
});
devRouter.post("/api_key", withOrgAuth, async (req: any, res) =>
routeHandler({
req,
res,
action: "Create API key",
handler: async (req: any, res: any) => {
const { db, env, orgId } = req;
const { name } = req.body;
// 1. Create API key
let prefix = "am_sk_test";
if (env === AppEnv.Live) {
prefix = "am_sk_live";
}
const apiKey = await createKey({
db,
env,
name,
orgId,
prefix,
meta: {},
});
res.status(200).json({
api_key: apiKey,
});
},
}),
);
devRouter.delete("/api_key/:id", withOrgAuth, async (req: any, res) => {
try {
const { db, orgId } = req;
const { id } = req.params;
let data = await ApiKeyService.delete({
db,
id,
orgId,
});
if (data.length === 0) {
console.error("API key not found");
res.status(404).json({ error: "API key not found" });
return;
}
let batchInvalidate = [];
for (let apiKey of data) {
batchInvalidate.push(
CacheManager.invalidate({
action: CacheType.SecretKey,
value: apiKey.hashed_key!,
}),
);
}
await Promise.all(batchInvalidate);
res
.status(200)
.json({ message: "API key deleted", code: "api_key_deleted" });
} catch (error) {
console.error("Failed to delete API key", error);
res.status(500).json({ error: "Failed to delete API key" });
return;
}
});