From 1b2d2887af5d2a7e3a75aa221163548da55fb600 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Thu, 20 Aug 2026 13:35:11 -0700 Subject: [PATCH] add proxy routes/controller --- server/src/api/controllers/proxyController.ts | 79 +++++++++++++++++++ server/src/api/routes/proxyRoutes.ts | 12 +++ server/src/config/controllers.ts | 3 + server/src/config/routes.ts | 3 + 4 files changed, 97 insertions(+) create mode 100644 server/src/api/controllers/proxyController.ts create mode 100644 server/src/api/routes/proxyRoutes.ts diff --git a/server/src/api/controllers/proxyController.ts b/server/src/api/controllers/proxyController.ts new file mode 100644 index 000000000..0ca72ed95 --- /dev/null +++ b/server/src/api/controllers/proxyController.ts @@ -0,0 +1,79 @@ +import { Request, Response, RequestHandler } from "express"; +import { catchAsync } from "@/utils/catchAsync.js"; +import { IProxiesService } from "@/domain/proxies/proxy.service.js"; +import { requireTeamId } from "./controllerUtils.js"; +import { + createProxyBodyValidation, + editProxyBodyValidation, + getProxyByIdParamValidation, + editProxyParamValidation, + deleteProxyParamValidation, +} from "@/api/validation/index.js"; + +export interface IProxiesController { + createProxy: RequestHandler; + getProxyById: RequestHandler; + getProxiesByTeamId: RequestHandler; + editProxy: RequestHandler; + deleteProxy: RequestHandler; +} + +class ProxyController implements IProxiesController { + constructor(private proxiesService: IProxiesService) {} + + createProxy = catchAsync(async (req: Request, res: Response) => { + const validatedBody = createProxyBodyValidation.parse(req.body); + const teamId = requireTeamId(req.user?.teamId); + + const proxy = await this.proxiesService.createProxy(validatedBody, teamId); + return res.status(200).json({ + success: true, + msg: "Proxy created successfully", + data: proxy, + }); + }); + getProxyById = catchAsync(async (req: Request, res: Response) => { + const teamId = requireTeamId(req.user?.teamId); + const { id: proxyId } = getProxyByIdParamValidation.parse(req.params); + const proxy = await this.proxiesService.getProxy(proxyId, teamId); + return res.status(200).json({ + success: true, + msg: "Proxy retrieved successfully", + data: proxy, + }); + }); + + getProxiesByTeamId = catchAsync(async (req: Request, res: Response) => { + const teamId = requireTeamId(req.user?.teamId); + const proxies = await this.proxiesService.getProxiesByTeamId(teamId); + return res.status(200).json({ + success: true, + msg: "Proxies retrieved successfully", + data: proxies, + }); + }); + + editProxy = catchAsync(async (req: Request, res: Response) => { + const teamId = requireTeamId(req.user?.teamId); + const { id: proxyId } = editProxyParamValidation.parse(req.params); + const validatedBody = editProxyBodyValidation.parse(req.body); + const updatedProxy = await this.proxiesService.updateProxy(proxyId, teamId, validatedBody); + return res.status(200).json({ + success: true, + msg: "Proxy updated successfully", + data: updatedProxy, + }); + }); + + deleteProxy = catchAsync(async (req: Request, res: Response) => { + const teamId = requireTeamId(req.user?.teamId); + const { id: proxyId } = deleteProxyParamValidation.parse(req.params); + await this.proxiesService.deleteProxy(proxyId, teamId); + return res.status(200).json({ + success: true, + msg: "Proxy deleted successfully", + }); + }); +} + +export default ProxyController; diff --git a/server/src/api/routes/proxyRoutes.ts b/server/src/api/routes/proxyRoutes.ts new file mode 100644 index 000000000..d03661fbc --- /dev/null +++ b/server/src/api/routes/proxyRoutes.ts @@ -0,0 +1,12 @@ +import { IProxiesController } from "@/api/controllers/proxyController.js"; +import { Router } from "express"; + +export const createProxyRoutes = (tagController: IProxiesController): Router => { + const router = Router(); + router.post("/", tagController.createProxy); + router.get("/team", tagController.getProxiesByTeamId); + router.get("/:id", tagController.getProxyById); + router.delete("/:id", tagController.deleteProxy); + router.patch("/:id", tagController.editProxy); + return router; +}; diff --git a/server/src/config/controllers.ts b/server/src/config/controllers.ts index 5b7d3c3f7..4f683babf 100644 --- a/server/src/config/controllers.ts +++ b/server/src/config/controllers.ts @@ -12,6 +12,7 @@ import NotificationController from "../api/controllers/notificationController.js import TagsController from "../api/controllers/tagController.js"; import DiagnosticController from "../api/controllers/diagnosticController.js"; import IncidentController from "../api/controllers/incidentController.js"; +import ProxyController from "@/api/controllers/proxyController.js"; import { ApiServices } from "@/config/services.api.js"; export interface InitializedControllers { @@ -29,6 +30,7 @@ export interface InitializedControllers { tagController: TagsController; diagnosticController: DiagnosticController; incidentController: IncidentController; + proxyController: ProxyController; } export const initializeControllers = (apiServices: ApiServices): InitializedControllers => { return { @@ -46,5 +48,6 @@ export const initializeControllers = (apiServices: ApiServices): InitializedCont tagController: new TagsController(apiServices.tagsService), diagnosticController: new DiagnosticController(apiServices.diagnosticService), incidentController: new IncidentController(apiServices.incidentService), + proxyController: new ProxyController(apiServices.proxiesService), }; }; diff --git a/server/src/config/routes.ts b/server/src/config/routes.ts index 810594354..6704fa83b 100644 --- a/server/src/config/routes.ts +++ b/server/src/config/routes.ts @@ -19,6 +19,7 @@ import { createDiagnosticRoutes } from "@/api/routes/diagnosticRoutes.js"; import { createNotificationRoutes } from "@/api/routes/notificationRoutes.js"; import { createTagRoutes } from "@/api/routes/tagRoutes.js"; import { createIncidentRoutes } from "@/api/routes/incidentRoutes.js"; +import { createProxyRoutes } from "@/api/routes/proxyRoutes.js"; export const setupRoutes = (app: Application, controllers: InitializedControllers, apiServices: ApiServices) => { const verifyJWT = createVerifyJWT(apiServices.settingsService); @@ -37,6 +38,7 @@ export const setupRoutes = (app: Application, controllers: InitializedController const tagRoutes = createTagRoutes(controllers.tagController); const diagnosticRoutes = createDiagnosticRoutes(controllers.diagnosticController, verifyJWT); const incidentRoutes = createIncidentRoutes(controllers.incidentController); + const proxyRoutes = createProxyRoutes(controllers.proxyController); app.use("/api/v1/auth", authApiLimiter, authRoutes); app.use("/api/v1/monitors", verifyJWT, monitorRoutes); @@ -52,4 +54,5 @@ export const setupRoutes = (app: Application, controllers: InitializedController app.use("/api/v1/tags", verifyJWT, tagRoutes); app.use("/api/v1/diagnostic", verifyJWT, diagnosticRoutes); app.use("/api/v1/incidents", verifyJWT, incidentRoutes); + app.use("/api/v1/proxies", verifyJWT, proxyRoutes); };