diff --git a/plugins/badges-backend/src/lib/BadgeBuilder/DefaultBadgeBuilder.ts b/plugins/badges-backend/src/lib/BadgeBuilder/DefaultBadgeBuilder.ts index dad928e8ec..c1ff60056c 100644 --- a/plugins/badges-backend/src/lib/BadgeBuilder/DefaultBadgeBuilder.ts +++ b/plugins/badges-backend/src/lib/BadgeBuilder/DefaultBadgeBuilder.ts @@ -16,32 +16,36 @@ import { Logger } from 'winston'; import { makeBadge } from 'badge-maker'; -import { JsonObject } from '@backstage/config'; import { BadgeBuilder, BadgeOptions } from './types'; -import { Badge, BadgeStyle, BadgeStyles } from '../../types'; +import { Badge, BadgeConfig, BadgeStyle, BadgeStyles } from '../../types'; import { interpolate } from '../../utils'; export class DefaultBadgeBuilder implements BadgeBuilder { constructor( private readonly logger: Logger, - private readonly config: JsonObject, + private readonly config: BadgeConfig, ) { for (const [badgeId, badge] of Object.entries(config)) { - badge.id = badgeId; + if (badge) { + badge.id = badgeId; + } } } public async getAllBadgeConfigs(): Promise { - return Object.values(this.config) as Badge[]; + return Object.values(this.config); } public async getBadgeConfig(badgeId: string): Promise { - return ((this.config[badgeId] as unknown) || - (this.config.default as unknown) || { + return ( + this.config[badgeId] || + this.config.default || + ({ label: 'Unknown badge ID', message: badgeId, color: 'red', - }) as Badge; + } as Badge) + ); } public async createBadge(options: BadgeOptions): Promise { @@ -69,7 +73,7 @@ export class DefaultBadgeBuilder implements BadgeBuilder { params.description = badge.description ? this.render(badge.description, context) : badge.id; - params.markdown = this.getMarkdownCode(params, context.badge_url); + params.markdown = this.getMarkdownCode(params, context.badge_url!); return JSON.stringify( { diff --git a/plugins/badges-backend/src/lib/BadgeBuilder/types.ts b/plugins/badges-backend/src/lib/BadgeBuilder/types.ts index d082f4f843..e6cb3213e9 100644 --- a/plugins/badges-backend/src/lib/BadgeBuilder/types.ts +++ b/plugins/badges-backend/src/lib/BadgeBuilder/types.ts @@ -14,10 +14,18 @@ * limitations under the License. */ +import { Entity } from '@backstage/catalog-model'; import { Badge } from '../../types'; export type BadgeOptions = { - context: object; + context: { + app?: { + title: string; + }; + entity?: Entity; + entity_url?: string; + badge_url?: string; + }; config: Badge; format: 'svg' | 'json'; }; diff --git a/plugins/badges-backend/src/service/router.ts b/plugins/badges-backend/src/service/router.ts index a7e3c018e0..694d53aed0 100644 --- a/plugins/badges-backend/src/service/router.ts +++ b/plugins/badges-backend/src/service/router.ts @@ -25,7 +25,7 @@ import { import { Entity } from '@backstage/catalog-model'; import { Config, JsonObject } from '@backstage/config'; import { BadgeBuilder, DefaultBadgeBuilder } from '../lib/BadgeBuilder'; -import { Badge, BadgeStyle, BadgeStyles } from '../types'; +import { Badge, BadgeConfig, BadgeStyle, BadgeStyles } from '../types'; export interface RouterOptions { badgeBuilder?: BadgeBuilder; @@ -43,7 +43,7 @@ export async function createRouter( const title = options.config.getString('app.title') || 'Backstage'; const catalogUrl = `${options.config.getString('app.baseUrl')}/catalog`; const badgesConfig = (options.config.getOptional('badges') ?? - {}) as JsonObject; + {}) as BadgeConfig; for (const badge of options.badges || []) { if (!badge.id) { @@ -70,6 +70,7 @@ export async function createRouter( const context = { app: { title }, + badge_url: '', entity, entity_url, }; @@ -81,7 +82,7 @@ export async function createRouter( context.badge_url = [ `${req.protocol}://`, req.headers.host, - req.originalUrl.replace(/badge-specs$/, badge.id), + req.originalUrl.replace(/badge-specs$/, badge.id!), ].join(''); specs.push( await badgeBuilder.createBadge({ diff --git a/plugins/badges-backend/src/types.ts b/plugins/badges-backend/src/types.ts index 9ea720f609..00a3d40756 100644 --- a/plugins/badges-backend/src/types.ts +++ b/plugins/badges-backend/src/types.ts @@ -45,4 +45,10 @@ export interface Badge { message: string; /** Badge style (apperance). One of "plastic", "flat", "flat-square", "for-the-badge" and "social" */ style?: BadgeStyle; + /** (generated) markdown code */ + markdown?: string; +} + +export interface BadgeConfig { + [id: string]: Badge; }