import { createRoute } from "../../../modules/api-utils/createRoute"; import { apiResponse } from "../../../modules/api-utils/apiResponse"; import { ContentfulStatusCode } from "hono/utils/http-status"; import { authMiddleware } from "../../middleware/authorization"; import GenericError from "../../../Errors/GenericError"; import { getSalesOpportunityMetricsAll, getSalesOpportunityMetricsForMember, refreshSalesOpportunityMetricsCache, } from "../../../modules/cache/salesOpportunityMetricsCache"; /* GET /v1/sales/opportunities/metrics */ export default createRoute( "get", ["/opportunities/metrics"], async (c) => { const user = c.get("user"); const scope = (c.req.query("scope") ?? "me").toLowerCase(); const requestedIdentifier = c.req.query("identifier")?.trim().toLowerCase(); const currentUserIdentifier = user?.cwIdentifier?.trim().toLowerCase(); if ( scope === "all" && !(await user.hasPermission("sales.opportunity.metrics.all")) ) { throw new GenericError({ name: "InsufficientPermission", message: "You do not have permission to view metrics for all active members.", status: 403, }); } const usingIdentifierOverride = scope !== "all" && !!requestedIdentifier && requestedIdentifier !== currentUserIdentifier; if ( usingIdentifierOverride && !(await user.hasPermission( "sales.opportunity.metrics.identifier.override", )) ) { throw new GenericError({ name: "InsufficientPermission", message: "You do not have permission to query metrics by overriding the member identifier.", status: 403, }); } const requireWarmCache = async () => { const all = await getSalesOpportunityMetricsAll(); if (all) return all; await refreshSalesOpportunityMetricsCache(); return getSalesOpportunityMetricsAll(); }; if (scope === "all") { const all = await requireWarmCache(); const response = apiResponse.successful( "Sales opportunity metrics fetched successfully!", all, ); return c.json(response, response.status as ContentfulStatusCode); } const targetIdentifier = requestedIdentifier ?? currentUserIdentifier; if (!targetIdentifier) { const response = apiResponse.successful( "Sales opportunity metrics fetched successfully!", null, ); return c.json(response, response.status as ContentfulStatusCode); } let metrics = await getSalesOpportunityMetricsForMember(targetIdentifier); if (!metrics) { await refreshSalesOpportunityMetricsCache(); metrics = await getSalesOpportunityMetricsForMember(targetIdentifier); } const response = apiResponse.successful( "Sales opportunity metrics fetched successfully!", { identifier: targetIdentifier, metrics, }, ); return c.json(response, response.status as ContentfulStatusCode); }, authMiddleware({ permissions: ["sales.opportunity.fetch.many"] }), );