From 79efb2be1d82218f343ed4dd484b4139956979f1 Mon Sep 17 00:00:00 2001 From: Anton Ganhammar Date: Thu, 17 Aug 2023 21:31:54 +0200 Subject: [PATCH 1/6] feat: include authorization token if set in code-coverage plugin Signed-off-by: Anton Ganhammar --- plugins/code-coverage/src/api.ts | 28 +++++++++++++++++++++------- plugins/code-coverage/src/plugin.ts | 6 ++++-- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/plugins/code-coverage/src/api.ts b/plugins/code-coverage/src/api.ts index 081f1c7999..34e55b5cba 100644 --- a/plugins/code-coverage/src/api.ts +++ b/plugins/code-coverage/src/api.ts @@ -20,10 +20,13 @@ import { } from '@backstage/catalog-model'; import { ResponseError } from '@backstage/errors'; import { JsonCodeCoverage, JsonCoverageHistory } from './types'; -import { createApiRef, DiscoveryApi } from '@backstage/core-plugin-api'; +import { + createApiRef, + DiscoveryApi, + IdentityApi, +} from '@backstage/core-plugin-api'; export type CodeCoverageApi = { - discovery: DiscoveryApi; getCoverageForEntity: ( entity: CompoundEntityRef, ) => Promise; @@ -42,18 +45,29 @@ export const codeCoverageApiRef = createApiRef({ }); export class CodeCoverageRestApi implements CodeCoverageApi { - url: string = ''; + private readonly discoveryApi: DiscoveryApi; + private readonly identityApi: IdentityApi; - constructor(public discovery: DiscoveryApi) {} + private url: string = ''; + + public constructor(options: { + discoveryApi: DiscoveryApi; + identityApi: IdentityApi; + }) { + this.discoveryApi = options.discoveryApi; + this.identityApi = options.identityApi; + } private async fetch( path: string, - init?: RequestInit, ): Promise { if (!this.url) { - this.url = await this.discovery.getBaseUrl('code-coverage'); + this.url = await this.discoveryApi.getBaseUrl('code-coverage'); } - const resp = await fetch(`${this.url}${path}`, init); + const { token } = await this.identityApi.getCredentials(); + const resp = await fetch(`${this.url}${path}`, { + headers: token ? { Authorization: `Bearer ${token}` } : {}, + }); if (!resp.ok) { throw await ResponseError.fromResponse(resp); } diff --git a/plugins/code-coverage/src/plugin.ts b/plugins/code-coverage/src/plugin.ts index f137e9d488..22b59fd50a 100644 --- a/plugins/code-coverage/src/plugin.ts +++ b/plugins/code-coverage/src/plugin.ts @@ -21,6 +21,7 @@ import { createPlugin, createRoutableExtension, discoveryApiRef, + identityApiRef, } from '@backstage/core-plugin-api'; /** @@ -34,8 +35,9 @@ export const codeCoveragePlugin = createPlugin({ apis: [ createApiFactory({ api: codeCoverageApiRef, - deps: { discoveryApi: discoveryApiRef }, - factory: ({ discoveryApi }) => new CodeCoverageRestApi(discoveryApi), + deps: { discoveryApi: discoveryApiRef, identityApi: identityApiRef }, + factory: ({ discoveryApi, identityApi }) => + new CodeCoverageRestApi({ discoveryApi, identityApi }), }), ], }); From 1d8f4f0a7486872ec56d2e40a12631b1943417f4 Mon Sep 17 00:00:00 2001 From: Anton Ganhammar Date: Thu, 17 Aug 2023 21:45:58 +0200 Subject: [PATCH 2/6] feat: add changeset Signed-off-by: Anton Ganhammar --- .changeset/nice-forks-remain.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/nice-forks-remain.md diff --git a/.changeset/nice-forks-remain.md b/.changeset/nice-forks-remain.md new file mode 100644 index 0000000000..1545c88745 --- /dev/null +++ b/.changeset/nice-forks-remain.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-code-coverage': patch +--- + +Include authorization token (if one exists) when fetching code-coverage data From 850ca8eb106b24a834f73fab5073ab3d65506395 Mon Sep 17 00:00:00 2001 From: Anton Ganhammar Date: Fri, 18 Aug 2023 07:07:39 +0200 Subject: [PATCH 3/6] fix: use fetchapi to automatically handle authentication Signed-off-by: Anton Ganhammar --- .changeset/nice-forks-remain.md | 2 +- plugins/code-coverage/src/api.ts | 13 +++++-------- plugins/code-coverage/src/plugin.ts | 8 ++++---- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/.changeset/nice-forks-remain.md b/.changeset/nice-forks-remain.md index 1545c88745..6d833ff283 100644 --- a/.changeset/nice-forks-remain.md +++ b/.changeset/nice-forks-remain.md @@ -2,4 +2,4 @@ '@backstage/plugin-code-coverage': patch --- -Include authorization token (if one exists) when fetching code-coverage data +Use fetchApi to ensure authorization is used when fetching code-coverage data diff --git a/plugins/code-coverage/src/api.ts b/plugins/code-coverage/src/api.ts index 34e55b5cba..9947891006 100644 --- a/plugins/code-coverage/src/api.ts +++ b/plugins/code-coverage/src/api.ts @@ -23,7 +23,7 @@ import { JsonCodeCoverage, JsonCoverageHistory } from './types'; import { createApiRef, DiscoveryApi, - IdentityApi, + FetchApi, } from '@backstage/core-plugin-api'; export type CodeCoverageApi = { @@ -46,16 +46,16 @@ export const codeCoverageApiRef = createApiRef({ export class CodeCoverageRestApi implements CodeCoverageApi { private readonly discoveryApi: DiscoveryApi; - private readonly identityApi: IdentityApi; + private readonly fetchApi: FetchApi; private url: string = ''; public constructor(options: { discoveryApi: DiscoveryApi; - identityApi: IdentityApi; + fetchApi: FetchApi; }) { this.discoveryApi = options.discoveryApi; - this.identityApi = options.identityApi; + this.fetchApi = options.fetchApi; } private async fetch( @@ -64,10 +64,7 @@ export class CodeCoverageRestApi implements CodeCoverageApi { if (!this.url) { this.url = await this.discoveryApi.getBaseUrl('code-coverage'); } - const { token } = await this.identityApi.getCredentials(); - const resp = await fetch(`${this.url}${path}`, { - headers: token ? { Authorization: `Bearer ${token}` } : {}, - }); + const resp = await this.fetchApi.fetch(`${this.url}${path}`); if (!resp.ok) { throw await ResponseError.fromResponse(resp); } diff --git a/plugins/code-coverage/src/plugin.ts b/plugins/code-coverage/src/plugin.ts index 22b59fd50a..391595f142 100644 --- a/plugins/code-coverage/src/plugin.ts +++ b/plugins/code-coverage/src/plugin.ts @@ -21,7 +21,7 @@ import { createPlugin, createRoutableExtension, discoveryApiRef, - identityApiRef, + fetchApiRef, } from '@backstage/core-plugin-api'; /** @@ -35,9 +35,9 @@ export const codeCoveragePlugin = createPlugin({ apis: [ createApiFactory({ api: codeCoverageApiRef, - deps: { discoveryApi: discoveryApiRef, identityApi: identityApiRef }, - factory: ({ discoveryApi, identityApi }) => - new CodeCoverageRestApi({ discoveryApi, identityApi }), + deps: { discoveryApi: discoveryApiRef, fetchApi: fetchApiRef }, + factory: ({ discoveryApi, fetchApi }) => + new CodeCoverageRestApi({ discoveryApi, fetchApi }), }), ], }); From a80f321353a5590d337a84d2f038ad76aaeb7dda Mon Sep 17 00:00:00 2001 From: Anton Ganhammar Date: Fri, 18 Aug 2023 15:07:14 +0200 Subject: [PATCH 4/6] chore: re-ask for the code-coverage url before fetching Signed-off-by: Anton Ganhammar --- plugins/code-coverage/src/api.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/plugins/code-coverage/src/api.ts b/plugins/code-coverage/src/api.ts index 9947891006..942e5a8a47 100644 --- a/plugins/code-coverage/src/api.ts +++ b/plugins/code-coverage/src/api.ts @@ -48,8 +48,6 @@ export class CodeCoverageRestApi implements CodeCoverageApi { private readonly discoveryApi: DiscoveryApi; private readonly fetchApi: FetchApi; - private url: string = ''; - public constructor(options: { discoveryApi: DiscoveryApi; fetchApi: FetchApi; @@ -61,10 +59,8 @@ export class CodeCoverageRestApi implements CodeCoverageApi { private async fetch( path: string, ): Promise { - if (!this.url) { - this.url = await this.discoveryApi.getBaseUrl('code-coverage'); - } - const resp = await this.fetchApi.fetch(`${this.url}${path}`); + const url = await this.discoveryApi.getBaseUrl('code-coverage'); + const resp = await this.fetchApi.fetch(`${url}${path}`); if (!resp.ok) { throw await ResponseError.fromResponse(resp); } From 9ea0fe70470aa8389386d1abdbb3a8d7f8d9ba22 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 18 Aug 2023 13:18:42 +0000 Subject: [PATCH 5/6] chore(deps): update dependency @types/node to v16.18.41 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index e7530bb0d2..69988fca05 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17516,9 +17516,9 @@ __metadata: linkType: hard "@types/node@npm:^16.0.0, @types/node@npm:^16.11.26, @types/node@npm:^16.9.2": - version: 16.18.40 - resolution: "@types/node@npm:16.18.40" - checksum: a683930491b4fd7cb2dc7684e32bbeedc4a83fb1949a7b15ea724fbfaa9988cec59091f169a3f1090cb91992caba8c1a7d50315b2c67c6e2579a3788bb09eec4 + version: 16.18.41 + resolution: "@types/node@npm:16.18.41" + checksum: b12650d8e4289edafcf0453c8a66c00d6397d465a48b1c683babba4f16f92a6418f678e98a85751e3fef78d23c2b07f641df8da14bf5428ad8282b57b2695243 languageName: node linkType: hard From 6d9e6cb691b16bb1818aefc305ae972125cc1ff8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 18 Aug 2023 14:01:20 +0000 Subject: [PATCH 6/6] chore(deps): update dependency better-sqlite3 to v8.5.1 Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 2cca947100..1a10972dcb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20181,13 +20181,13 @@ __metadata: linkType: hard "better-sqlite3@npm:^8.0.0": - version: 8.5.0 - resolution: "better-sqlite3@npm:8.5.0" + version: 8.5.1 + resolution: "better-sqlite3@npm:8.5.1" dependencies: bindings: ^1.5.0 node-gyp: latest prebuild-install: ^7.1.0 - checksum: 98243cb08a410fad0b5c443410428c8ea00376a4eb7d2c9a8a5a695970bc7a2a4007221930460939594d728e7d6bcb1889f46ec11a3bbb2257b996c80fbaacb1 + checksum: ba06e7ae5d150f8d9dc77daff6299689476337b820fd82dae5bd844d39009c605e595758145b453362dc68e37041c285ae4cc73d63028b9e4a085b5ad2d3a2c4 languageName: node linkType: hard