@digital-ai/plugin-dai-release
Version:
Frontend functionalities for the dai-release backstage plugin
161 lines (158 loc) • 6.48 kB
JavaScript
import { parseErrorResponseBody, AuthenticationError, NotAllowedError, NotFoundError, ServiceUnavailableError, InputError } from '@backstage/errors';
import { convertUnixTimestamp } from '../utils/dateTimeUtils.esm.js';
class DaiReleaseApiClient {
discoveryApi;
identityApi;
constructor(options) {
this.discoveryApi = options.discoveryApi;
this.identityApi = options.identityApi;
}
async getToken() {
const { token } = await this.identityApi.getCredentials();
return token;
}
isStatusChecked(statusTags, tag) {
return encodeURIComponent(statusTags.indexOf(tag) > -1);
}
async getReleases(page, rowsPerPage, orderBy, searchTile, fromDate, toDate, statusTags, instanceName) {
const queryString = new URLSearchParams();
queryString.append("failing", this.isStatusChecked(statusTags, "Failing"));
queryString.append("planned", this.isStatusChecked(statusTags, "Planned"));
queryString.append(
"completed",
this.isStatusChecked(statusTags, "Completed")
);
queryString.append("paused", this.isStatusChecked(statusTags, "Paused"));
queryString.append("aborted", this.isStatusChecked(statusTags, "Aborted"));
queryString.append(
"inProgress",
this.isStatusChecked(statusTags, "In progress")
);
queryString.append("failed", this.isStatusChecked(statusTags, "Failed"));
queryString.append("pageNumber", page.toString());
queryString.append("resultsPerPage", rowsPerPage.toString());
queryString.append("orderBy", orderBy);
queryString.append("title", searchTile.toString());
queryString.append("fromDate", convertUnixTimestamp(fromDate).toString());
queryString.append("toDate", convertUnixTimestamp(toDate).toString());
queryString.append("instanceName", instanceName.toString());
const urlSegment = `releases?${queryString}`;
const items = await this.get(urlSegment);
return { items };
}
async getInstanceList() {
return await this.get("instances");
}
async getTemplates(page, rowsPerPage, searchTile, instanceName, _tags, options) {
const queryString = new URLSearchParams();
queryString.append("pageNumber", page.toString());
queryString.append("resultsPerPage", rowsPerPage.toString());
queryString.append("title", searchTile.toString());
_tags.forEach((tag) => {
queryString.append("tag", tag);
});
queryString.append("instanceName", instanceName.toString());
const urlSegment = `templates?${queryString}`;
const items = await this.get(urlSegment, options);
return { items };
}
async getTemplateMetaInfo(instanceName, folderId, options) {
const queryString = new URLSearchParams();
queryString.append("folderId", folderId.toString());
queryString.append("instanceName", instanceName.toString());
const urlSegment = `template/meta?${queryString}`;
return await this.get(urlSegment, options);
}
async get(path, options) {
const baseUrl = `${await this.discoveryApi.getBaseUrl("dai-release")}/`;
const url = new URL(path, baseUrl);
const idToken = await this.getToken();
const response = await fetch(url.toString(), {
method: "GET",
headers: {
"Content-Type": "application/json",
Accept: "application/json",
Authorization: `Bearer ${idToken}`
},
signal: options?.signal
});
if (!response.ok) {
await this.errorResponse(response);
}
return await response.json();
}
async post(path, options, body) {
const baseUrl = `${await this.discoveryApi.getBaseUrl("dai-release")}/`;
const url = new URL(path, baseUrl);
const idToken = await this.getToken();
const response = await fetch(url.toString(), {
method: "POST",
headers: {
"Content-Type": "application/json",
Accept: "application/json",
Authorization: `Bearer ${idToken}`
},
signal: options?.signal,
body
});
if (!response.ok) {
await this.errorResponse(response);
}
return await response.json();
}
async errorResponse(response) {
const data = await parseErrorResponseBody(response);
if (response.status === 401) {
throw new AuthenticationError(data.error.message);
} else if (response.status === 403) {
throw new NotAllowedError(data.error.message);
} else if (response.status === 404) {
throw new NotFoundError(data.error.message);
} else if (response.status === 500) {
throw new ServiceUnavailableError(`Release Service Unavailable`);
} else if (response.status === 400) {
throw new InputError(data.error.message);
}
throw new Error(
`Unexpected error: failed to fetch data, status ${response.status}: ${response.statusText}`
);
}
async getReleaseCategories(instanceName) {
const queryString = new URLSearchParams();
queryString.append("instanceName", instanceName.toString());
const urlSegment = `categories?${queryString}`;
return await this.get(urlSegment);
}
async getWorkflowCatalog(page, resultsPerPage, searchInput, categories, author, instanceName, options) {
const queryString = new URLSearchParams();
queryString.append("instanceName", instanceName.toString());
queryString.append("pageNumber", page.toString());
queryString.append("resultsPerPage", resultsPerPage.toString());
const body = JSON.stringify({
...searchInput && { searchInput },
...categories.length && { categories },
...author && { author }
});
const urlSegment = `workflows?${queryString}`;
return await this.post(urlSegment, options, body);
}
async getFolders(instanceName, options) {
const queryString = new URLSearchParams();
queryString.append("instanceName", instanceName.toString());
const urlSegment = `folders?instanceName=${instanceName}`;
return await this.get(urlSegment, options);
}
async generateWorkflowRedirect(instanceName, templateId, releaseTitle, folderId, options) {
const queryString = new URLSearchParams();
queryString.append("instanceName", instanceName.toString());
const urlSegment = `workflow/redirect?instanceName=${instanceName}`;
const body = JSON.stringify({
...templateId && { templateId },
...folderId && { folderId },
...releaseTitle && { releaseTitle }
});
return await this.post(urlSegment, options, body);
}
}
export { DaiReleaseApiClient };
//# sourceMappingURL=DaiReleaseApiClient.esm.js.map