107 lines
2.7 KiB
TypeScript
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;
|
|
}
|
|
});
|