UNPKG

@digital-ai/plugin-dai-release

Version:

Frontend functionalities for the dai-release backstage plugin

161 lines (158 loc) 6.48 kB
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