diff --git a/.changeset/blue-pandas-pretend.md b/.changeset/blue-pandas-pretend.md new file mode 100644 index 00000000..acc1cc64 --- /dev/null +++ b/.changeset/blue-pandas-pretend.md @@ -0,0 +1,5 @@ +--- +'app': minor +--- + +Added the JiraUserIssuesViewCard component to the Homepage diff --git a/.changeset/cyan-ears-double.md b/.changeset/cyan-ears-double.md new file mode 100644 index 00000000..2e8719f8 --- /dev/null +++ b/.changeset/cyan-ears-double.md @@ -0,0 +1,5 @@ +--- +'@axis-backstage/plugin-jira-dashboard-backend': patch +--- + +Removed deprecated types and fixed the standalone server diff --git a/.changeset/eleven-melons-rest.md b/.changeset/eleven-melons-rest.md new file mode 100644 index 00000000..1cceb5a3 --- /dev/null +++ b/.changeset/eleven-melons-rest.md @@ -0,0 +1,5 @@ +--- +'@axis-backstage/plugin-readme-backend': patch +--- + +Updated deprecated types and fixed the standalone server diff --git a/.changeset/thirty-bulldogs-design.md b/.changeset/thirty-bulldogs-design.md new file mode 100644 index 00000000..cea05d1b --- /dev/null +++ b/.changeset/thirty-bulldogs-design.md @@ -0,0 +1,5 @@ +--- +'@axis-backstage/plugin-jira-dashboard-backend': patch +--- + +Quote the incoming status string in the JQL. This makes it possible to have strings that contain whitespace. diff --git a/packages/app/src/components/home/HomePage.tsx b/packages/app/src/components/home/HomePage.tsx index 4a595a15..6a554579 100644 --- a/packages/app/src/components/home/HomePage.tsx +++ b/packages/app/src/components/home/HomePage.tsx @@ -9,6 +9,7 @@ import { Content, Header, Page } from '@backstage/core-components'; import React from 'react'; import Grid from '@mui/material/Unstable_Grid2'; import { SearchBar } from '@backstage/plugin-search-react'; +import { JiraUserIssuesViewCard } from '@axis-backstage/plugin-jira-dashboard'; export const homePage = ( @@ -33,6 +34,14 @@ export const homePage = ( + + + diff --git a/plugins/jira-dashboard-backend/api-report.md b/plugins/jira-dashboard-backend/api-report.md index 2208367f..30944f30 100644 --- a/plugins/jira-dashboard-backend/api-report.md +++ b/plugins/jira-dashboard-backend/api-report.md @@ -5,13 +5,13 @@ ```ts import { AuthService } from '@backstage/backend-plugin-api'; import { BackendFeatureCompat } from '@backstage/backend-plugin-api'; -import { Config } from '@backstage/config'; import { DiscoveryService } from '@backstage/backend-plugin-api'; import express from 'express'; import { HttpAuthService } from '@backstage/backend-plugin-api'; -import { IdentityApi } from '@backstage/plugin-auth-node'; +import { IdentityService } from '@backstage/backend-plugin-api'; import { Issue } from '@axis-backstage/plugin-jira-dashboard-common'; import { LoggerService } from '@backstage/backend-plugin-api'; +import { RootConfigService } from '@backstage/backend-plugin-api'; import { TokenManagerService } from '@backstage/backend-plugin-api'; import { UserInfoService } from '@backstage/backend-plugin-api'; @@ -39,10 +39,10 @@ export type JqlQueryBuilderArgs = { // @public export interface RouterOptions { auth?: AuthService; - config: Config; + config: RootConfigService; discovery: DiscoveryService; httpAuth?: HttpAuthService; - identity?: IdentityApi; + identity?: IdentityService; logger: LoggerService; tokenManager?: TokenManagerService; userInfo: UserInfoService; @@ -50,7 +50,7 @@ export interface RouterOptions { // @public export const searchJira: ( - config: Config, + config: RootConfigService, jqlQuery: string, options: SearchOptions, ) => Promise; diff --git a/plugins/jira-dashboard-backend/dev/index.ts b/plugins/jira-dashboard-backend/dev/index.ts new file mode 100644 index 00000000..10da2287 --- /dev/null +++ b/plugins/jira-dashboard-backend/dev/index.ts @@ -0,0 +1,5 @@ +import { createBackend } from '@backstage/backend-defaults'; + +const backend = createBackend(); +backend.add(import('../src')); +backend.start(); diff --git a/plugins/jira-dashboard-backend/package.json b/plugins/jira-dashboard-backend/package.json index abceb620..dcbe83d1 100644 --- a/plugins/jira-dashboard-backend/package.json +++ b/plugins/jira-dashboard-backend/package.json @@ -31,17 +31,15 @@ "dependencies": { "@axis-backstage/plugin-jira-dashboard-common": "workspace:^", "@backstage/backend-common": "^0.24.0", + "@backstage/backend-defaults": "^0.4.3", "@backstage/backend-plugin-api": "^0.8.0", "@backstage/catalog-client": "^1.6.6", "@backstage/catalog-model": "^1.6.0", - "@backstage/config": "^1.2.0", - "@backstage/plugin-auth-node": "^0.5.0", "@backstage/plugin-permission-common": "^0.8.1", "@types/express": "*", "express": "^4.17.1", "express-promise-router": "^4.1.0", - "node-fetch": "^2.6.7", - "yn": "^4.0.0" + "node-fetch": "^2.6.7" }, "devDependencies": { "@backstage/backend-test-utils": "^0.5.0", diff --git a/plugins/jira-dashboard-backend/src/api.ts b/plugins/jira-dashboard-backend/src/api.ts index 4ebf5377..fc1d8ce9 100644 --- a/plugins/jira-dashboard-backend/src/api.ts +++ b/plugins/jira-dashboard-backend/src/api.ts @@ -1,4 +1,4 @@ -import { Config } from '@backstage/config'; +import { RootConfigService } from '@backstage/backend-plugin-api'; import fetch from 'node-fetch'; import { Filter, @@ -10,7 +10,7 @@ import { jqlQueryBuilder } from './queries'; export const getProjectInfo = async ( projectKey: string, - config: Config, + config: RootConfigService, ): Promise => { const response = await fetch( `${resolveJiraBaseUrl(config)}project/${projectKey}`, @@ -32,7 +32,7 @@ export const getProjectInfo = async ( export const getFilterById = async ( id: string, - config: Config, + config: RootConfigService, ): Promise => { const response = await fetch(`${resolveJiraBaseUrl(config)}filter/${id}`, { method: 'GET', @@ -52,7 +52,7 @@ export const getIssuesByFilter = async ( projectKey: string, components: string[], query: string, - config: Config, + config: RootConfigService, ): Promise => { const jql = jqlQueryBuilder({ project: projectKey, components, query }); const response = await fetch( @@ -97,7 +97,7 @@ export type SearchOptions = { * @public */ export const searchJira = async ( - config: Config, + config: RootConfigService, jqlQuery: string, options: SearchOptions, ): Promise => { @@ -116,7 +116,7 @@ export const searchJira = async ( export const getIssuesByComponent = async ( projectKey: string, componentKey: string, - config: Config, + config: RootConfigService, ): Promise => { const jql = jqlQueryBuilder({ project: projectKey, @@ -135,7 +135,7 @@ export const getIssuesByComponent = async ( return response.issues; }; -export async function getProjectAvatar(url: string, config: Config) { +export async function getProjectAvatar(url: string, config: RootConfigService) { const response = await fetch(url, { method: 'GET', headers: { diff --git a/plugins/jira-dashboard-backend/src/config.ts b/plugins/jira-dashboard-backend/src/config.ts index 48d338cc..8b295753 100644 --- a/plugins/jira-dashboard-backend/src/config.ts +++ b/plugins/jira-dashboard-backend/src/config.ts @@ -1,11 +1,11 @@ -import { Config } from '@backstage/config'; +import { RootConfigService } from '@backstage/backend-plugin-api'; const JIRA_BASE_URL_CONFIG_PATH = 'jiraDashboard.baseUrl'; const JIRA_TOKEN_CONFIG_PATH = 'jiraDashboard.token'; const JIRA_USER_CONFIG_EMAIL_SUFFIX = 'jiraDashboard.userEmailSuffix'; const JIRA_ANNOTATION = 'jiraDashboard.annotationPrefix'; -export function resolveJiraBaseUrl(config: Config): string { +export function resolveJiraBaseUrl(config: RootConfigService): string { try { return config.getString(JIRA_BASE_URL_CONFIG_PATH); } catch (error) { @@ -13,7 +13,7 @@ export function resolveJiraBaseUrl(config: Config): string { } } -export function resolveJiraToken(config: Config): string { +export function resolveJiraToken(config: RootConfigService): string { try { return config.getString(JIRA_TOKEN_CONFIG_PATH); } catch (error) { @@ -21,11 +21,13 @@ export function resolveJiraToken(config: Config): string { } } -export function resolveUserEmailSuffix(config: Config): string | undefined { +export function resolveUserEmailSuffix( + config: RootConfigService, +): string | undefined { return config.getOptionalString(JIRA_USER_CONFIG_EMAIL_SUFFIX); } -export function resolveAnnotationPrefix(config: Config): string { +export function resolveAnnotationPrefix(config: RootConfigService): string { const annotationPrefix = config.getOptionalString(JIRA_ANNOTATION); return annotationPrefix ?? 'jira.com'; } diff --git a/plugins/jira-dashboard-backend/src/filters.ts b/plugins/jira-dashboard-backend/src/filters.ts index bfd82446..f5d2355c 100644 --- a/plugins/jira-dashboard-backend/src/filters.ts +++ b/plugins/jira-dashboard-backend/src/filters.ts @@ -1,4 +1,4 @@ -import { Config } from '@backstage/config'; +import { RootConfigService } from '@backstage/backend-plugin-api'; import { resolveUserEmailSuffix } from './config'; import { Filter } from '@axis-backstage/plugin-jira-dashboard-common'; import { UserEntity } from '@backstage/catalog-model'; @@ -12,7 +12,7 @@ const openFilter: Filter = { const getIncomingFilter = (incomingStatus: string): Filter => ({ name: 'Incoming Issues', shortName: 'INCOMING', - query: `status = ${incomingStatus} ORDER BY created ASC`, + query: `status = '${incomingStatus}' ORDER BY created ASC`, }); /** @@ -23,7 +23,7 @@ const getIncomingFilter = (incomingStatus: string): Filter => ({ * @param userEntity user entity instance */ export const getAssigneUser = ( - config: Config, + config: RootConfigService, userEntity: UserEntity, ): string => { const emailSuffixConfig = resolveUserEmailSuffix(config); @@ -35,7 +35,7 @@ export const getAssigneUser = ( const getAssignedToMeFilter = ( userEntity: UserEntity, - config: Config, + config: RootConfigService, ): Filter => { const email = getAssigneUser(config, userEntity); @@ -47,7 +47,7 @@ const getAssignedToMeFilter = ( }; export const getDefaultFiltersForUser = ( - config: Config, + config: RootConfigService, userEntity?: UserEntity, incomingStatus?: string, ): Filter[] => { diff --git a/plugins/jira-dashboard-backend/src/lib.ts b/plugins/jira-dashboard-backend/src/lib.ts index ba87af01..0d5a0c33 100644 --- a/plugins/jira-dashboard-backend/src/lib.ts +++ b/plugins/jira-dashboard-backend/src/lib.ts @@ -5,9 +5,9 @@ import { FILTERS_NAME, INCOMING_ISSUES_STATUS, } from '@axis-backstage/plugin-jira-dashboard-common'; -import { Config } from '@backstage/config'; +import { RootConfigService } from '@backstage/backend-plugin-api'; -export const getAnnotations = (config: Config) => { +export const getAnnotations = (config: RootConfigService) => { const prefix = resolveAnnotationPrefix(config); const projectKeyAnnotation = `${prefix}/${PROJECT_KEY_NAME}`; diff --git a/plugins/jira-dashboard-backend/src/run.ts b/plugins/jira-dashboard-backend/src/run.ts deleted file mode 100644 index 79c6bd6d..00000000 --- a/plugins/jira-dashboard-backend/src/run.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { getRootLogger } from '@backstage/backend-common'; -import yn from 'yn'; -import { startStandaloneServer } from './service/standaloneServer'; - -const port = process.env.PLUGIN_PORT ? Number(process.env.PLUGIN_PORT) : 7007; -const enableCors = yn(process.env.PLUGIN_CORS, { default: false }); -const logger = getRootLogger(); - -startStandaloneServer({ port, enableCors, logger }).catch(err => { - logger.error(err); - process.exit(1); -}); - -process.on('SIGINT', () => { - logger.info('CTRL+C pressed; exiting.'); - process.exit(0); -}); diff --git a/plugins/jira-dashboard-backend/src/service/router.test.ts b/plugins/jira-dashboard-backend/src/service/router.test.ts index a93bec8d..ce6b4751 100644 --- a/plugins/jira-dashboard-backend/src/service/router.test.ts +++ b/plugins/jira-dashboard-backend/src/service/router.test.ts @@ -1,54 +1,20 @@ -import { - getVoidLogger, - PluginEndpointDiscovery, - ServerTokenManager, -} from '@backstage/backend-common'; import express from 'express'; import request from 'supertest'; import { createRouter } from './router'; -import { - BackstageIdentityResponse, - IdentityApiGetIdentityRequest, -} from '@backstage/plugin-auth-node'; -import { ConfigReader } from '@backstage/config'; import { mockServices } from '@backstage/backend-test-utils'; -const testDiscovery: jest.Mocked = { - getBaseUrl: jest - .fn() - .mockResolvedValue('http://localhost:7007/api/jira-dashboard'), - getExternalBaseUrl: jest.fn(), -}; - describe('createRouter', () => { let app: express.Express; - const tokenManager = ServerTokenManager.noop(); - - const getIdentity = jest - .fn() - .mockImplementation( - async ({ - request: _request, - }: IdentityApiGetIdentityRequest): Promise< - BackstageIdentityResponse | undefined - > => { - return { - identity: { - userEntityRef: 'user:default/guest', - ownershipEntityRefs: [], - type: 'user', - }, - token: 'token', - }; - }, - ); + const tokenManager = mockServices.tokenManager.mock(); + const testDiscovery = mockServices.discovery.mock(); + const identity = mockServices.identity.mock(); beforeAll(async () => { const router = await createRouter({ - logger: getVoidLogger(), - config: new ConfigReader({}), + logger: mockServices.logger.mock(), + config: mockServices.rootConfig(), discovery: testDiscovery, - identity: { getIdentity }, + identity, tokenManager, userInfo: mockServices.userInfo({ userEntityRef: 'user:default/guest' }), }); diff --git a/plugins/jira-dashboard-backend/src/service/router.ts b/plugins/jira-dashboard-backend/src/service/router.ts index 4121f8ce..52d6e934 100644 --- a/plugins/jira-dashboard-backend/src/service/router.ts +++ b/plugins/jira-dashboard-backend/src/service/router.ts @@ -1,22 +1,20 @@ -import { - CacheManager, - createLegacyAuthAdapters, - errorHandler, -} from '@backstage/backend-common'; +import { createLegacyAuthAdapters } from '@backstage/backend-common'; +import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter'; +import { CacheManager } from '@backstage/backend-defaults/cache'; import { AuthService, DiscoveryService, HttpAuthService, LoggerService, + IdentityService, + RootConfigService, TokenManagerService, UserInfoService, } from '@backstage/backend-plugin-api'; import { stringifyEntityRef, UserEntity } from '@backstage/catalog-model'; import express from 'express'; import Router from 'express-promise-router'; -import { Config } from '@backstage/config'; import { CatalogClient } from '@backstage/catalog-client'; -import { IdentityApi } from '@backstage/plugin-auth-node'; import { getAssigneUser, getDefaultFiltersForUser } from '../filters'; import { @@ -48,7 +46,7 @@ export interface RouterOptions { /** * Backstage config object */ - config: Config; + config: RootConfigService; /** * Backstage discovery api instance @@ -58,7 +56,7 @@ export interface RouterOptions { /** * Backstage identity api instance */ - identity?: IdentityApi; + identity?: IdentityService; /** * Backstage token manager instance @@ -94,11 +92,11 @@ export async function createRouter( const { auth, httpAuth } = createLegacyAuthAdapters(options); const { logger, config, discovery, userInfo } = options; const catalogClient = new CatalogClient({ discoveryApi: discovery }); - logger.info('Initializing Jira Dashboard backend'); const pluginCache = CacheManager.fromConfig(config).forPlugin('jira-dashboard'); const cache = pluginCache.getClient({ defaultTtl: DEFAULT_TTL }); + logger.info('Initializing Jira Dashboard backend'); const router = Router(); router.use(express.json()); @@ -326,6 +324,7 @@ export async function createRouter( ps.pipe(response); }, ); - router.use(errorHandler()); + const middleware = MiddlewareFactory.create({ logger, config }); + router.use(middleware.error()); return router; } diff --git a/plugins/jira-dashboard-backend/src/service/service.ts b/plugins/jira-dashboard-backend/src/service/service.ts index c7dea3b1..df6176c3 100644 --- a/plugins/jira-dashboard-backend/src/service/service.ts +++ b/plugins/jira-dashboard-backend/src/service/service.ts @@ -1,5 +1,4 @@ -import { CacheClient } from '@backstage/backend-common'; -import { Config } from '@backstage/config'; +import { CacheService, RootConfigService } from '@backstage/backend-plugin-api'; import { type Filter, Issue, @@ -17,8 +16,8 @@ import { export const getProjectResponse = async ( projectKey: string, - config: Config, - cache: CacheClient, + config: RootConfigService, + cache: CacheService, ): Promise => { let projectResponse: Project; @@ -41,8 +40,8 @@ export const getProjectResponse = async ( export const getJqlResponse = async ( jql: string, - config: Config, - cache: CacheClient, + config: RootConfigService, + cache: CacheService, searchOptions: SearchOptions, ): Promise => { let issuesResponse: Issue[]; @@ -67,8 +66,8 @@ export const getJqlResponse = async ( export const getUserIssues = async ( username: string, maxResults: number, - config: Config, - cache: CacheClient, + config: RootConfigService, + cache: CacheService, ): Promise => { const jql = `assignee = "${username}" AND resolution = Unresolved ORDER BY priority DESC, updated DESC`; @@ -88,7 +87,7 @@ export const getUserIssues = async ( export const getFiltersFromAnnotations = async ( annotations: string[], - config: Config, + config: RootConfigService, ): Promise => { const filters: Filter[] = []; @@ -109,7 +108,7 @@ export const getIssuesFromFilters = async ( projectKey: string, components: string[], filters: Filter[], - config: Config, + config: RootConfigService, ): Promise => { return await Promise.all( filters.map(async filter => ({ @@ -128,7 +127,7 @@ export const getIssuesFromFilters = async ( export const getIssuesFromComponents = async ( projectKey: string, componentAnnotations: string[], - config: Config, + config: RootConfigService, ): Promise => { return await Promise.all( componentAnnotations.map(async componentKey => ({ diff --git a/plugins/jira-dashboard-backend/src/service/standaloneServer.ts b/plugins/jira-dashboard-backend/src/service/standaloneServer.ts deleted file mode 100644 index afa52ed0..00000000 --- a/plugins/jira-dashboard-backend/src/service/standaloneServer.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { - createServiceBuilder, - HostDiscovery, - loadBackendConfig, - ServerTokenManager, -} from '@backstage/backend-common'; -import { LoggerService } from '@backstage/backend-plugin-api'; -import { Server } from 'http'; -import { createRouter } from './router'; -import { IdentityApi } from '@backstage/plugin-auth-node'; - -export interface ServerOptions { - port: number; - enableCors: boolean; - logger: LoggerService; -} - -const userInfo = { - getUserInfo: jest.fn().mockResolvedValue({ - userEntityRef: 'user:default/guest', - profile: { - email: 'guest@example.com', - }, - }), -}; - -export async function startStandaloneServer( - options: ServerOptions, -): Promise { - const logger = options.logger.child({ service: 'jira-dashboard-backend' }); - const config = await loadBackendConfig({ logger, argv: process.argv }); - const tokenManager = ServerTokenManager.noop(); - logger.debug('Starting application server...'); - const router = await createRouter({ - logger, - config: config, - discovery: HostDiscovery.fromConfig(config), - identity: {} as IdentityApi, - tokenManager, - userInfo: userInfo, - }); - - let service = createServiceBuilder(module) - .setPort(options.port) - .addRouter('/jira-dashboard', router); - if (options.enableCors) { - service = service.enableCors({ origin: 'http://localhost:3000' }); - } - - return await service.start().catch(err => { - logger.error(err); - process.exit(1); - }); -} - -module.hot?.accept(); diff --git a/plugins/readme-backend/api-report.md b/plugins/readme-backend/api-report.md index 95640a3c..de64f2fb 100644 --- a/plugins/readme-backend/api-report.md +++ b/plugins/readme-backend/api-report.md @@ -5,10 +5,10 @@ ```ts import { AuthService } from '@backstage/backend-plugin-api'; import { BackendFeatureCompat } from '@backstage/backend-plugin-api'; -import { Config } from '@backstage/config'; import { DiscoveryService } from '@backstage/backend-plugin-api'; import express from 'express'; import { LoggerService } from '@backstage/backend-plugin-api'; +import { RootConfigService } from '@backstage/backend-plugin-api'; import { TokenManagerService } from '@backstage/backend-plugin-api'; import { UrlReaderService } from '@backstage/backend-plugin-api'; @@ -22,7 +22,7 @@ export default readmePlugin; // @public export interface RouterOptions { auth?: AuthService; - config: Config; + config: RootConfigService; discovery: DiscoveryService; logger: LoggerService; reader: UrlReaderService; diff --git a/plugins/readme-backend/dev/index.ts b/plugins/readme-backend/dev/index.ts new file mode 100644 index 00000000..10da2287 --- /dev/null +++ b/plugins/readme-backend/dev/index.ts @@ -0,0 +1,5 @@ +import { createBackend } from '@backstage/backend-defaults'; + +const backend = createBackend(); +backend.add(import('../src')); +backend.start(); diff --git a/plugins/readme-backend/package.json b/plugins/readme-backend/package.json index 9013eb28..0e003297 100644 --- a/plugins/readme-backend/package.json +++ b/plugins/readme-backend/package.json @@ -33,16 +33,13 @@ "@backstage/backend-plugin-api": "^0.8.0", "@backstage/catalog-client": "^1.6.6", "@backstage/catalog-model": "^1.6.0", - "@backstage/config": "^1.2.0", "@backstage/integration": "^1.14.0", - "@backstage/plugin-permission-common": "^0.8.1", "@types/express": "*", "express": "^4.17.1", - "express-promise-router": "^4.1.0", - "node-fetch": "^2.6.7", - "yn": "^4.0.0" + "express-promise-router": "^4.1.0" }, "devDependencies": { + "@backstage/backend-test-utils": "^0.5.0", "@backstage/cli": "^0.27.0", "@types/supertest": "^2.0.12", "msw": "^1.0.0", diff --git a/plugins/readme-backend/src/run.ts b/plugins/readme-backend/src/run.ts deleted file mode 100644 index 79c6bd6d..00000000 --- a/plugins/readme-backend/src/run.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { getRootLogger } from '@backstage/backend-common'; -import yn from 'yn'; -import { startStandaloneServer } from './service/standaloneServer'; - -const port = process.env.PLUGIN_PORT ? Number(process.env.PLUGIN_PORT) : 7007; -const enableCors = yn(process.env.PLUGIN_CORS, { default: false }); -const logger = getRootLogger(); - -startStandaloneServer({ port, enableCors, logger }).catch(err => { - logger.error(err); - process.exit(1); -}); - -process.on('SIGINT', () => { - logger.info('CTRL+C pressed; exiting.'); - process.exit(0); -}); diff --git a/plugins/readme-backend/src/service/router.test.ts b/plugins/readme-backend/src/service/router.test.ts index 9a8b3bba..01bcdfc1 100644 --- a/plugins/readme-backend/src/service/router.test.ts +++ b/plugins/readme-backend/src/service/router.test.ts @@ -1,10 +1,5 @@ -import { - getVoidLogger, - HostDiscovery, - ServerTokenManager, -} from '@backstage/backend-common'; +import { mockServices } from '@backstage/backend-test-utils'; import { UrlReaders } from '@backstage/backend-defaults/urlReader'; -import { ConfigReader } from '@backstage/config'; import express from 'express'; import request from 'supertest'; @@ -14,23 +9,14 @@ describe('createRouter', () => { let app: express.Express; beforeAll(async () => { - const config = new ConfigReader({ - backend: { - baseUrl: 'http://127.0.0.1:7007', - auth: { - keys: [{ secret: 'abcd' }], - }, - }, - }); - const logger = getVoidLogger(); - const discovery = HostDiscovery.fromConfig(config); - const tokenManager = ServerTokenManager.fromConfig(config, { - logger, - }); + const config = mockServices.rootConfig(); + const logger = mockServices.rootLogger.mock(); + const discovery = mockServices.discovery.mock(); + const tokenManager = mockServices.tokenManager.mock(); const reader = UrlReaders.default({ logger, config }); const router = await createRouter({ - logger: getVoidLogger(), + logger, config, discovery, tokenManager, diff --git a/plugins/readme-backend/src/service/router.ts b/plugins/readme-backend/src/service/router.ts index 85f537ad..eec10914 100644 --- a/plugins/readme-backend/src/service/router.ts +++ b/plugins/readme-backend/src/service/router.ts @@ -1,24 +1,22 @@ -import { errorHandler } from '@backstage/backend-common'; +import { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter'; +import { CacheManager } from '@backstage/backend-defaults/cache'; import { AuthService, DiscoveryService, LoggerService, + RootConfigService, UrlReaderService, TokenManagerService, } from '@backstage/backend-plugin-api'; -import { Config } from '@backstage/config'; -import { - CacheManager, - createLegacyAuthAdapters, -} from '@backstage/backend-common'; -import express from 'express'; -import Router from 'express-promise-router'; +import { createLegacyAuthAdapters } from '@backstage/backend-common'; import { ScmIntegrations } from '@backstage/integration'; import { getEntitySourceLocation, stringifyEntityRef, } from '@backstage/catalog-model'; import { CatalogClient } from '@backstage/catalog-client'; +import express from 'express'; +import Router from 'express-promise-router'; import { isSymLink } from '../lib'; /** @@ -34,7 +32,7 @@ export interface RouterOptions { /** * Backstage config object */ - config: Config; + config: RootConfigService; /** * Backstage url reader instance @@ -187,6 +185,7 @@ export async function createRouter( }); }); - router.use(errorHandler()); + const middleware = MiddlewareFactory.create({ logger, config }); + router.use(middleware.error()); return router; } diff --git a/plugins/readme-backend/src/service/standaloneServer.ts b/plugins/readme-backend/src/service/standaloneServer.ts deleted file mode 100644 index 909dccd1..00000000 --- a/plugins/readme-backend/src/service/standaloneServer.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { - createServiceBuilder, - loadBackendConfig, - HostDiscovery, - ServerTokenManager, -} from '@backstage/backend-common'; -import { LoggerService } from '@backstage/backend-plugin-api'; -import { UrlReaders } from '@backstage/backend-defaults/urlReader'; -import { Server } from 'http'; -import { createRouter } from './router'; - -export interface ServerOptions { - port: number; - enableCors: boolean; - logger: LoggerService; -} - -export async function startStandaloneServer( - options: ServerOptions, -): Promise { - const logger = options.logger.child({ service: 'readme-backend' }); - logger.debug('Starting application server...'); - const config = await loadBackendConfig({ logger, argv: process.argv }); - const discovery = HostDiscovery.fromConfig(config); - const reader = UrlReaders.default({ logger, config }); - const tokenManager = ServerTokenManager.fromConfig(config, { - logger, - }); - const router = await createRouter({ - logger, - config, - discovery, - tokenManager, - reader, - }); - - let service = createServiceBuilder(module) - .setPort(options.port) - .addRouter('/readme', router); - if (options.enableCors) { - service = service.enableCors({ origin: 'http://localhost:3000' }); - } - - return await service.start().catch(err => { - logger.error(err); - process.exit(1); - }); -} - -module.hot?.accept(); diff --git a/yarn.lock b/yarn.lock index c61b000d..e7a1ba75 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1456,13 +1456,12 @@ __metadata: dependencies: "@axis-backstage/plugin-jira-dashboard-common": "workspace:^" "@backstage/backend-common": "npm:^0.24.0" + "@backstage/backend-defaults": "npm:^0.4.3" "@backstage/backend-plugin-api": "npm:^0.8.0" "@backstage/backend-test-utils": "npm:^0.5.0" "@backstage/catalog-client": "npm:^1.6.6" "@backstage/catalog-model": "npm:^1.6.0" "@backstage/cli": "npm:^0.27.0" - "@backstage/config": "npm:^1.2.0" - "@backstage/plugin-auth-node": "npm:^0.5.0" "@backstage/plugin-permission-common": "npm:^0.8.1" "@types/express": "npm:*" "@types/supertest": "npm:^2.0.12" @@ -1471,7 +1470,6 @@ __metadata: msw: "npm:^1.0.0" node-fetch: "npm:^2.6.7" supertest: "npm:^6.2.4" - yn: "npm:^4.0.0" languageName: unknown linkType: soft @@ -1530,20 +1528,17 @@ __metadata: "@backstage/backend-common": "npm:^0.24.0" "@backstage/backend-defaults": "npm:^0.4.3" "@backstage/backend-plugin-api": "npm:^0.8.0" + "@backstage/backend-test-utils": "npm:^0.5.0" "@backstage/catalog-client": "npm:^1.6.6" "@backstage/catalog-model": "npm:^1.6.0" "@backstage/cli": "npm:^0.27.0" - "@backstage/config": "npm:^1.2.0" "@backstage/integration": "npm:^1.14.0" - "@backstage/plugin-permission-common": "npm:^0.8.1" "@types/express": "npm:*" "@types/supertest": "npm:^2.0.12" express: "npm:^4.17.1" express-promise-router: "npm:^4.1.0" msw: "npm:^1.0.0" - node-fetch: "npm:^2.6.7" supertest: "npm:^6.2.4" - yn: "npm:^4.0.0" languageName: unknown linkType: soft