@digital-ai/plugin-dai-release-backend
Version:
Backend functionalities for the dai-release backstage plugin
136 lines (132 loc) • 4.53 kB
JavaScript
;
var apiConfig = require('./apiConfig.cjs.js');
var responseUtil = require('./responseUtil.cjs.js');
class WorkflowsOverviewApi {
logger;
config;
constructor(logger, config) {
this.logger = logger;
this.config = config;
}
static fromConfig(config, logger) {
return new WorkflowsOverviewApi(logger, config);
}
async redirectToWorkflowRunPage(instanceName, templateId, releaseTitle, folderId) {
this.logger?.debug(
`Redirecting to Workflows Run Page, instance: ${instanceName}`
);
const instanceConfig = this.config.getInstanceConfig(instanceName);
const accessToken = apiConfig.getCredentials(instanceConfig);
const apiUrl = apiConfig.getReleaseApiHost(instanceConfig);
function convertIdPath(unconvertedId) {
const parts = unconvertedId.split("/");
return parts.slice(1).join("-");
}
function getReleaseId(fullTemplateId) {
const parts = fullTemplateId.split("/");
return parts[parts.length - 1];
}
const workflow = await this.startRelease(
accessToken,
apiUrl,
getReleaseId(templateId),
releaseTitle,
folderId
);
const templateIdConverted = convertIdPath(workflow?.id);
const redirectUrl = `${apiUrl}${apiConfig.RELEASE_WORKFLOW_TRIGGER_WORKFLOW_PATH}/${templateIdConverted}`;
return redirectUrl;
}
async getWorkflowsOverviewApi(instanceName, pageNumber, resultsPerPage, searchInput, categories, author) {
this.logger?.debug(`Calling Workflows List api, instance: ${instanceName}`);
const instanceConfig = this.config.getInstanceConfig(instanceName);
const accessToken = apiConfig.getCredentials(instanceConfig);
const apiUrl = apiConfig.getReleaseApiHost(instanceConfig);
const workflows = await this.getWorkflowsList(
accessToken,
apiUrl,
pageNumber,
resultsPerPage,
searchInput,
categories,
author
);
function getRepoLink(repoRemoteLink, commitId) {
return `${repoRemoteLink}/commit/${commitId}`;
}
function getImageLink(logo) {
if (logo?.id)
return `${apiUrl}${apiConfig.RELEASE_WORKFLOW_LOGO_API_PATH}/${logo?.id}`;
return "";
}
const workflowDetails = workflows.content.map((d) => ({
title: d.title,
id: d.id,
description: d.description,
logoLink: getImageLink(d.logo),
author: d.author,
folderTitle: d.folderTitle,
defaultTargetFolder: d.defaultTargetFolder ? d.defaultTargetFolder : "",
categories: Array.isArray(d.categories) ? d.categories : [d.categories],
git: {
commitId: d.scmTraceabilityData?.commit?.substring(0, 8),
repoLink: getRepoLink(
d.scmTraceabilityData.remote,
d.scmTraceabilityData.commit
)
}
}));
return {
workflows: workflowDetails,
totalPages: workflows.totalPages,
totalElements: workflows.totalElements
};
}
async getWorkflowsList(accessToken, apiUrl, pageNumber, resultsPerPage, searchInput, categories, author) {
const body = JSON.stringify({
...searchInput && { searchInput },
...categories.length && { categories },
...author && { author }
});
const response = await fetch(
`${apiUrl}${apiConfig.RELEASE_WORKFLOW_LIST_API_PATH}?page=${pageNumber}&resultsPerPage=${resultsPerPage}`,
{
method: "POST",
headers: {
"x-release-personal-token": `${accessToken}`,
"Content-Type": "application/json",
Accept: "application/json"
},
body
}
);
if (!response.ok) {
await responseUtil.parseErrorResponse(this.logger, response);
}
return await response.json();
}
async startRelease(accessToken, apiUrl, templateId, releaseTitle, folderId) {
const body = JSON.stringify({
...releaseTitle && { releaseTitle },
...folderId && { folderId }
});
const response = await fetch(
`${apiUrl}${apiConfig.RELEASE_WORKFLOW_CREATE_RELEASE_API_PATH}/${templateId}/start`,
{
method: "POST",
headers: {
"x-release-personal-token": `${accessToken}`,
"Content-Type": "application/json",
Accept: "application/json"
},
body
}
);
if (!response.ok) {
await responseUtil.parseErrorResponse(this.logger, response);
}
return await response.json();
}
}
exports.WorkflowsOverviewApi = WorkflowsOverviewApi;
//# sourceMappingURL=WorkflowsOverviewApi.cjs.js.map