/home/techb158/cosmic-risk.abdallabala.com/src/domain
Edit: /home/techb158/cosmic-risk.abdallabala.com/src/domain/integrations.js (4438B)
const SUPPORTED_PM_PROVIDERS = {
TRELLO: {
label: "Trello",
externalProjectName: "Board",
workItemName: "Card",
mitigationObjectName: "Checklist item",
statusObjectName: "List",
riskFieldName: "Custom field or badge",
evidenceObjectName: "Attachment or comment"
},
JIRA: {
label: "Jira",
externalProjectName: "Project",
workItemName: "Issue",
mitigationObjectName: "Sub-task or linked issue",
statusObjectName: "Workflow status",
riskFieldName: "Custom field",
evidenceObjectName: "Attachment or comment"
},
ASANA: {
label: "Asana",
externalProjectName: "Project",
workItemName: "Task",
mitigationObjectName: "Subtask",
statusObjectName: "Section or custom status field",
riskFieldName: "Custom field",
evidenceObjectName: "Attachment or comment"
},
MICROSOFT_PLANNER: {
label: "Microsoft Planner",
externalProjectName: "Plan",
workItemName: "Task",
mitigationObjectName: "Checklist item",
statusObjectName: "Bucket or progress state",
riskFieldName: "Category, description, or task details",
evidenceObjectName: "Task reference or checklist evidence"
}
};
function listSupportedProviders() {
return Object.entries(SUPPORTED_PM_PROVIDERS).map(([provider, capabilities]) => ({ provider, capabilities }));
}
function riskStatusToExternalStatus(provider, risk) {
if (provider === "TRELLO") {
if (risk.status === "CLOSED") return "Approved for deployment";
if (risk.residualScore >= 50) return "Blocked by risk";
if (risk.status === "IN_MITIGATION") return "In mitigation";
return risk.lifecyclePhase || "Risk register";
}
if (provider === "JIRA") {
if (risk.status === "CLOSED") return "Done";
if (risk.status === "IN_MITIGATION") return "In Progress";
return "To Do";
}
if (provider === "ASANA") {
if (risk.status === "CLOSED") return "Complete";
if (risk.status === "IN_MITIGATION") return "In progress";
return "Open";
}
if (provider === "MICROSOFT_PLANNER") {
if (risk.status === "CLOSED") return "Completed";
if (risk.status === "IN_MITIGATION") return "In progress";
if (risk.residualScore >= 50) return "Blocked bucket";
return "Not started";
}
return risk.status || "Open";
}
function externalStatusToLocalStatus(provider, externalStatus) {
if (!externalStatus) return "OPEN";
const s = String(externalStatus).toLowerCase().trim();
if (provider === "TRELLO") {
if (s.includes("approved for deployment") || s.includes("done") || s.includes("closed")) return "CLOSED";
if (s.includes("mitigation") || s.includes("in progress") || s.includes("working")) return "IN_MITIGATION";
if (s.includes("accepted")) return "ACCEPTED";
return "OPEN";
}
if (provider === "JIRA") {
if (s === "done" || s === "closed" || s === "resolved") return "CLOSED";
if (s === "in progress" || s === "selected for development" || s === "in review") return "IN_MITIGATION";
if (s === "accepted" || s === "approved") return "ACCEPTED";
return "OPEN";
}
if (provider === "ASANA") {
if (s === "complete" || s === "completed" || s === "closed") return "CLOSED";
if (s.includes("in progress") || s.includes("mitigation")) return "IN_MITIGATION";
if (s === "accepted" || s === "approved") return "ACCEPTED";
return "OPEN";
}
if (provider === "MICROSOFT_PLANNER") {
if (s === "completed" || s === "closed" || s === "done") return "CLOSED";
if (s.includes("in progress") || s.includes("mitigation")) return "IN_MITIGATION";
if (s === "accepted" || s === "approved") return "ACCEPTED";
return "OPEN";
}
return "OPEN";
}
function parseDimensionFromLabels(labels = []) {
const dims = ["Organizational","Technical","Human","Governance","Legal","Ethical","Operational"];
for (const label of labels) {
const name = (label.name || label || "").replace(/^COSMIC:/i, "");
if (dims.includes(name)) return name;
}
return "Technical";
}
function parsePhaseFromLabels(labels = []) {
for (const label of labels) {
const name = (label.name || label || "");
const match = name.match(/^COSMIC:Phase:(.+)/i);
if (match) return match[1];
}
return "Needs identification";
}
module.exports = {
SUPPORTED_PM_PROVIDERS,
listSupportedProviders,
riskStatusToExternalStatus,
externalStatusToLocalStatus,
parseDimensionFromLabels,
parsePhaseFromLabels
};