UNPKG

@nitin15j/plugin-dora-backend

Version:

This plugin backend was templated using the Backstage CLI. You should replace this text with a description of your plugin backend.

273 lines (267 loc) 9.6 kB
'use strict'; var express = require('express'); var zod = require('zod'); function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; } var express__default = /*#__PURE__*/_interopDefaultCompat(express); async function createRouter(options) { const { metricsService, logger } = options; const router = express.Router(); router.use(express__default.default.json()); const MetricsQuerySchema = zod.z.object({ timeRange: zod.z.string().regex(/^last\d+days$/i, "Time range must be in format: lastXdays (e.g., last7days)"), environment: zod.z.string().min(1, "Environment is required"), deploymentId: zod.z.string().min(1, "Deployment ID is required") }); const OrgTrendMetricsQuerySchema = MetricsQuerySchema.pick({ timeRange: true }); router.get("/metrics/:projectSlug", async (req, res) => { try { const { projectSlug } = req.params; const queryResult = MetricsQuerySchema.safeParse(req.query); if (!queryResult.success) { logger.warn("Invalid metrics request parameters", { errors: queryResult.error.errors.map((e) => ({ path: e.path.join("."), message: e.message })) }); return res.status(400).json({ error: "Invalid request parameters", details: queryResult.error.errors }); } const { timeRange, environment, deploymentId } = queryResult.data; logger.info("Received metrics request", { projectSlug, timeRange, environment, deploymentId, path: req.path, url: req.url, method: req.method }); const metrics = await metricsService.getProjectMetrics( projectSlug, environment, deploymentId, timeRange ); return res.json(metrics); } catch (error) { logger.error("Failed to fetch metrics", { error: error instanceof Error ? error.message : String(error), projectId: req.params.projectSlug }); if (error instanceof Error && error.message === "No metrics data available") { return res.status(404).json({ error: "No metrics data available" }); } return res.status(500).json({ error: "Failed to fetch metrics" }); } }); router.get("/metrics-insights/:projectId", async (req, res) => { try { const { projectId } = req.params; const queryResult = MetricsQuerySchema.safeParse(req.query); if (!queryResult.success) { logger.warn("Invalid metrics insights request parameters", { errors: queryResult.error.errors.map((e) => ({ path: e.path.join("."), message: e.message })) }); return res.status(400).json({ error: "Invalid request parameters", details: queryResult.error.errors }); } const { timeRange, environment, deploymentId } = queryResult.data; logger.info("Received metrics insights request", { projectId, timeRange, environment, deploymentId, path: req.path, url: req.url, method: req.method }); const metrics = await metricsService.getProjectMetricsInsights( projectId, environment, deploymentId, timeRange ); return res.json(metrics); } catch (error) { logger.error("Failed to fetch metrics", { error: error instanceof Error ? error.message : String(error), projectId: req.params.projectId }); if (error instanceof Error && error.message === "No metrics insights data available") { return res.status(404).json({ error: "No metrics insights data available" }); } return res.status(500).json({ error: "Failed to fetch metrics insights" }); } }); router.get("/org-trend-metrics", async (req, res) => { try { const queryResult = OrgTrendMetricsQuerySchema.safeParse(req.query); if (!queryResult.success) { logger.warn("Invalid Org Trend metric request parameters", { errors: queryResult.error.errors.map((e) => ({ path: e.path.join("."), message: e.message })) }); return res.status(400).json({ error: "Invalid request parameters", details: queryResult.error.errors }); } const { timeRange } = queryResult.data; logger.info("Received Org Trend metrics request", { timeRange, path: req.path, url: req.url, method: req.method }); const result = await metricsService.getOrganizationTrendMetrics( timeRange ); return res.json(result); } catch (error) { logger.error("Failed to fetch organization trend metrics", { error: error instanceof Error ? error.message : String(error) }); return res.status(500).json({ error: "Failed to fetch organization trend metrics" }); } }); router.get("/team-metrics/:teamSlug", async (req, res) => { try { const { teamSlug } = req.params; const queryResult = MetricsQuerySchema.safeParse(req.query); if (!queryResult.success) { logger.warn("Invalid team metrics request parameters", { errors: queryResult.error.errors.map((e) => ({ path: e.path.join("."), message: e.message })) }); return res.status(400).json({ error: "Invalid request parameters", details: queryResult.error.errors }); } const { timeRange, environment, deploymentId } = queryResult.data; logger.info("Received team metrics request", { teamSlug, timeRange, environment, deploymentId, path: req.path, url: req.url, method: req.method }); const metrics = await metricsService.getTeamMetrics( teamSlug, environment, timeRange ); return res.json(metrics); } catch (error) { logger.error("Failed to fetch team metrics", { error: error instanceof Error ? error.message : String(error), teamSlug: req.params.teamSlug }); if (error instanceof Error && error.message === "No team metrics data available") { return res.status(404).json({ error: "No team metrics data available" }); } return res.status(500).json({ error: "Failed to fetch team metrics" }); } }); router.get("/team-metrics-insights/:teamSlug", async (req, res) => { try { const { teamSlug } = req.params; const queryResult = MetricsQuerySchema.safeParse(req.query); if (!queryResult.success) { logger.warn("Invalid team metrics insights request parameters", { errors: queryResult.error.errors.map((e) => ({ path: e.path.join("."), message: e.message })) }); return res.status(400).json({ error: "Invalid request parameters", details: queryResult.error.errors }); } const { timeRange, environment, deploymentId } = queryResult.data; logger.info("Received team metrics insights request", { teamSlug, timeRange, environment, deploymentId, path: req.path, url: req.url, method: req.method }); const metrics = await metricsService.getTeamMetricsInsights( teamSlug, environment, deploymentId, timeRange ); return res.json(metrics); } catch (error) { logger.error("Failed to fetch team metrics insights", { error: error instanceof Error ? error.message : String(error), teamSlug: req.params.teamSlug }); if (error instanceof Error && error.message === "No team metrics insights data available") { return res.status(404).json({ error: "No team metrics insights data available" }); } return res.status(500).json({ error: "Failed to fetch team metrics insights" }); } }); router.post("/batch-team-metrics", async (req, res) => { try { const { teamSlugs, timeRange, environment, deploymentId } = req.body; if (!teamSlugs || !Array.isArray(teamSlugs) || teamSlugs.length === 0) { return res.status(400).json({ error: "teamSlugs is required and must be a non-empty array" }); } if (!timeRange || !environment || !deploymentId) { return res.status(400).json({ error: "timeRange, environment, and deploymentId are required" }); } logger.info("Received batch team metrics request", { teamSlugs, timeRange, environment, deploymentId, path: req.path, url: req.url, method: req.method }); const metrics = await metricsService.getBatchTeamMetrics( teamSlugs, environment, deploymentId, timeRange ); return res.json(metrics); } catch (error) { logger.error("Failed to fetch batch team metrics", { error: error instanceof Error ? error.message : String(error), teamSlugs: req.body.teamSlugs }); if (error instanceof Error && error.message === "No batch team metrics data available") { return res.status(404).json({ error: "No batch team metrics data available" }); } return res.status(500).json({ error: "Failed to fetch batch team metrics" }); } }); return router; } exports.createRouter = createRouter; //# sourceMappingURL=router.cjs.js.map