@backstage-community/plugin-badges-backend 0.4.5 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @backstage-community/plugin-badges-backend
2
2
 
3
+ ## 0.5.1
4
+
5
+ ### Patch Changes
6
+
7
+ - bdf5b08: Removed deprecated `tokenManager` and `identity` in favor of new auth services
8
+
9
+ ## 0.5.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 82bc0cd: APIs now accept color and style query parameters to support badge customization.
14
+
3
15
  ## 0.4.5
4
16
 
5
17
  ### Patch Changes
package/README.md CHANGED
@@ -180,6 +180,15 @@ The badges backend api exposes two main endpoints for entity badges. The
180
180
  [BadgeSpec](https://github.com/backstage/backstage/tree/master/plugins/badges/src/api/types.ts)
181
181
  from the frontend plugin for a type declaration.
182
182
 
183
+ ### Custom badge styles
184
+
185
+ The badge builder supports custom badge styles and colors.
186
+ While requesting a badge or badge spec JSON, you can pass the `style` and `color` query parameters to customize the badge.
187
+
188
+ ```http
189
+ GET /badge/entity/:entityUuid/badge-specs?style=flat&color=blue
190
+ ```
191
+
183
192
  ## Links
184
193
 
185
194
  - [Frontend part of the plugin](https://github.com/backstage/backstage/tree/master/plugins/badges)
package/dist/index.cjs.js CHANGED
@@ -39,7 +39,8 @@ const createDefaultBadgeFactories = () => ({
39
39
  label: context.entity.kind,
40
40
  link: entityUrl(context),
41
41
  message: context.entity.metadata.name,
42
- style: "flat-square"
42
+ style: context.style || "flat-square",
43
+ color: context.color
43
44
  };
44
45
  }
45
46
  },
@@ -54,7 +55,8 @@ const createDefaultBadgeFactories = () => ({
54
55
  label: "lifecycle",
55
56
  link: entityUrl(context),
56
57
  message: `${context.entity.spec?.lifecycle || "unknown"}`,
57
- style: "flat-square"
58
+ style: context.style || "flat-square",
59
+ color: context.color
58
60
  };
59
61
  }
60
62
  },
@@ -69,7 +71,8 @@ const createDefaultBadgeFactories = () => ({
69
71
  label: "owner",
70
72
  link: entityUrl(context),
71
73
  message: `${context.entity.spec?.owner || "unknown"}`,
72
- style: "flat-square"
74
+ style: context.style || "flat-square",
75
+ color: context.color
73
76
  };
74
77
  }
75
78
  },
@@ -84,7 +87,8 @@ const createDefaultBadgeFactories = () => ({
84
87
  label: "docs",
85
88
  link: `${entityUrl(context)}/docs`,
86
89
  message: context.entity.metadata.name,
87
- style: "flat-square"
90
+ style: context.style || "flat-square",
91
+ color: context.color
88
92
  };
89
93
  }
90
94
  }
@@ -146,6 +150,14 @@ class DefaultBadgeBuilder {
146
150
  }
147
151
  }
148
152
 
153
+ const BADGE_STYLES = [
154
+ "plastic",
155
+ "flat",
156
+ "flat-square",
157
+ "for-the-badge",
158
+ "social"
159
+ ];
160
+
149
161
  const migrationsDir = backendCommon.resolvePackagePath(
150
162
  "@backstage-community/plugin-badges-backend",
151
163
  // Package name
@@ -246,12 +258,15 @@ async function obfuscatedRoute(router, catalog, badgeBuilder, logger, options, c
246
258
  `No ${kind} entity in ${namespace} named "${name}"`
247
259
  );
248
260
  }
261
+ const bsOptions = parseBadgeStyleOptions(req.query);
249
262
  const specs = [];
