diff --git a/apps/api/src/controllers/auth.ts b/apps/api/src/controllers/auth.ts index 5546bc17..552dd9b4 100644 --- a/apps/api/src/controllers/auth.ts +++ b/apps/api/src/controllers/auth.ts @@ -13,7 +13,7 @@ import { setTraceAttributes } from "@hyperdx/node-opentelemetry"; import { sendNotification } from "../services/notification/email_notification"; import { Logger } from "../lib/logger"; import { redlock } from "../services/redlock"; -import { getValue } from "../services/redis"; +import { deleteKey, getValue } from "../services/redis"; import { setValue } from "../services/redis"; import { validate } from "uuid"; import * as Sentry from "@sentry/node"; @@ -128,6 +128,13 @@ export async function getACUC( } } +export async function clearACUC( + api_key: string, +): Promise { + const cacheKeyACUC = `acuc_${api_key}`; + await deleteKey(cacheKeyACUC); +} + export async function authenticateUser( req, res, diff --git a/apps/api/src/controllers/v0/admin/acuc-cache-clear.ts b/apps/api/src/controllers/v0/admin/acuc-cache-clear.ts new file mode 100644 index 00000000..876ca98a --- /dev/null +++ b/apps/api/src/controllers/v0/admin/acuc-cache-clear.ts @@ -0,0 +1,22 @@ +import { Request, Response } from "express"; +import { supabase_service } from "../../../services/supabase"; +import { clearACUC } from "../../auth"; +import { Logger } from "../../../lib/logger"; + +export async function acucCacheClearController(req: Request, res: Response) { + try { + const team_id: string = req.body.team_id; + + const keys = await supabase_service + .from("api_keys") + .select("*") + .eq("team_id", team_id); + + await Promise.all(keys.data.map((x) => clearACUC(x.key))); + + res.json({ ok: true }); + } catch (error) { + Logger.error(`Error clearing ACUC cache via API route: ${error}`); + res.status(500).json({ error: "Internal server error" }); + } +} diff --git a/apps/api/src/routes/admin.ts b/apps/api/src/routes/admin.ts index 38611eac..88159060 100644 --- a/apps/api/src/routes/admin.ts +++ b/apps/api/src/routes/admin.ts @@ -6,6 +6,8 @@ import { cleanBefore24hCompleteJobsController, queuesController, } from "../controllers/v0/admin/queue"; +import { acucCacheClearController } from "../controllers/v0/admin/acuc-cache-clear"; +import { wrap } from "./v1"; export const adminRouter = express.Router(); @@ -33,3 +35,8 @@ adminRouter.get( `/admin/${process.env.BULL_AUTH_KEY}/autoscaler`, autoscalerController ); + +adminRouter.post( + `/admin/${process.env.BULL_AUTH_KEY}/acuc-cache-clear`, + wrap(acucCacheClearController), +); diff --git a/apps/api/src/routes/v1.ts b/apps/api/src/routes/v1.ts index 246f9b05..880ae885 100644 --- a/apps/api/src/routes/v1.ts +++ b/apps/api/src/routes/v1.ts @@ -94,7 +94,7 @@ function blocklistMiddleware(req: Request, res: Response, next: NextFunction) { next(); } -function wrap(controller: (req: Request, res: Response) => Promise): (req: Request, res: Response, next: NextFunction) => any { +export function wrap(controller: (req: Request, res: Response) => Promise): (req: Request, res: Response, next: NextFunction) => any { return (req, res, next) => { controller(req, res) .catch(err => next(err))