96 lines
3.0 KiB
TypeScript
96 lines
3.0 KiB
TypeScript
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"] }),
|
|
);
|