250
263
  for (const badgeInfo of await badgeBuilder.getBadges()) {
251
264
  const context = {
252
- badgeUrl: `${baseUrl}/entity/${entityUuid}/${badgeInfo.id}`,
265
+ badgeUrl: `${baseUrl}/entity/${entityUuid}/${badgeInfo.id}${buildBadgeStyleOptionsQuery(bsOptions)}`,
253
266
  config,
254
- entity
267
+ entity,
268
+ style: bsOptions.style,
269
+ color: bsOptions.style
255
270
  };
256
271
  const badge = await badgeBuilder.createBadgeJson({
257
272
  badgeInfo,
@@ -288,12 +303,17 @@ async function obfuscatedRoute(router, catalog, badgeBuilder, logger, options, c
288
303
  if (req.query.format === "json") {
289
304
  format = "application/json";
290
305
  }
306
+ const bsOptions = parseBadgeStyleOptions(req.query);
291
307
  const badgeOptions = {
292
308
  badgeInfo: { id: badgeId },
293
309
  context: {
294
- badgeUrl: `${baseUrl}/entity/${entityUuid}/${badgeId}`,
310
+ badgeUrl: `${baseUrl}/entity/${entityUuid}/${badgeId}${buildBadgeStyleOptionsQuery(
311
+ bsOptions
312
+ )}`,
295
313
  config,
296
- entity
314
+ entity,
315
+ style: bsOptions.style,
316
+ color: bsOptions.color
297
317
  }
298
318
  };
299
319
  let data;
@@ -359,13 +379,18 @@ async function nonObfuscatedRoute(router, catalog, badgeBuilder, config, baseUrl
359
379
  `No ${kind} entity in ${namespace} named "${name}"`
360
380
  );
361
381
  }
382
+ const bsOptions = parseBadgeStyleOptions(req.query);
362
383
  const specs = [];
363
384
  for (const badgeInfo of await badgeBuilder.getBadges()) {
364
385
  const badgeId = badgeInfo.id;
365
386
  const context = {
366
- badgeUrl: `${baseUrl}/entity/${namespace}/${kind}/${name}/badge/${badgeId}`,
387
+ badgeUrl: `${baseUrl}/entity/${namespace}/${kind}/${name}/badge/${badgeId}${buildBadgeStyleOptionsQuery(
388
+ bsOptions
389
+ )}`,
367
390
  config,
368
- entity
391
+ entity,
392
+ style: bsOptions.style,
393
+ color: bsOptions.color
369
394
  };
370
395
  const badge = await badgeBuilder.createBadgeJson({
371
396
  badgeInfo,
@@ -396,12 +421,17 @@ async function nonObfuscatedRoute(router, catalog, badgeBuilder, config, baseUrl
396
421
  if (req.query.format === "json") {
397
422
  format = "application/json";
398
423
  }
424
+ const bsOptions = parseBadgeStyleOptions(req.query);
399
425
  const badgeOptions = {
400
426
  badgeInfo: { id: badgeId },
401
427
  context: {
402
- badgeUrl: `${baseUrl}/entity/${namespace}/${kind}/${name}/badge/${badgeId}`,
428
+ badgeUrl: `${baseUrl}/entity/${namespace}/${kind}/${name}/badge/${badgeId}${buildBadgeStyleOptionsQuery(
429
+ bsOptions
430
+ )}`,
403
431
  config,
404
- entity
432
+ entity,
433
+ style: bsOptions.style,
434
+ color: bsOptions.color
405
435
  }
406
436
  };
407
437
  let data;
@@ -421,14 +451,30 @@ async function nonObfuscatedRoute(router, catalog, badgeBuilder, config, baseUrl
421
451
  router.use(backendCommon.errorHandler());
422
452
  return router;
423
453
  }
424
-
425
- const BADGE_STYLES = [
426
- "plastic",
427
- "flat",
428
- "flat-square",
429
- "for-the-badge",
430
- "social"
431
- ];
454
+ function parseBadgeStyleOptions(query) {
455
+ let style = void 0;
456
+ let color = void 0;
457
+ if (typeof query.style === "string" && BADGE_STYLES.includes(query.style)) {
458
+ style = query.style;
459
+ }
460
+ if (typeof query.color === "string") {
461
+ color = query.color;
462
+ }
463
+ return { style, color };
464
+ }
465
+ function buildBadgeStyleOptionsQuery({
466
+ style,
467
+ color
468
+ }) {
469
+ const query = [];
470
+ if (style) {
471
+ query.push(`style=${style}`);
472
+ }
473
+ if (color) {
474
+ query.push(`color=${color}`);
475
+ }
476
+ return query.length > 0 ? `?${query.join("&")}` : "";
477
+ }
432
478
 
433
479
  const badgesPlugin = backendPluginApi.createBackendPlugin({
434
480
  pluginId: "badges",
@@ -438,30 +484,17 @@ const badgesPlugin = backendPluginApi.createBackendPlugin({
438
484
  config: backendPluginApi.coreServices.rootConfig,
439
485
  logger: backendPluginApi.coreServices.logger,
440
486
  discovery: backendPluginApi.coreServices.discovery,
441
- tokenManager: backendPluginApi.coreServices.tokenManager,
442
- identity: backendPluginApi.coreServices.identity,
443
487
  httpRouter: backendPluginApi.coreServices.httpRouter,
444
488
  httpAuth: backendPluginApi.coreServices.httpAuth,
445
489
  auth: backendPluginApi.coreServices.auth
446
490
  },
447
- async init({
448
- config,
449
- logger,
450
- discovery,
451
- tokenManager,
452
- identity,
453
- httpRouter,
454
- httpAuth,
455
- auth
456
- }) {
491
+ async init({ config, logger, discovery, httpRouter, httpAuth, auth }) {
457
492
  httpRouter.use(
458
493
  await createRouter({
459
494
  config,
460
495
  logger,
461
496
  badgeFactories: createDefaultBadgeFactories(),
462
497
  discovery,
463
- tokenManager,
464
- identity,
465
498
  httpAuth,
466
499
  auth
467
500
  })
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../src/badges.ts","../src/lib/BadgeBuilder/DefaultBadgeBuilder.ts","../src/database/badgesStore.ts","../src/service/router.ts","../src/types.ts","../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DEFAULT_NAMESPACE } from '@backstage/catalog-model';\nimport { InputError } from '@backstage/errors';\nimport { Badge, BadgeContext, BadgeFactories } from './types';\n\nfunction appTitle(context: BadgeContext): string {\n return context.config.getOptionalString('app.title') || 'Backstage';\n}\n\nfunction entityUrl(context: BadgeContext): string {\n const e = context.entity!;\n const entityUri = `${e.metadata.namespace || DEFAULT_NAMESPACE}/${e.kind}/${\n e.metadata.name\n }`;\n const catalogUrl = `${context.config.getString('app.baseUrl')}/catalog`;\n return `${catalogUrl}/${entityUri}`.toLowerCase();\n}\n\n/** @public */\nexport const createDefaultBadgeFactories = (): BadgeFactories => ({\n pingback: {\n createBadge: (context: BadgeContext): Badge => {\n if (!context.entity) {\n throw new InputError('\"pingback\" badge only defined for entities');\n }\n return {\n description: `Link to ${context.entity.metadata.name} in ${appTitle(\n context,\n )}`,\n kind: 'entity',\n label: context.entity.kind,\n link: entityUrl(context),\n message: context.entity.metadata.name,\n style: 'flat-square',\n };\n },\n },\n\n lifecycle: {\n createBadge: (context: BadgeContext): Badge => {\n if (!context.entity) {\n throw new InputError('\"lifecycle\" badge only defined for entities');\n }\n return {\n description: 'Entity lifecycle badge',\n kind: 'entity',\n label: 'lifecycle',\n link: entityUrl(context),\n message: `${context.entity.spec?.lifecycle || 'unknown'}`,\n style: 'flat-square',\n };\n },\n },\n\n owner: {\n createBadge: (context: BadgeContext): Badge => {\n if (!context.entity) {\n throw new InputError('\"owner\" badge only defined for entities');\n }\n return {\n description: 'Entity owner badge',\n kind: 'entity',\n label: 'owner',\n link: entityUrl(context),\n message: `${context.entity.spec?.owner || 'unknown'}`,\n style: 'flat-square',\n };\n },\n },\n\n docs: {\n createBadge: (context: BadgeContext): Badge => {\n if (!context.entity) {\n throw new InputError('\"docs\" badge only defined for entities');\n }\n return {\n description: 'Entity docs badge',\n kind: 'entity',\n label: 'docs',\n link: `${entityUrl(context)}/docs`,\n message: context.entity.metadata.name,\n style: 'flat-square',\n };\n },\n },\n});\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { InputError } from '@backstage/errors';\nimport { makeBadge, Format } from 'badge-maker';\nimport { BadgeBuilder, BadgeInfo, BadgeOptions, BadgeSpec } from './types';\nimport { Badge, BadgeFactories } from '../../types';\n\n/** @public */\nexport class DefaultBadgeBuilder implements BadgeBuilder {\n constructor(private readonly factories: BadgeFactories) {}\n\n public async getBadges(): Promise<BadgeInfo[]> {\n return Object.keys(this.factories).map(id => ({ id }));\n }\n\n public async createBadgeJson(options: BadgeOptions): Promise<BadgeSpec> {\n const factory = this.factories[options.badgeInfo.id];\n const badge = factory\n ? factory.createBadge(options.context)\n : ({\n label: 'unknown badge',\n message: options.badgeInfo.id,\n color: 'red',\n } as Badge);\n\n if (!badge) {\n throw new InputError(\n `The badge factory failed to produce a \"${options.badgeInfo.id}\" badge with the provided context`,\n );\n }\n\n return {\n badge,\n id: options.badgeInfo.id,\n url: options.context.badgeUrl,\n markdown: this.getMarkdownCode(badge, options.context.badgeUrl),\n };\n }\n\n public async createBadgeSvg(options: BadgeOptions): Promise<string> {\n const { badge } = await this.createBadgeJson(options);\n try {\n const format = {\n message: badge.message,\n color: badge.color || '#36BAA2',\n label: badge.label || '',\n labelColor: badge.labelColor || '',\n style: badge.style || 'flat-square',\n } as Format;\n return makeBadge(format);\n } catch (err) {\n return makeBadge({\n label: 'invalid badge',\n message: `${err}`,\n color: 'red',\n });\n }\n }\n\n protected getMarkdownCode(params: Badge, badgeUrl: string): string {\n let altText = `${params.label}: ${params.message}`;\n if (params.description && params.description !== params.label) {\n altText = `${params.description}, ${altText}`;\n }\n const tooltip = params.description ? ` \"${params.description}\"` : '';\n const img = `![${altText}](${badgeUrl}${tooltip})`;\n return params.link ? `[${img}](${params.link})` : img;\n }\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n PluginDatabaseManager,\n resolvePackagePath,\n} from '@backstage/backend-common';\nimport { Knex } from 'knex';\nimport { isNil } from 'lodash';\nimport { v4 as uuidv4 } from 'uuid';\n\n/**\n * internal\n * @public\n */\nexport interface BadgesStore {\n getBadgeUuid(\n name: string,\n namespace: string,\n kind: string,\n ): Promise<{ uuid: string }>;\n\n getBadgeFromUuid(\n uuid: string,\n ): Promise<{ name: string; namespace: string; kind: string } | undefined>;\n}\n\nconst migrationsDir = resolvePackagePath(\n '@backstage-community/plugin-badges-backend', // Package name\n 'migrations', // Migrations directory\n);\n\n/**\n * DatabaseBadgesStore\n * @internal\n */\nexport class DatabaseBadgesStore implements BadgesStore {\n private constructor(private readonly db: Knex) {}\n\n static async create({\n database,\n skipMigrations,\n }: {\n database: PluginDatabaseManager;\n skipMigrations?: boolean;\n }): Promise<DatabaseBadgesStore> {\n const client = await database.getClient();\n\n if (!database.migrations?.skip && !skipMigrations) {\n await client.migrate.latest({\n directory: migrationsDir,\n });\n }\n\n return new DatabaseBadgesStore(client);\n }\n\n async getBadgeFromUuid(\n uuid: string,\n ): Promise<{ name: string; namespace: string; kind: string } | undefined> {\n const result = await this.db('badges')\n .select('namespace', 'name', 'kind')\n .where({ uuid: uuid })\n .first();\n\n return result;\n }\n\n async getBadgeUuid(\n name: string,\n namespace: string,\n kind: string,\n ): Promise<{ uuid: string }> {\n const result = await this.db('badges')\n .select('uuid')\n .where({ name: name, namespace: namespace, kind: kind })\n .first();\n\n let uuid = result?.uuid;\n\n if (isNil(uuid)) {\n uuid = uuidv4();\n\n await this.db('badges')\n .insert({\n uuid: uuid,\n name: name,\n namespace: namespace,\n kind: kind,\n })\n .onConflict(['name', 'namespace', 'kind'])\n .ignore();\n }\n\n return { uuid };\n }\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport express from 'express';\nimport Router from 'express-promise-router';\nimport {\n createLegacyAuthAdapters,\n DatabaseManager,\n errorHandler,\n PluginEndpointDiscovery,\n TokenManager,\n} from '@backstage/backend-common';\nimport { CatalogApi, CatalogClient } from '@backstage/catalog-client';\nimport { Config } from '@backstage/config';\nimport { NotFoundError } from '@backstage/errors';\nimport { BadgeBuilder, DefaultBadgeBuilder } from '../lib/BadgeBuilder';\nimport { BadgeContext, BadgeFactories } from '../types';\nimport { isNil } from 'lodash';\nimport { IdentityApi } from '@backstage/plugin-auth-node';\nimport { BadgesStore, DatabaseBadgesStore } from '../database/badgesStore';\nimport { createDefaultBadgeFactories } from '../badges';\nimport {\n AuthService,\n HttpAuthService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport interface RouterOptions {\n badgeBuilder?: BadgeBuilder;\n badgeFactories?: BadgeFactories;\n catalog?: CatalogApi;\n config: Config;\n discovery: PluginEndpointDiscovery;\n tokenManager: TokenManager;\n auth?: AuthService;\n httpAuth?: HttpAuthService;\n logger: LoggerService;\n identity: IdentityApi;\n badgeStore?: BadgesStore;\n}\n\n/** @public */\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const catalog =\n options.catalog || new CatalogClient({ discoveryApi: options.discovery });\n const badgeBuilder =\n options.badgeBuilder ||\n new DefaultBadgeBuilder(\n options.badgeFactories || createDefaultBadgeFactories(),\n );\n const router = Router();\n\n const { config, logger, discovery } = options;\n const baseUrl = await discovery.getExternalBaseUrl('badges');\n\n const { auth, httpAuth } = createLegacyAuthAdapters(options);\n\n if (config.getOptionalBoolean('app.badges.obfuscate')) {\n return obfuscatedRoute(\n router,\n catalog,\n badgeBuilder,\n logger,\n options,\n config,\n baseUrl,\n auth,\n httpAuth,\n );\n }\n return nonObfuscatedRoute(\n router,\n catalog,\n badgeBuilder,\n config,\n baseUrl,\n auth,\n );\n}\n\nasync function obfuscatedRoute(\n router: express.Router,\n catalog: CatalogApi,\n badgeBuilder: BadgeBuilder,\n logger: LoggerService,\n options: RouterOptions,\n config: Config,\n baseUrl: string,\n auth: AuthService,\n httpAuth: HttpAuthService,\n) {\n logger.info('Badges obfuscation is enabled');\n\n const store = options.badgeStore\n ? options.badgeStore\n : await DatabaseBadgesStore.create({\n database: DatabaseManager.fromConfig(config).forPlugin('badges'),\n });\n\n router.get('/entity/:entityUuid/badge-specs', async (req, res) => {\n const { entityUuid } = req.params;\n\n // Retrieve the badge info from the database\n const badgeInfos = await store.getBadgeFromUuid(entityUuid);\n\n if (isNil(badgeInfos)) {\n throw new NotFoundError(`No badge found for entity uuid \"${entityUuid}\"`);\n }\n\n // If a mapping is found, map name, namespace and kind\n const name = badgeInfos.name;\n const namespace = badgeInfos.namespace;\n const kind = badgeInfos.kind;\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n\n // Query the catalog with the name, namespace, kind to get the entity information\n const entity = await catalog.getEntityByRef(\n { namespace, kind, name },\n { token },\n );\n\n if (isNil(entity)) {\n throw new NotFoundError(\n `No ${kind} entity in ${namespace} named \"${name}\"`,\n );\n }\n\n // Create the badge specs\n const specs = [];\n for (const badgeInfo of await badgeBuilder.getBadges()) {\n const context: BadgeContext = {\n badgeUrl: `${baseUrl}/entity/${entityUuid}/${badgeInfo.id}`,\n config: config,\n entity,\n };\n\n const badge = await badgeBuilder.createBadgeJson({\n badgeInfo,\n context,\n });\n specs.push(badge);\n }\n\n res.status(200).json(specs);\n });\n\n router.get('/entity/:entityUuid/:badgeId', async (req, res) => {\n const { entityUuid, badgeId } = req.params;\n\n // Retrieve the badge info from the database\n const badgeInfo = await store.getBadgeFromUuid(entityUuid);\n\n if (isNil(badgeInfo)) {\n throw new NotFoundError(`No badge found for entity uuid \"${entityUuid}\"`);\n }\n\n // If a mapping is found, map name, namespace and kind\n const name = badgeInfo.name;\n const namespace = badgeInfo.namespace;\n const kind = badgeInfo.kind;\n\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n\n const entity = await catalog.getEntityByRef(\n { namespace, kind, name },\n { token },\n );\n if (isNil(entity)) {\n throw new NotFoundError(\n `No ${kind} entity in ${namespace} named \"${name}\"`,\n res.sendStatus(404),\n );\n }\n\n let format =\n req.accepts(['image/svg+xml', 'application/json']) || 'image/svg+xml';\n if (req.query.format === 'json') {\n format = 'application/json';\n }\n\n const badgeOptions = {\n badgeInfo: { id: badgeId },\n context: {\n badgeUrl: `${baseUrl}/entity/${entityUuid}/${badgeId}`,\n config: config,\n entity,\n },\n };\n\n let data: string;\n if (format === 'application/json') {\n data = JSON.stringify(\n await badgeBuilder.createBadgeJson(badgeOptions),\n null,\n 2,\n );\n } else {\n data = await badgeBuilder.createBadgeSvg(badgeOptions);\n }\n\n res.setHeader('Content-Type', format);\n res.status(200).send(data);\n });\n\n router.get(\n '/entity/:namespace/:kind/:name/obfuscated',\n async function authenticate(req, _res, next) {\n const { kind, namespace, name } = req.params;\n\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await httpAuth.credentials(req),\n targetPluginId: 'catalog',\n });\n\n // check that the user has the correct permissions\n // to view the catalog entity by forwarding the token\n const entity = await catalog.getEntityByRef(\n { kind, namespace, name },\n { token },\n );\n\n if (!entity) {\n throw new NotFoundError(\n `No ${kind} entity in ${namespace} named \"${name}\"`,\n );\n } else {\n next();\n }\n },\n async (req, res) => {\n const { namespace, kind, name } = req.params;\n const storedEntityUuid: { uuid: string } | undefined =\n await store.getBadgeUuid(name, namespace, kind);\n\n if (isNil(storedEntityUuid)) {\n throw new NotFoundError(\n `No uuid found for entity \"${namespace}/${kind}/${name}\"`,\n );\n }\n\n return res.status(200).json(storedEntityUuid);\n },\n );\n\n router.use(errorHandler());\n\n return router;\n}\n\nasync function nonObfuscatedRoute(\n router: express.Router,\n catalog: CatalogApi,\n badgeBuilder: BadgeBuilder,\n config: Config,\n baseUrl: string,\n auth: AuthService,\n) {\n router.get('/entity/:namespace/:kind/:name/badge-specs', async (req, res) => {\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n\n const { namespace, kind, name } = req.params;\n const entity = await catalog.getEntityByRef(\n { namespace, kind, name },\n { token },\n );\n if (!entity) {\n throw new NotFoundError(\n `No ${kind} entity in ${namespace} named \"${name}\"`,\n );\n }\n\n const specs = [];\n for (const badgeInfo of await badgeBuilder.getBadges()) {\n const badgeId = badgeInfo.id;\n const context: BadgeContext = {\n badgeUrl: `${baseUrl}/entity/${namespace}/${kind}/${name}/badge/${badgeId}`,\n config: config,\n entity,\n };\n\n const badge = await badgeBuilder.createBadgeJson({\n badgeInfo,\n context,\n });\n specs.push(badge);\n }\n\n res.status(200).json(specs);\n });\n\n router.get(\n '/entity/:namespace/:kind/:name/badge/:badgeId',\n async (req, res) => {\n const { namespace, kind, name, badgeId } = req.params;\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n\n const entity = await catalog.getEntityByRef(\n { namespace, kind, name },\n { token },\n );\n\n if (!entity) {\n throw new NotFoundError(\n `No ${kind} entity in ${namespace} named \"${name}\"`,\n );\n }\n\n let format =\n req.accepts(['image/svg+xml', 'application/json']) || 'image/svg+xml';\n if (req.query.format === 'json') {\n format = 'application/json';\n }\n\n const badgeOptions = {\n badgeInfo: { id: badgeId },\n context: {\n badgeUrl: `${baseUrl}/entity/${namespace}/${kind}/${name}/badge/${badgeId}`,\n config: config,\n entity,\n },\n };\n\n let data: string;\n if (format === 'application/json') {\n data = JSON.stringify(\n await badgeBuilder.createBadgeJson(badgeOptions),\n null,\n 2,\n );\n } else {\n data = await badgeBuilder.createBadgeSvg(badgeOptions);\n }\n\n res.setHeader('Content-Type', format);\n res.status(200).send(data);\n },\n );\n\n router.use(errorHandler());\n\n return router;\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Config } from '@backstage/config';\nimport { Entity } from '@backstage/catalog-model';\n\n/** @public */\nexport const BADGE_STYLES = [\n 'plastic',\n 'flat',\n 'flat-square',\n 'for-the-badge',\n 'social',\n] as const;\n\n/** @public */\nexport type BadgeStyle = (typeof BADGE_STYLES)[number];\n\n/** @public */\nexport interface Badge {\n /** Badge message background color. */\n color?: string;\n /** Badge description (tooltip text) */\n description?: string;\n /** Kind of badge */\n kind?: 'entity';\n /**\n * Badge label (should be a rather static value)\n * ref. shields spec https://github.com/badges/shields/blob/master/spec/SPECIFICATION.md\n */\n label: string;\n /** Badge label background color */\n labelColor?: string;\n /** Custom badge link */\n link?: string;\n /** Badge message */\n message: string;\n /** Badge style (appearance). One of \"plastic\", \"flat\", \"flat-square\", \"for-the-badge\" and \"social\" */\n style?: BadgeStyle;\n}\n\n/** @public */\nexport interface BadgeContext {\n badgeUrl: string;\n config: Config;\n entity?: Entity; // for entity badges\n}\n\n/** @public */\nexport interface BadgeFactory {\n createBadge(context: BadgeContext): Badge;\n}\n\n/** @public */\nexport interface BadgeFactories {\n [id: string]: BadgeFactory;\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\nimport { createDefaultBadgeFactories } from './badges';\n\n/**\n * Badges backend plugin\n *\n * @public\n */\nexport const badgesPlugin = createBackendPlugin({\n pluginId: 'badges',\n register(env) {\n env.registerInit({\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n discovery: coreServices.discovery,\n tokenManager: coreServices.tokenManager,\n identity: coreServices.identity,\n httpRouter: coreServices.httpRouter,\n httpAuth: coreServices.httpAuth,\n auth: coreServices.auth,\n },\n async init({\n config,\n logger,\n discovery,\n tokenManager,\n identity,\n httpRouter,\n httpAuth,\n auth,\n }) {\n httpRouter.use(\n await createRouter({\n config,\n logger,\n badgeFactories: createDefaultBadgeFactories(),\n discovery,\n tokenManager,\n identity,\n httpAuth,\n auth,\n }),\n );\n httpRouter.addAuthPolicy({\n path: '/entity/:entityUuid/:badgeId',\n allow: 'unauthenticated',\n });\n httpRouter.addAuthPolicy({\n path: '/entity/:namespace/:kind/:name/badge/:badgeId',\n allow: 'unauthenticated',\n });\n },\n });\n },\n});\n"],"names":["DEFAULT_NAMESPACE","InputError","makeBadge","resolvePackagePath","uuid","isNil","uuidv4","CatalogClient","Router","createLegacyAuthAdapters","DatabaseManager","NotFoundError","errorHandler","createBackendPlugin","coreServices"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../src/badges.ts","../src/lib/BadgeBuilder/DefaultBadgeBuilder.ts","../src/types.ts","../src/database/badgesStore.ts","../src/service/router.ts","../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DEFAULT_NAMESPACE } from '@backstage/catalog-model';\nimport { InputError } from '@backstage/errors';\nimport { Badge, BadgeContext, BadgeFactories } from './types';\n\nfunction appTitle(context: BadgeContext): string {\n return context.config.getOptionalString('app.title') || 'Backstage';\n}\n\nfunction entityUrl(context: BadgeContext): string {\n const e = context.entity!;\n const entityUri = `${e.metadata.namespace || DEFAULT_NAMESPACE}/${e.kind}/${\n e.metadata.name\n }`;\n const catalogUrl = `${context.config.getString('app.baseUrl')}/catalog`;\n return `${catalogUrl}/${entityUri}`.toLowerCase();\n}\n\n/** @public */\nexport const createDefaultBadgeFactories = (): BadgeFactories => ({\n pingback: {\n createBadge: (context: BadgeContext): Badge => {\n if (!context.entity) {\n throw new InputError('\"pingback\" badge only defined for entities');\n }\n return {\n description: `Link to ${context.entity.metadata.name} in ${appTitle(\n context,\n )}`,\n kind: 'entity',\n label: context.entity.kind,\n link: entityUrl(context),\n message: context.entity.metadata.name,\n style: context.style || 'flat-square',\n color: context.color,\n };\n },\n },\n\n lifecycle: {\n createBadge: (context: BadgeContext): Badge => {\n if (!context.entity) {\n throw new InputError('\"lifecycle\" badge only defined for entities');\n }\n return {\n description: 'Entity lifecycle badge',\n kind: 'entity',\n label: 'lifecycle',\n link: entityUrl(context),\n message: `${context.entity.spec?.lifecycle || 'unknown'}`,\n style: context.style || 'flat-square',\n color: context.color,\n };\n },\n },\n\n owner: {\n createBadge: (context: BadgeContext): Badge => {\n if (!context.entity) {\n throw new InputError('\"owner\" badge only defined for entities');\n }\n return {\n description: 'Entity owner badge',\n kind: 'entity',\n label: 'owner',\n link: entityUrl(context),\n message: `${context.entity.spec?.owner || 'unknown'}`,\n style: context.style || 'flat-square',\n color: context.color,\n };\n },\n },\n\n docs: {\n createBadge: (context: BadgeContext): Badge => {\n if (!context.entity) {\n throw new InputError('\"docs\" badge only defined for entities');\n }\n return {\n description: 'Entity docs badge',\n kind: 'entity',\n label: 'docs',\n link: `${entityUrl(context)}/docs`,\n message: context.entity.metadata.name,\n style: context.style || 'flat-square',\n color: context.color,\n };\n },\n },\n});\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { InputError } from '@backstage/errors';\nimport { makeBadge, Format } from 'badge-maker';\nimport { BadgeBuilder, BadgeInfo, BadgeOptions, BadgeSpec } from './types';\nimport { Badge, BadgeFactories } from '../../types';\n\n/** @public */\nexport class DefaultBadgeBuilder implements BadgeBuilder {\n constructor(private readonly factories: BadgeFactories) {}\n\n public async getBadges(): Promise<BadgeInfo[]> {\n return Object.keys(this.factories).map(id => ({ id }));\n }\n\n public async createBadgeJson(options: BadgeOptions): Promise<BadgeSpec> {\n const factory = this.factories[options.badgeInfo.id];\n const badge = factory\n ? factory.createBadge(options.context)\n : ({\n label: 'unknown badge',\n message: options.badgeInfo.id,\n color: 'red',\n } as Badge);\n\n if (!badge) {\n throw new InputError(\n `The badge factory failed to produce a \"${options.badgeInfo.id}\" badge with the provided context`,\n );\n }\n\n return {\n badge,\n id: options.badgeInfo.id,\n url: options.context.badgeUrl,\n markdown: this.getMarkdownCode(badge, options.context.badgeUrl),\n };\n }\n\n public async createBadgeSvg(options: BadgeOptions): Promise<string> {\n const { badge } = await this.createBadgeJson(options);\n try {\n const format = {\n message: badge.message,\n color: badge.color || '#36BAA2',\n label: badge.label || '',\n labelColor: badge.labelColor || '',\n style: badge.style || 'flat-square',\n } as Format;\n return makeBadge(format);\n } catch (err) {\n return makeBadge({\n label: 'invalid badge',\n message: `${err}`,\n color: 'red',\n });\n }\n }\n\n protected getMarkdownCode(params: Badge, badgeUrl: string): string {\n let altText = `${params.label}: ${params.message}`;\n if (params.description && params.description !== params.label) {\n altText = `${params.description}, ${altText}`;\n }\n const tooltip = params.description ? ` \"${params.description}\"` : '';\n const img = `![${altText}](${badgeUrl}${tooltip})`;\n return params.link ? `[${img}](${params.link})` : img;\n }\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Config } from '@backstage/config';\nimport { Entity } from '@backstage/catalog-model';\n\n/** @public */\nexport const BADGE_STYLES = [\n 'plastic',\n 'flat',\n 'flat-square',\n 'for-the-badge',\n 'social',\n] as const;\n\n/** @public */\nexport type BadgeStyle = (typeof BADGE_STYLES)[number];\n\n/** @public */\nexport interface Badge {\n /** Badge message background color. */\n color?: string;\n /** Badge description (tooltip text) */\n description?: string;\n /** Kind of badge */\n kind?: 'entity';\n /**\n * Badge label (should be a rather static value)\n * ref. shields spec https://github.com/badges/shields/blob/master/spec/SPECIFICATION.md\n */\n label: string;\n /** Badge label background color */\n labelColor?: string;\n /** Custom badge link */\n link?: string;\n /** Badge message */\n message: string;\n /** Badge style (appearance). One of \"plastic\", \"flat\", \"flat-square\", \"for-the-badge\" and \"social\" */\n style?: BadgeStyle;\n}\n\n/** @public */\nexport interface BadgeContext {\n badgeUrl: string;\n config: Config;\n entity?: Entity; // for entity badges\n\n color?: string; // for custom badges\n style?: BadgeStyle; // for custom badges\n}\n\n/** @public */\nexport interface BadgeFactory {\n createBadge(context: BadgeContext): Badge;\n}\n\n/** @public */\nexport interface BadgeFactories {\n [id: string]: BadgeFactory;\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n PluginDatabaseManager,\n resolvePackagePath,\n} from '@backstage/backend-common';\nimport { Knex } from 'knex';\nimport { isNil } from 'lodash';\nimport { v4 as uuidv4 } from 'uuid';\n\n/**\n * internal\n * @public\n */\nexport interface BadgesStore {\n getBadgeUuid(\n name: string,\n namespace: string,\n kind: string,\n ): Promise<{ uuid: string }>;\n\n getBadgeFromUuid(\n uuid: string,\n ): Promise<{ name: string; namespace: string; kind: string } | undefined>;\n}\n\nconst migrationsDir = resolvePackagePath(\n '@backstage-community/plugin-badges-backend', // Package name\n 'migrations', // Migrations directory\n);\n\n/**\n * DatabaseBadgesStore\n * @internal\n */\nexport class DatabaseBadgesStore implements BadgesStore {\n private constructor(private readonly db: Knex) {}\n\n static async create({\n database,\n skipMigrations,\n }: {\n database: PluginDatabaseManager;\n skipMigrations?: boolean;\n }): Promise<DatabaseBadgesStore> {\n const client = await database.getClient();\n\n if (!database.migrations?.skip && !skipMigrations) {\n await client.migrate.latest({\n directory: migrationsDir,\n });\n }\n\n return new DatabaseBadgesStore(client);\n }\n\n async getBadgeFromUuid(\n uuid: string,\n ): Promise<{ name: string; namespace: string; kind: string } | undefined> {\n const result = await this.db('badges')\n .select('namespace', 'name', 'kind')\n .where({ uuid: uuid })\n .first();\n\n return result;\n }\n\n async getBadgeUuid(\n name: string,\n namespace: string,\n kind: string,\n ): Promise<{ uuid: string }> {\n const result = await this.db('badges')\n .select('uuid')\n .where({ name: name, namespace: namespace, kind: kind })\n .first();\n\n let uuid = result?.uuid;\n\n if (isNil(uuid)) {\n uuid = uuidv4();\n\n await this.db('badges')\n .insert({\n uuid: uuid,\n name: name,\n namespace: namespace,\n kind: kind,\n })\n .onConflict(['name', 'namespace', 'kind'])\n .ignore();\n }\n\n return { uuid };\n }\n}\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport express from 'express';\nimport Router from 'express-promise-router';\nimport {\n createLegacyAuthAdapters,\n DatabaseManager,\n errorHandler,\n PluginEndpointDiscovery,\n TokenManager,\n} from '@backstage/backend-common';\nimport { CatalogApi, CatalogClient } from '@backstage/catalog-client';\nimport { Config } from '@backstage/config';\nimport { NotFoundError } from '@backstage/errors';\nimport { BadgeBuilder, DefaultBadgeBuilder } from '../lib/BadgeBuilder';\nimport {\n BADGE_STYLES,\n BadgeContext,\n BadgeFactories,\n BadgeStyle,\n} from '../types';\nimport { isNil } from 'lodash';\nimport { IdentityApi } from '@backstage/plugin-auth-node';\nimport { BadgesStore, DatabaseBadgesStore } from '../database/badgesStore';\nimport { createDefaultBadgeFactories } from '../badges';\nimport {\n AuthService,\n HttpAuthService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\n\n/** @public */\nexport interface RouterOptions {\n badgeBuilder?: BadgeBuilder;\n badgeFactories?: BadgeFactories;\n catalog?: CatalogApi;\n config: Config;\n discovery: PluginEndpointDiscovery;\n tokenManager?: TokenManager;\n auth?: AuthService;\n httpAuth?: HttpAuthService;\n logger: LoggerService;\n identity?: IdentityApi;\n badgeStore?: BadgesStore;\n}\n\n/** @public */\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const catalog =\n options.catalog || new CatalogClient({ discoveryApi: options.discovery });\n const badgeBuilder =\n options.badgeBuilder ||\n new DefaultBadgeBuilder(\n options.badgeFactories || createDefaultBadgeFactories(),\n );\n const router = Router();\n\n const { config, logger, discovery } = options;\n const baseUrl = await discovery.getExternalBaseUrl('badges');\n\n const { auth, httpAuth } = createLegacyAuthAdapters(options);\n\n if (config.getOptionalBoolean('app.badges.obfuscate')) {\n return obfuscatedRoute(\n router,\n catalog,\n badgeBuilder,\n logger,\n options,\n config,\n baseUrl,\n auth,\n httpAuth,\n );\n }\n return nonObfuscatedRoute(\n router,\n catalog,\n badgeBuilder,\n config,\n baseUrl,\n auth,\n );\n}\n\nasync function obfuscatedRoute(\n router: express.Router,\n catalog: CatalogApi,\n badgeBuilder: BadgeBuilder,\n logger: LoggerService,\n options: RouterOptions,\n config: Config,\n baseUrl: string,\n auth: AuthService,\n httpAuth: HttpAuthService,\n) {\n logger.info('Badges obfuscation is enabled');\n\n const store = options.badgeStore\n ? options.badgeStore\n : await DatabaseBadgesStore.create({\n database: DatabaseManager.fromConfig(config).forPlugin('badges'),\n });\n\n router.get('/entity/:entityUuid/badge-specs', async (req, res) => {\n const { entityUuid } = req.params;\n\n // Retrieve the badge info from the database\n const badgeInfos = await store.getBadgeFromUuid(entityUuid);\n\n if (isNil(badgeInfos)) {\n throw new NotFoundError(`No badge found for entity uuid \"${entityUuid}\"`);\n }\n\n // If a mapping is found, map name, namespace and kind\n const name = badgeInfos.name;\n const namespace = badgeInfos.namespace;\n const kind = badgeInfos.kind;\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n\n // Query the catalog with the name, namespace, kind to get the entity information\n const entity = await catalog.getEntityByRef(\n { namespace, kind, name },\n { token },\n );\n\n if (isNil(entity)) {\n throw new NotFoundError(\n `No ${kind} entity in ${namespace} named \"${name}\"`,\n );\n }\n\n const bsOptions = parseBadgeStyleOptions(req.query);\n\n // Create the badge specs\n const specs = [];\n for (const badgeInfo of await badgeBuilder.getBadges()) {\n const context: BadgeContext = {\n badgeUrl: `${baseUrl}/entity/${entityUuid}/${\n badgeInfo.id\n }${buildBadgeStyleOptionsQuery(bsOptions)}`,\n config: config,\n entity,\n style: bsOptions.style,\n color: bsOptions.style,\n };\n\n const badge = await badgeBuilder.createBadgeJson({\n badgeInfo,\n context,\n });\n specs.push(badge);\n }\n\n res.status(200).json(specs);\n });\n\n router.get('/entity/:entityUuid/:badgeId', async (req, res) => {\n const { entityUuid, badgeId } = req.params;\n\n // Retrieve the badge info from the database\n const badgeInfo = await store.getBadgeFromUuid(entityUuid);\n\n if (isNil(badgeInfo)) {\n throw new NotFoundError(`No badge found for entity uuid \"${entityUuid}\"`);\n }\n\n // If a mapping is found, map name, namespace and kind\n const name = badgeInfo.name;\n const namespace = badgeInfo.namespace;\n const kind = badgeInfo.kind;\n\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n\n const entity = await catalog.getEntityByRef(\n { namespace, kind, name },\n { token },\n );\n if (isNil(entity)) {\n throw new NotFoundError(\n `No ${kind} entity in ${namespace} named \"${name}\"`,\n res.sendStatus(404),\n );\n }\n\n let format =\n req.accepts(['image/svg+xml', 'application/json']) || 'image/svg+xml';\n if (req.query.format === 'json') {\n format = 'application/json';\n }\n\n const bsOptions = parseBadgeStyleOptions(req.query);\n\n const badgeOptions = {\n badgeInfo: { id: badgeId },\n context: {\n badgeUrl: `${baseUrl}/entity/${entityUuid}/${badgeId}${buildBadgeStyleOptionsQuery(\n bsOptions,\n )}`,\n config: config,\n entity,\n style: bsOptions.style,\n color: bsOptions.color,\n },\n };\n\n let data: string;\n if (format === 'application/json') {\n data = JSON.stringify(\n await badgeBuilder.createBadgeJson(badgeOptions),\n null,\n 2,\n );\n } else {\n data = await badgeBuilder.createBadgeSvg(badgeOptions);\n }\n\n res.setHeader('Content-Type', format);\n res.status(200).send(data);\n });\n\n router.get(\n '/entity/:namespace/:kind/:name/obfuscated',\n async function authenticate(req, _res, next) {\n const { kind, namespace, name } = req.params;\n\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await httpAuth.credentials(req),\n targetPluginId: 'catalog',\n });\n\n // check that the user has the correct permissions\n // to view the catalog entity by forwarding the token\n const entity = await catalog.getEntityByRef(\n { kind, namespace, name },\n { token },\n );\n\n if (!entity) {\n throw new NotFoundError(\n `No ${kind} entity in ${namespace} named \"${name}\"`,\n );\n } else {\n next();\n }\n },\n async (req, res) => {\n const { namespace, kind, name } = req.params;\n const storedEntityUuid: { uuid: string } | undefined =\n await store.getBadgeUuid(name, namespace, kind);\n\n if (isNil(storedEntityUuid)) {\n throw new NotFoundError(\n `No uuid found for entity \"${namespace}/${kind}/${name}\"`,\n );\n }\n\n return res.status(200).json(storedEntityUuid);\n },\n );\n\n router.use(errorHandler());\n\n return router;\n}\n\nasync function nonObfuscatedRoute(\n router: express.Router,\n catalog: CatalogApi,\n badgeBuilder: BadgeBuilder,\n config: Config,\n baseUrl: string,\n auth: AuthService,\n) {\n router.get('/entity/:namespace/:kind/:name/badge-specs', async (req, res) => {\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n\n const { namespace, kind, name } = req.params;\n const entity = await catalog.getEntityByRef(\n { namespace, kind, name },\n { token },\n );\n if (!entity) {\n throw new NotFoundError(\n `No ${kind} entity in ${namespace} named \"${name}\"`,\n );\n }\n\n const bsOptions = parseBadgeStyleOptions(req.query);\n\n const specs = [];\n for (const badgeInfo of await badgeBuilder.getBadges()) {\n const badgeId = badgeInfo.id;\n const context: BadgeContext = {\n badgeUrl: `${baseUrl}/entity/${namespace}/${kind}/${name}/badge/${badgeId}${buildBadgeStyleOptionsQuery(\n bsOptions,\n )}`,\n config: config,\n entity,\n style: bsOptions.style,\n color: bsOptions.color,\n };\n\n const badge = await badgeBuilder.createBadgeJson({\n badgeInfo,\n context,\n });\n specs.push(badge);\n }\n\n res.status(200).json(specs);\n });\n\n router.get(\n '/entity/:namespace/:kind/:name/badge/:badgeId',\n async (req, res) => {\n const { namespace, kind, name, badgeId } = req.params;\n const { token } = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId: 'catalog',\n });\n\n const entity = await catalog.getEntityByRef(\n { namespace, kind, name },\n { token },\n );\n\n if (!entity) {\n throw new NotFoundError(\n `No ${kind} entity in ${namespace} named \"${name}\"`,\n );\n }\n\n let format =\n req.accepts(['image/svg+xml', 'application/json']) || 'image/svg+xml';\n if (req.query.format === 'json') {\n format = 'application/json';\n }\n\n const bsOptions = parseBadgeStyleOptions(req.query);\n\n const badgeOptions = {\n badgeInfo: { id: badgeId },\n context: {\n badgeUrl: `${baseUrl}/entity/${namespace}/${kind}/${name}/badge/${badgeId}${buildBadgeStyleOptionsQuery(\n bsOptions,\n )}`,\n config: config,\n entity,\n style: bsOptions.style,\n color: bsOptions.color,\n },\n };\n\n let data: string;\n if (format === 'application/json') {\n data = JSON.stringify(\n await badgeBuilder.createBadgeJson(badgeOptions),\n null,\n 2,\n );\n } else {\n data = await badgeBuilder.createBadgeSvg(badgeOptions);\n }\n\n res.setHeader('Content-Type', format);\n res.status(200).send(data);\n },\n );\n\n router.use(errorHandler());\n\n return router;\n}\n\ninterface BadgeStyleOptions {\n style?: BadgeStyle;\n color?: string;\n}\n\n// Parse common badge style options from query parameters.\n//\n// This function will parse the following query parameters:\n// - `style`: One of the supported badge styles.\n// - `color`: A custom color for the badge message.\nfunction parseBadgeStyleOptions(query: qs.ParsedQs): BadgeStyleOptions {\n let style: BadgeStyle | undefined = undefined;\n let color: string | undefined = undefined;\n\n if (\n typeof query.style === 'string' &&\n BADGE_STYLES.includes(query.style as any)\n ) {\n style = query.style as BadgeStyle;\n }\n\n if (typeof query.color === 'string') {\n color = query.color;\n }\n\n return { style, color };\n}\n\n// Build a query string including explanation mark if there are any options.\nfunction buildBadgeStyleOptionsQuery({\n style,\n color,\n}: BadgeStyleOptions): string {\n const query: string[] = [];\n\n if (style) {\n query.push(`style=${style}`);\n }\n\n if (color) {\n query.push(`color=${color}`);\n }\n\n return query.length > 0 ? `?${query.join('&')}` : '';\n}\n","/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { createRouter } from './service/router';\nimport { createDefaultBadgeFactories } from './badges';\n\n/**\n * Badges backend plugin\n *\n * @public\n */\nexport const badgesPlugin = createBackendPlugin({\n pluginId: 'badges',\n register(env) {\n env.registerInit({\n deps: {\n config: coreServices.rootConfig,\n logger: coreServices.logger,\n discovery: coreServices.discovery,\n httpRouter: coreServices.httpRouter,\n httpAuth: coreServices.httpAuth,\n auth: coreServices.auth,\n },\n async init({ config, logger, discovery, httpRouter, httpAuth, auth }) {\n httpRouter.use(\n await createRouter({\n config,\n logger,\n badgeFactories: createDefaultBadgeFactories(),\n discovery,\n httpAuth,\n auth,\n }),\n );\n httpRouter.addAuthPolicy({\n path: '/entity/:entityUuid/:badgeId',\n allow: 'unauthenticated',\n });\n httpRouter.addAuthPolicy({\n path: '/entity/:namespace/:kind/:name/badge/:badgeId',\n allow: 'unauthenticated',\n });\n },\n });\n },\n});\n"],"names":["DEFAULT_NAMESPACE","InputError","makeBadge","resolvePackagePath","uuid","isNil","uuidv4","CatalogClient","Router","createLegacyAuthAdapters","DatabaseManager","NotFoundError","errorHandler","createBackendPlugin","coreServices"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -38,6 +38,8 @@ interface BadgeContext {
38
38
  badgeUrl: string;
39
39
  config: Config;
40
40
  entity?: Entity;
41
+ color?: string;
42
+ style?: BadgeStyle;
41
43
  }
42
44
  /** @public */
43
45
  interface BadgeFactory {
@@ -110,11 +112,11 @@ interface RouterOptions {
110
112
  catalog?: CatalogApi;
111
113
  config: Config;
112
114
  discovery: PluginEndpointDiscovery;
113
- tokenManager: TokenManager;
115
+ tokenManager?: TokenManager;
114
116
  auth?: AuthService;
115
117
  httpAuth?: HttpAuthService;
116
118
  logger: LoggerService;
117
- identity: IdentityApi;
119
+ identity?: IdentityApi;
118
120
  badgeStore?: BadgesStore;
119
121
  }
120
122
  /** @public */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage-community/plugin-badges-backend",
3
- "version": "0.4.5",
3
+ "version": "0.5.1",
4
4
  "description": "A Backstage backend plugin that generates README badges for your entities",
5
5
  "backstage": {
6
6
  "role": "backend-plugin",