plugins/circleci: refactor to use DiscoverApi

This commit is contained in:
Patrik Oldsberg
2020-09-08 19:42:36 +02:00
parent faeffa0bb1
commit a20bc00b41
4 changed files with 36 additions and 25 deletions
+26 -8
View File
@@ -26,7 +26,7 @@ import {
BuildSummary,
GitType,
} from 'circleci-api';
import { createApiRef } from '@backstage/core';
import { createApiRef, DiscoveryApi } from '@backstage/core';
export { GitType };
export type { BuildWithSteps, BuildStepAction, BuildSummary };
@@ -36,15 +36,28 @@ export const circleCIApiRef = createApiRef<CircleCIApi>({
description: 'Used by the CircleCI plugin to make requests',
});
const DEFAULT_PROXY_PATH = '/circleci/api';
type Options = {
discoveryApi: DiscoveryApi;
/**
* Path to use for requests via the proxy, defaults to /circleci/api
*/
proxyPath?: string;
};
export class CircleCIApi {
apiUrl: string;
constructor(apiUrl: string = '/circleci/api') {
this.apiUrl = apiUrl;
private readonly discoveryApi: DiscoveryApi;
private readonly proxyPath: string;
constructor(options: Options) {
this.discoveryApi = options.discoveryApi;
this.proxyPath = options.proxyPath ?? DEFAULT_PROXY_PATH;
}
async retry(buildNumber: number, options: Partial<CircleCIOptions>) {
return postBuildActions('', buildNumber, BuildAction.RETRY, {
circleHost: this.apiUrl,
circleHost: await this.getApiUrl(),
...options.vcs,
});
}
@@ -59,19 +72,24 @@ export class CircleCIApi {
offset,
},
vcs: {},
circleHost: this.apiUrl,
circleHost: await this.getApiUrl(),
...options,
});
}
async getUser(options: Partial<CircleCIOptions>) {
return getMe('', { circleHost: this.apiUrl, ...options });
return getMe('', { circleHost: await this.getApiUrl(), ...options });
}
async getBuild(buildNumber: number, options: Partial<CircleCIOptions>) {
return getFullBuild('', buildNumber, {
circleHost: this.apiUrl,
circleHost: await this.getApiUrl(),
...options.vcs,
});
}
private async getApiUrl() {
const proxyUrl = await this.discoveryApi.getBaseUrl('proxy');
return proxyUrl + this.proxyPath;
}
}
+7 -6
View File
@@ -14,7 +14,11 @@
* limitations under the License.
*/
import { createPlugin, createApiFactory, configApiRef } from '@backstage/core';
import {
createPlugin,
createApiFactory,
discoveryApiRef,
} from '@backstage/core';
import { circleCIApiRef, CircleCIApi } from './api';
export const plugin = createPlugin({
@@ -22,11 +26,8 @@ export const plugin = createPlugin({
apis: [
createApiFactory({
api: circleCIApiRef,
deps: { configApi: configApiRef },
factory: ({ configApi }) =>
new CircleCIApi(
`${configApi.getString('backend.baseUrl')}/proxy/circleci/api`,
),
deps: { discoveryApi: discoveryApiRef },
factory: ({ discoveryApi }) => new CircleCIApi({ discoveryApi }),
}),
],
});