From aecfe4f403d72dd5e4c60893b659d459ff11acdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 5 Jan 2022 21:35:51 +0100 Subject: [PATCH] same for the scaffolder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/modern-knives-roll.md | 5 ++++ .changeset/sweet-candles-greet.md | 5 ++++ plugins/scaffolder/api-report.md | 24 +++++----------- plugins/scaffolder/src/api.ts | 46 +++++++++++++++++++++---------- plugins/scaffolder/src/plugin.ts | 11 ++++++-- 5 files changed, 57 insertions(+), 34 deletions(-) create mode 100644 .changeset/modern-knives-roll.md create mode 100644 .changeset/sweet-candles-greet.md diff --git a/.changeset/modern-knives-roll.md b/.changeset/modern-knives-roll.md new file mode 100644 index 0000000000..4d69f285b2 --- /dev/null +++ b/.changeset/modern-knives-roll.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': patch +--- + +Make `ScaffolderClient` use the `FetchApi`. diff --git a/.changeset/sweet-candles-greet.md b/.changeset/sweet-candles-greet.md new file mode 100644 index 0000000000..1a83f7828a --- /dev/null +++ b/.changeset/sweet-candles-greet.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-techdocs': patch +--- + +Make `TechDocsClient` and `TechDocsStorageClient` use the `FetchApi`. diff --git a/plugins/scaffolder/api-report.md b/plugins/scaffolder/api-report.md index d2bbb2a5e1..835712651d 100644 --- a/plugins/scaffolder/api-report.md +++ b/plugins/scaffolder/api-report.md @@ -15,6 +15,7 @@ import { Entity } from '@backstage/catalog-model'; import { EntityName } from '@backstage/catalog-model'; import { Extension } from '@backstage/core-plugin-api'; import { ExternalRouteRef } from '@backstage/core-plugin-api'; +import { FetchApi } from '@backstage/core-plugin-api'; import { FieldProps } from '@rjsf/core'; import { FieldValidation } from '@rjsf/core'; import { IconButton } from '@material-ui/core'; @@ -166,9 +167,7 @@ export interface RepoUrlPickerUiOptions { allowedOwners?: string[]; } -// Warning: (ae-missing-release-tag) "ScaffolderApi" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @public export interface ScaffolderApi { // (undocumented) getIntegrationsList(options: { allowedHosts: string[] }): Promise< @@ -200,27 +199,18 @@ export interface ScaffolderApi { // Warning: (ae-forgotten-export) The symbol "LogEvent" needs to be exported by the entry point index.d.ts // // (undocumented) - streamLogs({ - taskId, - after, - }: { - taskId: string; - after?: number; - }): Observable; + streamLogs(options: { taskId: string; after?: number }): Observable; } -// Warning: (ae-missing-release-tag) "scaffolderApiRef" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @public export const scaffolderApiRef: ApiRef; -// Warning: (ae-missing-release-tag) "ScaffolderClient" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @public export class ScaffolderClient implements ScaffolderApi { constructor(options: { discoveryApi: DiscoveryApi; identityApi: IdentityApi; + fetchApi?: FetchApi; scmIntegrationsApi: ScmIntegrationRegistry; useLongPollingLogs?: boolean; }); @@ -246,7 +236,7 @@ export class ScaffolderClient implements ScaffolderApi { secrets?: Record, ): Promise; // (undocumented) - streamLogs(opts: { taskId: string; after?: number }): Observable; + streamLogs(options: { taskId: string; after?: number }): Observable; } // Warning: (ae-missing-release-tag) "ScaffolderFieldExtensions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) diff --git a/plugins/scaffolder/src/api.ts b/plugins/scaffolder/src/api.ts index 7f096a02f7..77af1460c3 100644 --- a/plugins/scaffolder/src/api.ts +++ b/plugins/scaffolder/src/api.ts @@ -18,6 +18,7 @@ import { EntityName } from '@backstage/catalog-model'; import { createApiRef, DiscoveryApi, + FetchApi, IdentityApi, } from '@backstage/core-plugin-api'; import { ResponseError } from '@backstage/errors'; @@ -28,6 +29,11 @@ import qs from 'qs'; import ObservableImpl from 'zen-observable'; import { ListActionsResponse, ScaffolderTask, Status } from './types'; +/** + * Utility API reference for the {@link ScaffolderApi}. + * + * @public + */ export const scaffolderApiRef = createApiRef({ id: 'plugin.scaffolder.service', }); @@ -58,6 +64,11 @@ export type CustomField = { validation: (data: JsonValue, field: FieldValidation) => void; }; +/** + * An API to interact with the scaffolder backend. + * + * @public + */ export interface ScaffolderApi { getTemplateParameterSchema( templateName: EntityName, @@ -86,29 +97,31 @@ export interface ScaffolderApi { // Returns a list of all installed actions. listActions(): Promise; - streamLogs({ - taskId, - after, - }: { - taskId: string; - after?: number; - }): Observable; + streamLogs(options: { taskId: string; after?: number }): Observable; } +/** + * An API to interact with the scaffolder backend. + * + * @public + */ export class ScaffolderClient implements ScaffolderApi { private readonly discoveryApi: DiscoveryApi; private readonly identityApi: IdentityApi; private readonly scmIntegrationsApi: ScmIntegrationRegistry; + private readonly fetchApi: FetchApi; private readonly useLongPollingLogs: boolean; constructor(options: { discoveryApi: DiscoveryApi; identityApi: IdentityApi; + fetchApi?: FetchApi; scmIntegrationsApi: ScmIntegrationRegistry; useLongPollingLogs?: boolean; }) { this.discoveryApi = options.discoveryApi; this.identityApi = options.identityApi; + this.fetchApi = options.fetchApi ?? { fetch }; this.scmIntegrationsApi = options.scmIntegrationsApi; this.useLongPollingLogs = options.useLongPollingLogs ?? false; } @@ -136,7 +149,7 @@ export class ScaffolderClient implements ScaffolderApi { .join('/'); const url = `${baseUrl}/v2/templates/${templatePath}/parameter-schema`; - const response = await fetch(url, { + const response = await this.fetchApi.fetch(url, { headers: { ...(token && { Authorization: `Bearer ${token}` }), }, @@ -165,7 +178,7 @@ export class ScaffolderClient implements ScaffolderApi { ): Promise { const { token } = await this.identityApi.getCredentials(); const url = `${await this.discoveryApi.getBaseUrl('scaffolder')}/v2/tasks`; - const response = await fetch(url, { + const response = await this.fetchApi.fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -192,7 +205,7 @@ export class ScaffolderClient implements ScaffolderApi { const { token } = await this.identityApi.getCredentials(); const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder'); const url = `${baseUrl}/v2/tasks/${encodeURIComponent(taskId)}`; - const response = await fetch(url, { + const response = await this.fetchApi.fetch(url, { headers: token ? { Authorization: `Bearer ${token}` } : {}, }); @@ -203,12 +216,15 @@ export class ScaffolderClient implements ScaffolderApi { return await response.json(); } - streamLogs(opts: { taskId: string; after?: number }): Observable { + streamLogs(options: { + taskId: string; + after?: number; + }): Observable { if (this.useLongPollingLogs) { - return this.streamLogsPolling(opts); + return this.streamLogsPolling(options); } - return this.streamLogsEventStream(opts); + return this.streamLogsEventStream(options); } private streamLogsEventStream({ @@ -276,7 +292,7 @@ export class ScaffolderClient implements ScaffolderApi { const url = `${baseUrl}/v2/tasks/${encodeURIComponent( taskId, )}/events?${qs.stringify({ after })}`; - const response = await fetch(url); + const response = await this.fetchApi.fetch(url); if (!response.ok) { // wait for one second to not run into an @@ -307,7 +323,7 @@ export class ScaffolderClient implements ScaffolderApi { async listActions(): Promise { const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder'); const { token } = await this.identityApi.getCredentials(); - const response = await fetch(`${baseUrl}/v2/actions`, { + const response = await this.fetchApi.fetch(`${baseUrl}/v2/actions`, { headers: token ? { Authorization: `Bearer ${token}` } : {}, }); diff --git a/plugins/scaffolder/src/plugin.ts b/plugins/scaffolder/src/plugin.ts index 02b36c4bb6..9221fc1bf3 100644 --- a/plugins/scaffolder/src/plugin.ts +++ b/plugins/scaffolder/src/plugin.ts @@ -33,6 +33,7 @@ import { createPlugin, createRoutableExtension, discoveryApiRef, + fetchApiRef, identityApiRef, } from '@backstage/core-plugin-api'; import { OwnedEntityPicker } from './components/fields/OwnedEntityPicker'; @@ -47,9 +48,15 @@ export const scaffolderPlugin = createPlugin({ discoveryApi: discoveryApiRef, identityApi: identityApiRef, scmIntegrationsApi: scmIntegrationsApiRef, + fetchApi: fetchApiRef, }, - factory: ({ discoveryApi, identityApi, scmIntegrationsApi }) => - new ScaffolderClient({ discoveryApi, identityApi, scmIntegrationsApi }), + factory: ({ discoveryApi, identityApi, scmIntegrationsApi, fetchApi }) => + new ScaffolderClient({ + discoveryApi, + identityApi, + scmIntegrationsApi, + fetchApi, + }), }), ], routes: {