@pagerduty/backstage-plugin-backend 0.9.10 → 0.10.0
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/config.d.ts +32 -29
- package/dist/apis/pagerduty.cjs.js +317 -94
- package/dist/apis/pagerduty.cjs.js.map +1 -1
- package/dist/auth/auth.cjs.js +71 -37
- package/dist/auth/auth.cjs.js.map +1 -1
- package/dist/db/PagerDutyBackendDatabase.cjs.js +16 -5
- package/dist/db/PagerDutyBackendDatabase.cjs.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/plugin.cjs.js +10 -8
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/service/router.cjs.js +297 -250
- package/dist/service/router.cjs.js.map +1 -1
- package/migrations/20240527_init.js +16 -24
- package/migrations/20240710_add_account_column.js +16 -10
- package/migrations/20240722_add_settings_table.js +11 -17
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.cjs.js","sources":["../../src/service/router.ts"],"sourcesContent":["import {\n AuthService,\n DiscoveryService,\n LoggerService,\n RootConfigService\n} from '@backstage/backend-plugin-api';\nimport {\n createLegacyAuthAdapters,\n errorHandler\n} from '@backstage/backend-common';\nimport {\n getAllEscalationPolicies,\n getChangeEvents,\n getIncidents,\n getOncallUsers,\n getServiceById,\n getServiceByIntegrationKey,\n getServiceStandards,\n getServiceMetrics,\n getAllServices,\n loadPagerDutyEndpointsFromConfig,\n createServiceIntegration,\n getServiceRelationshipsById,\n addServiceRelationsToService,\n removeServiceRelationsFromService\n} from '../apis/pagerduty';\nimport {\n HttpError,\n PagerDutyChangeEventsResponse,\n PagerDutyIncidentsResponse,\n PagerDutyOnCallUsersResponse,\n PagerDutyServiceResponse,\n PagerDutyServiceStandardsResponse,\n PagerDutyServiceMetricsResponse,\n PagerDutyServicesResponse,\n PagerDutyEntityMapping,\n PagerDutyEntityMappingsResponse,\n PagerDutyService,\n PagerDutyServiceDependency,\n PagerDutySetting\n} from '@pagerduty/backstage-plugin-common';\nimport { loadAuthConfig } from '../auth/auth';\nimport {\n PagerDutyBackendStore,\n RawDbEntityResultRow\n} from '../db/PagerDutyBackendDatabase';\nimport * as express from 'express';\nimport Router from 'express-promise-router';\nimport type {\n CatalogApi,\n GetEntitiesResponse\n} from '@backstage/catalog-client';\n\n\nexport interface RouterOptions {\n logger: LoggerService;\n config: RootConfigService;\n store: PagerDutyBackendStore;\n discovery: DiscoveryService;\n auth?: AuthService;\n catalogApi?: CatalogApi;\n}\n\nexport type Annotations = {\n \"pagerduty.com/integration-key\": string;\n \"pagerduty.com/service-id\": string;\n \"pagerduty.com/account\": string;\n}\n\nexport async function createComponentEntitiesReferenceDict({ items: componentEntities }: GetEntitiesResponse): Promise<Record<string, { ref: string, name: string }>> {\n const componentEntitiesDict: Record<string, { ref: string, name: string }> = {};\n\n await Promise.all(componentEntities.map(async (entity) => {\n const serviceId = entity.metadata.annotations?.['pagerduty.com/service-id'];\n const integrationKey = entity.metadata.annotations?.['pagerduty.com/integration-key'];\n const account = entity.metadata.annotations?.['pagerduty.com/account'];\n\n if (serviceId !== undefined && serviceId !== \"\") {\n componentEntitiesDict[serviceId] = {\n ref: `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase(),\n name: entity.metadata.name,\n };\n }\n else if (integrationKey !== undefined && integrationKey !== \"\") {\n // get service id from integration key, we ignore errors here since we're focused\n // only on building a mapping between valid service IDs and the corresponding Backstage entity\n const service = await getServiceByIntegrationKey(integrationKey, account).catch(() => undefined);\n\n if (service !== undefined) {\n componentEntitiesDict[service.id] = {\n ref: `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase(),\n name: entity.metadata.name,\n };\n }\n }\n }));\n\n return componentEntitiesDict;\n}\n\nexport async function buildEntityMappingsResponse(\n entityMappings: RawDbEntityResultRow[],\n componentEntitiesDict: Record<string, {\n ref: string;\n name: string;\n }>,\n componentEntities: GetEntitiesResponse,\n pagerDutyServices: PagerDutyService[]\n): Promise<PagerDutyEntityMappingsResponse> {\n\n const result: PagerDutyEntityMappingsResponse = {\n mappings: []\n };\n\n pagerDutyServices.forEach((service) => {\n // Check for service mapping annotation in any entity config file and get the entity ref\n const entityRef = componentEntitiesDict[service.id]?.ref;\n const entityName = componentEntitiesDict[service.id]?.name;\n\n // Check if the service is mapped to an entity in the database\n const entityMapping = entityMappings.find((mapping) => mapping.serviceId === service.id);\n\n if (entityMapping) {\n if (entityRef === undefined) {\n if (entityMapping.entityRef === \"\" || entityMapping.entityRef === undefined) {\n result.mappings.push({\n entityRef: \"\",\n entityName: \"\",\n integrationKey: entityMapping.integrationKey,\n serviceId: entityMapping.serviceId,\n status: \"NotMapped\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n account: service.account,\n });\n }\n else {\n const entityRefName = componentEntities.items.find((entity) => `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase() === entityMapping.entityRef)?.metadata.name ?? \"\";\n\n result.mappings.push({\n entityRef: entityMapping.entityRef,\n entityName: entityRefName,\n serviceId: entityMapping.serviceId,\n integrationKey: entityMapping.integrationKey,\n status: \"OutOfSync\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n account: service.account,\n });\n }\n } else if (entityRef !== entityMapping.entityRef) {\n const entityRefName = componentEntities.items.find((entity) => `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase() === entityMapping.entityRef)?.metadata.name ?? \"\";\n\n result.mappings.push({\n entityRef: entityMapping.entityRef !== \"\" ? entityMapping.entityRef : \"\",\n entityName: entityMapping.entityRef !== \"\" ? entityRefName : \"\",\n serviceId: entityMapping.serviceId,\n integrationKey: entityMapping.integrationKey,\n status: \"OutOfSync\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n account: service.account,\n });\n } else if (entityRef === entityMapping.entityRef) {\n result.mappings.push({\n entityRef: entityMapping.entityRef !== \"\" ? entityMapping.entityRef : \"\",\n entityName: entityMapping.entityRef !== \"\" ? entityName : \"\",\n serviceId: entityMapping.serviceId,\n integrationKey: entityMapping.integrationKey,\n status: \"InSync\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n account: service.account,\n });\n }\n } else {\n const backstageVendorId = 'PRO19CT';\n const backstageIntegrationKey = service.integrations?.find((integration) => integration.vendor?.id === backstageVendorId)?.integration_key ?? \"\";\n\n if (entityRef !== undefined) {\n result.mappings.push({\n entityRef: entityRef,\n entityName: entityName,\n serviceId: service.id,\n integrationKey: backstageIntegrationKey,\n status: \"InSync\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n account: service.account,\n });\n } else {\n result.mappings.push({\n entityRef: \"\",\n entityName: \"\",\n serviceId: service.id,\n integrationKey: backstageIntegrationKey,\n status: \"NotMapped\",\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? \"\",\n escalationPolicy: service.escalation_policy !== undefined ? service.escalation_policy.name : \"\",\n serviceUrl: service.html_url,\n account: service.account,\n });\n }\n }\n });\n\n const sortedResult = result.mappings.sort((a, b) => {\n if (a.serviceName! < b.serviceName!) { return -1; }\n else if (a.serviceName! > b.serviceName!) { return 1; }\n return 0;\n });\n\n result.mappings = sortedResult;\n\n return result;\n}\n\nexport async function createRouter(\n options: RouterOptions\n): Promise<express.Router> {\n const { logger, config, store, catalogApi } = options;\n let { auth } = options;\n\n if (!auth) {\n auth = createLegacyAuthAdapters(options).auth;\n }\n\n // Get authentication Config\n await loadAuthConfig(config, logger);\n\n // Get optional PagerDuty custom endpoints from config\n loadPagerDutyEndpointsFromConfig(config, logger);\n\n // Create the router\n const router = Router();\n router.use(express.json());\n\n // DELETE /dependencies/service/:serviceId\n router.delete('/dependencies/service/:serviceId', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n if(serviceId === '') {\n response.status(400).json(\"Bad Request: ':serviceId' must be provided as part of the path\");\n return;\n }\n\n const dependencies: string[] = Object.keys(request.body).length === 0 ? [] : request.body;\n if(!dependencies || dependencies.length === 0) {\n response.status(400).json(\"Bad Request: 'dependencies' must be provided as part of the request body\");\n return;\n }\n\n const serviceRelations : PagerDutyServiceDependency[] = [];\n\n dependencies.forEach(async (dependency) => {\n serviceRelations.push({\n supporting_service: {\n id: dependency,\n type: \"service\"\n },\n dependent_service: {\n id: serviceId,\n type: \"service\"\n }\n });\n });\n\n await removeServiceRelationsFromService(serviceRelations, account);\n \n response.sendStatus(200);\n\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(`Error occurred while processing request: ${error.message}`);\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // POST /dependencies/service/:serviceId\n router.post('/dependencies/service/:serviceId', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n if(serviceId === '') {\n response.status(400).json(\"Bad Request: ':serviceId' must be provided as part of the path\");\n return;\n }\n\n const dependencies: string[] = Object.keys(request.body).length === 0 ? [] : request.body;\n if(!dependencies || dependencies.length === 0) {\n response.status(400).json(\"Bad Request: 'dependencies' must be provided as part of the request body\");\n return;\n }\n\n const serviceRelations : PagerDutyServiceDependency[] = [];\n\n dependencies.forEach(async (dependency) => {\n serviceRelations.push({\n supporting_service: {\n id: dependency,\n type: \"service\"\n },\n dependent_service: {\n id: serviceId,\n type: \"service\"\n }\n });\n });\n\n await addServiceRelationsToService(serviceRelations, account);\n \n response.sendStatus(200);\n\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(`Error occurred while processing request: ${error.message}`);\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n\n router.get('/dependencies/service/:serviceId', async (request, response) => {\n try {\n const serviceId = request.params.serviceId;\n const account = request.query.account as string || '';\n\n if (serviceId) {\n const serviceRelationships: PagerDutyServiceDependency[] = await getServiceRelationshipsById(serviceId, account);\n\n if (serviceRelationships) {\n response.json({\n relationships: serviceRelationships\n });\n }\n }\n else {\n response.status(400).json(\"Bad Request: ':serviceId' must be provided as part of the path\");\n }\n }\n catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /catalog/entity/:entityRef\n router.get('/catalog/entity/:type/:namespace/:name', async (request, response) => {\n const type = request.params.type;\n const namespace = request.params.namespace;\n const name = request.params.name;\n\n try {\n if (type && namespace && name) {\n const entityRef = `${type}:${namespace}/${name}`.toLowerCase();\n const foundEntity = await catalogApi?.getEntityByRef(entityRef);\n\n if (foundEntity) {\n response.json(foundEntity.metadata.annotations?.[\"pagerduty.com/service-id\"]);\n\n }\n else {\n response.status(404);\n }\n }\n else {\n response.status(400).json(\"Bad Request: ':entityRef' must be provided as part of the path\");\n }\n }\n catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // POST /settings\n router.post('/settings', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const settings : PagerDutySetting[] = request.body;\n\n // For each setting, update or insert the value in the database\n await Promise.all(settings.map(async (setting) => {\n if(setting.id === undefined || setting.value === undefined) {\n response.status(400).json(\"Bad Request: 'id' and 'value' are required\");\n return;\n }\n\n if(!isValidSetting(setting.value)) {\n response.status(400).json(\"Bad Request: 'value' is invalid. Valid options are 'backstage', 'pagerduty', 'both' or 'disabled'\");\n return;\n }\n\n await store.updateSetting(setting);\n }));\n\n response.sendStatus(200);\n\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(`Error occurred while processing request: ${error.message}`);\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /settings/:settingId\n router.get('/settings/:settingId', async (request, response) => {\n try {\n // Get param from the request\n const settingId = request.params.settingId;\n \n // Find setting by id\n const setting = await store.findSetting(settingId);\n\n if (!setting) {\n response.status(404).json({});\n return;\n }\n\n response.json(setting);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n function isValidSetting(value: string): boolean {\n if(value === \"backstage\" || value === \"pagerduty\" || value === \"both\" || value === \"disabled\") {\n return true;\n }\n\n return false;\n }\n\n // POST /mapping/entity\n router.post('/mapping/entity', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const entity: PagerDutyEntityMapping = request.body;\n\n if (!entity.serviceId) {\n response.status(400).json(\"Bad Request: 'serviceId' must be provided as part of the request body\");\n return;\n }\n\n // Get all the entity mappings from the database\n const entityMappings = await store.getAllEntityMappings();\n const oldMapping = entityMappings.find((mapping) => mapping.serviceId === entity.serviceId);\n\n // in case a mapping is defined and no integration exists, \n // we need to create one\n if (entity.entityRef !== \"\" &&\n (entity.integrationKey === \"\" || entity.integrationKey === undefined)) {\n\n const backstageVendorId = 'PRO19CT';\n // check for existing integration key on service\n const service = await getServiceById(entity.serviceId, entity.account);\n const backstageIntegration = service.integrations?.find((integration) => integration.vendor?.id === backstageVendorId);\n\n if (!backstageIntegration) {\n // If an integration does not exist for service, \n // create it in PagerDuty\n const integrationKey = await createServiceIntegration({\n serviceId: entity.serviceId,\n vendorId: backstageVendorId,\n account: entity.account\n });\n\n entity.integrationKey = integrationKey;\n } else {\n entity.integrationKey = backstageIntegration.integration_key;\n }\n }\n\n const entityMappingId = await store.insertEntityMapping(entity);\n\n // Refresh new and old entity unless they are empty strings\n if (entity.entityRef !== \"\") {\n // force refresh of new entity\n await catalogApi?.refreshEntity(entity.entityRef);\n }\n\n if (oldMapping && oldMapping.entityRef !== \"\") {\n // force refresh of old entity\n await catalogApi?.refreshEntity(oldMapping.entityRef);\n }\n\n response.json({\n id: entityMappingId,\n entityRef: entity.entityRef,\n integrationKey: entity.integrationKey,\n serviceId: entity.serviceId,\n status: entity.status,\n account: entity.account,\n });\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(`Error occurred while processing request: ${error.message}`);\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /mapping/entity\n router.get('/mapping/entity', async (_, response) => {\n try {\n // Get all the entity mappings from the database\n const entityMappings = await store.getAllEntityMappings();\n\n // Get all the entities from the catalog\n const componentEntities = await catalogApi!.getEntities({\n filter: {\n kind: 'Component',\n }\n });\n\n // Build reference dictionary of componentEntities with serviceId as the key and entity reference and name pair as the value\n const componentEntitiesDict: Record<string, { ref: string, name: string }> = await createComponentEntitiesReferenceDict(componentEntities);\n\n // Get all services from PagerDuty\n const pagerDutyServices = await getAllServices();\n\n // Build the response object\n const result: PagerDutyEntityMappingsResponse = await buildEntityMappingsResponse(entityMappings, componentEntitiesDict, componentEntities, pagerDutyServices);\n\n response.json(result);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /mapping/entity\n router.get('/mapping/entity/:type/:namespace/:name', async (request, response) => {\n try {\n // Get the type, namespace and entity name from the request parameters\n const entityType: string = request.params.type || '';\n const entityNamespace: string = request.params.namespace || '';\n const entityName: string = request.params.name || '';\n\n if (entityType === ''\n || entityNamespace === ''\n || entityName === '') {\n response.status(400).json(\"Required params not specified.\");\n return;\n }\n\n const entityRef = `${entityType}:${entityNamespace}/${entityName}`.toLowerCase();\n\n // Get all the entity mappings from the database\n const entityMapping = await store.findEntityMappingByEntityRef(entityRef);\n\n if (!entityMapping) {\n response.status(404).json(`Mapping for entityRef ${entityRef} not found.`);\n return;\n }\n\n response.json({\n mapping: entityMapping\n });\n\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /mapping/entity/service/:serviceId\n router.get('/mapping/entity/service/:serviceId', async (request, response) => {\n try {\n // Get the type, namespace and entity name from the request parameters\n const serviceId: string = request.params.serviceId ?? '';\n\n if (serviceId === '') {\n response.status(400).json(\"Required params not specified.\");\n return;\n }\n\n // Get all the entity mappings from the database\n const entityMapping = await store.findEntityMappingByServiceId(serviceId);\n\n if (!entityMapping) {\n response.status(404).json(`Mapping for serviceId ${serviceId} not found.`);\n return;\n }\n\n response.json({\n mapping: entityMapping\n });\n\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /escalation_policies\n router.get('/escalation_policies', async (_, response) => {\n\n try {\n let escalationPolicyList = await getAllEscalationPolicies();\n\n // sort the escalation policies by account and name\n escalationPolicyList = escalationPolicyList.sort((a, b) => {\n if (a.account === b.account) {\n return a.name.localeCompare(b.name);\n }\n return a.account!.localeCompare(b.account!);\n });\n\n const escalationPolicyDropDownOptions = escalationPolicyList.map((policy) => {\n let policyLabel = policy.name;\n if (policy.account && policy.account !== 'default') {\n policyLabel = `(${policy.account}) ${policy.name}`;\n }\n\n return {\n label: policyLabel,\n value: policy.id,\n };\n });\n\n response.json(escalationPolicyDropDownOptions);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /oncall\n router.get('/oncall-users', async (request, response) => {\n try {\n // Get the escalation policy ID from the request parameters with parameter name \"escalation_policy_ids[]\"\n const escalationPolicyId: string = request.query.escalation_policy_ids as string || '';\n const account = request.query.account as string || '';\n\n if (escalationPolicyId === '') {\n response.status(400).json(\"Bad Request: 'escalation_policy_ids[]' is required\");\n return;\n }\n\n const oncallUsers = await getOncallUsers(escalationPolicyId, account);\n const onCallUsersResponse: PagerDutyOnCallUsersResponse = {\n users: oncallUsers\n };\n\n response.json(onCallUsersResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId\n router.get('/services/:serviceId', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n if (serviceId === '') {\n response.status(400).json(\"Bad Request: ':serviceId' must be provided as part of the path or 'integration_key' as a query parameter\");\n return;\n }\n\n const service = await getServiceById(serviceId, account);\n const serviceResponse: PagerDutyServiceResponse = {\n service: service\n }\n\n response.json(serviceResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services?integration_key=:integrationKey\n router.get('/services', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const integrationKey: string = request.query.integration_key as string || '';\n const account = request.query.account as string || '';\n\n if (integrationKey !== '') {\n const service = await getServiceByIntegrationKey(integrationKey, account);\n const serviceResponse: PagerDutyServiceResponse = {\n service: service\n }\n\n response.json(serviceResponse);\n } else {\n const services = await getAllServices();\n const servicesResponse: PagerDutyServicesResponse = {\n services: services\n }\n\n response.json(servicesResponse);\n }\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // POST /services/:serviceId/integration/:vendorId\n router.post('/services/:serviceId/integration/:vendorId', async (request, response) => {\n try {\n const serviceId: string = request.params.serviceId || '';\n const vendorId: string = request.params.vendorId || '';\n const account = request.query.account as string || '';\n\n if (serviceId === '' || vendorId === '') {\n response.status(400).json(\"Bad Request: ':serviceId' and ':vendorId' must be provided as part of the path\");\n return;\n }\n\n const integrationKey = await createServiceIntegration({\n serviceId,\n vendorId,\n account\n });\n\n response.json(integrationKey);\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(`Error occurred while processing request: ${error.message}`);\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId/change-events\n router.get('/services/:serviceId/change-events', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n const changeEvents = await getChangeEvents(serviceId, account);\n const changeEventsResponse: PagerDutyChangeEventsResponse = {\n change_events: changeEvents\n }\n\n response.json(changeEventsResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId/incidents\n router.get('/services/:serviceId/incidents', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n const incidents = await getIncidents(serviceId, account);\n const incidentsResponse: PagerDutyIncidentsResponse = {\n incidents\n }\n\n response.json(incidentsResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId/standards\n router.get('/services/:serviceId/standards', async (request, response) => {\n try {\n\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n const serviceStandards = await getServiceStandards(serviceId, account);\n const serviceStandardsResponse: PagerDutyServiceStandardsResponse = {\n standards: serviceStandards\n }\n\n response.json(serviceStandardsResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /services/:serviceId/metrics\n router.get('/services/:serviceId/metrics', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = request.query.account as string || '';\n\n const metrics = await getServiceMetrics(serviceId, account);\n\n\n const metricsResponse: PagerDutyServiceMetricsResponse = {\n metrics: metrics\n };\n\n response.json(metricsResponse);\n\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [\n `${error.message}`\n ]\n });\n }\n }\n });\n\n // GET /health\n router.get('/health', async (_, response) => {\n response.status(200).json({ status: 'ok' });\n });\n\n // Add error handler\n router.use(errorHandler());\n\n // Return the router\n return router;\n}\n"],"names":["getServiceByIntegrationKey","auth","createLegacyAuthAdapters","loadAuthConfig","loadPagerDutyEndpointsFromConfig","Router","express","removeServiceRelationsFromService","HttpError","addServiceRelationsToService","getServiceRelationshipsById","getServiceById","createServiceIntegration","getAllServices","getAllEscalationPolicies","getOncallUsers","getChangeEvents","getIncidents","getServiceStandards","getServiceMetrics","errorHandler"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"router.cjs.js","sources":["../../src/service/router.ts"],"sourcesContent":["import {\n AuthService,\n DiscoveryService,\n LoggerService,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\nimport {\n createLegacyAuthAdapters,\n errorHandler,\n} from '@backstage/backend-common';\nimport {\n getAllEscalationPolicies,\n getChangeEvents,\n getIncidents,\n getOncallUsers,\n getServiceById,\n getServiceByIntegrationKey,\n getServiceStandards,\n getServiceMetrics,\n getAllServices,\n loadPagerDutyEndpointsFromConfig,\n createServiceIntegration,\n getServiceRelationshipsById,\n addServiceRelationsToService,\n removeServiceRelationsFromService,\n} from '../apis/pagerduty';\nimport {\n HttpError,\n PagerDutyChangeEventsResponse,\n PagerDutyIncidentsResponse,\n PagerDutyOnCallUsersResponse,\n PagerDutyServiceResponse,\n PagerDutyServiceStandardsResponse,\n PagerDutyServiceMetricsResponse,\n PagerDutyServicesResponse,\n PagerDutyEntityMapping,\n PagerDutyEntityMappingsResponse,\n PagerDutyService,\n PagerDutyServiceDependency,\n PagerDutySetting,\n} from '@pagerduty/backstage-plugin-common';\nimport { loadAuthConfig } from '../auth/auth';\nimport {\n PagerDutyBackendStore,\n RawDbEntityResultRow,\n} from '../db/PagerDutyBackendDatabase';\nimport * as express from 'express';\nimport Router from 'express-promise-router';\nimport type {\n CatalogApi,\n GetEntitiesResponse,\n} from '@backstage/catalog-client';\n\nexport interface RouterOptions {\n logger: LoggerService;\n config: RootConfigService;\n store: PagerDutyBackendStore;\n discovery: DiscoveryService;\n auth?: AuthService;\n catalogApi?: CatalogApi;\n}\n\nexport type Annotations = {\n 'pagerduty.com/integration-key': string;\n 'pagerduty.com/service-id': string;\n 'pagerduty.com/account': string;\n};\n\nexport async function createComponentEntitiesReferenceDict({\n items: componentEntities,\n}: GetEntitiesResponse): Promise<\n Record<string, { ref: string; name: string }>\n> {\n const componentEntitiesDict: Record<string, { ref: string; name: string }> =\n {};\n\n await Promise.all(\n componentEntities.map(async entity => {\n const serviceId =\n entity.metadata.annotations?.['pagerduty.com/service-id'];\n const integrationKey =\n entity.metadata.annotations?.['pagerduty.com/integration-key'];\n const account = entity.metadata.annotations?.['pagerduty.com/account'];\n\n if (serviceId !== undefined && serviceId !== '') {\n componentEntitiesDict[serviceId] = {\n ref: `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase(),\n name: entity.metadata.name,\n };\n } else if (integrationKey !== undefined && integrationKey !== '') {\n // get service id from integration key, we ignore errors here since we're focused\n // only on building a mapping between valid service IDs and the corresponding Backstage entity\n const service = await getServiceByIntegrationKey(\n integrationKey,\n account,\n ).catch(() => undefined);\n\n if (service !== undefined) {\n componentEntitiesDict[service.id] = {\n ref: `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase(),\n name: entity.metadata.name,\n };\n }\n }\n }),\n );\n\n return componentEntitiesDict;\n}\n\nexport async function buildEntityMappingsResponse(\n entityMappings: RawDbEntityResultRow[],\n componentEntitiesDict: Record<\n string,\n {\n ref: string;\n name: string;\n }\n >,\n componentEntities: GetEntitiesResponse,\n pagerDutyServices: PagerDutyService[],\n): Promise<PagerDutyEntityMappingsResponse> {\n const result: PagerDutyEntityMappingsResponse = {\n mappings: [],\n };\n\n pagerDutyServices.forEach(service => {\n // Check for service mapping annotation in any entity config file and get the entity ref\n const entityRef = componentEntitiesDict[service.id]?.ref;\n const entityName = componentEntitiesDict[service.id]?.name;\n\n // Check if the service is mapped to an entity in the database\n const entityMapping = entityMappings.find(\n mapping => mapping.serviceId === service.id,\n );\n\n if (entityMapping) {\n if (entityRef === undefined) {\n if (\n entityMapping.entityRef === '' ||\n entityMapping.entityRef === undefined\n ) {\n result.mappings.push({\n entityRef: '',\n entityName: '',\n integrationKey: entityMapping.integrationKey,\n serviceId: entityMapping.serviceId,\n status: 'NotMapped',\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? '',\n escalationPolicy:\n service.escalation_policy !== undefined\n ? service.escalation_policy.name\n : '',\n serviceUrl: service.html_url,\n account: service.account,\n });\n } else {\n const entityRefName =\n componentEntities.items.find(\n entity =>\n `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase() ===\n entityMapping.entityRef,\n )?.metadata.name ?? '';\n\n result.mappings.push({\n entityRef: entityMapping.entityRef,\n entityName: entityRefName,\n serviceId: entityMapping.serviceId,\n integrationKey: entityMapping.integrationKey,\n status: 'OutOfSync',\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? '',\n escalationPolicy:\n service.escalation_policy !== undefined\n ? service.escalation_policy.name\n : '',\n serviceUrl: service.html_url,\n account: service.account,\n });\n }\n } else if (entityRef !== entityMapping.entityRef) {\n const entityRefName =\n componentEntities.items.find(\n entity =>\n `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase() ===\n entityMapping.entityRef,\n )?.metadata.name ?? '';\n\n result.mappings.push({\n entityRef:\n entityMapping.entityRef !== '' ? entityMapping.entityRef : '',\n entityName: entityMapping.entityRef !== '' ? entityRefName : '',\n serviceId: entityMapping.serviceId,\n integrationKey: entityMapping.integrationKey,\n status: 'OutOfSync',\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? '',\n escalationPolicy:\n service.escalation_policy !== undefined\n ? service.escalation_policy.name\n : '',\n serviceUrl: service.html_url,\n account: service.account,\n });\n } else if (entityRef === entityMapping.entityRef) {\n result.mappings.push({\n entityRef:\n entityMapping.entityRef !== '' ? entityMapping.entityRef : '',\n entityName: entityMapping.entityRef !== '' ? entityName : '',\n serviceId: entityMapping.serviceId,\n integrationKey: entityMapping.integrationKey,\n status: 'InSync',\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? '',\n escalationPolicy:\n service.escalation_policy !== undefined\n ? service.escalation_policy.name\n : '',\n serviceUrl: service.html_url,\n account: service.account,\n });\n }\n } else {\n const backstageVendorId = 'PRO19CT';\n const backstageIntegrationKey =\n service.integrations?.find(\n integration => integration.vendor?.id === backstageVendorId,\n )?.integration_key ?? '';\n\n if (entityRef !== undefined) {\n result.mappings.push({\n entityRef: entityRef,\n entityName: entityName,\n serviceId: service.id,\n integrationKey: backstageIntegrationKey,\n status: 'InSync',\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? '',\n escalationPolicy:\n service.escalation_policy !== undefined\n ? service.escalation_policy.name\n : '',\n serviceUrl: service.html_url,\n account: service.account,\n });\n } else {\n result.mappings.push({\n entityRef: '',\n entityName: '',\n serviceId: service.id,\n integrationKey: backstageIntegrationKey,\n status: 'NotMapped',\n serviceName: service.name,\n team: service.teams?.[0]?.name ?? '',\n escalationPolicy:\n service.escalation_policy !== undefined\n ? service.escalation_policy.name\n : '',\n serviceUrl: service.html_url,\n account: service.account,\n });\n }\n }\n });\n\n const sortedResult = result.mappings.sort((a, b) => {\n if (a.serviceName! < b.serviceName!) {\n return -1;\n } else if (a.serviceName! > b.serviceName!) {\n return 1;\n }\n return 0;\n });\n\n result.mappings = sortedResult;\n\n return result;\n}\n\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const { logger, config, store, catalogApi } = options;\n let { auth } = options;\n\n if (!auth) {\n auth = createLegacyAuthAdapters(options).auth;\n }\n\n // Get authentication Config\n await loadAuthConfig(config, logger);\n\n // Get optional PagerDuty custom endpoints from config\n loadPagerDutyEndpointsFromConfig(config, logger);\n\n // Create the router\n const router = Router();\n router.use(express.json());\n\n // DELETE /dependencies/service/:serviceId\n router.delete(\n '/dependencies/service/:serviceId',\n async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId = request.params.serviceId || '';\n const account = (request.query.account as string) || '';\n\n if (serviceId === '') {\n response\n .status(400)\n .json(\n \"Bad Request: ':serviceId' must be provided as part of the path\",\n );\n return;\n }\n\n const dependencies: string[] =\n Object.keys(request.body).length === 0 ? [] : request.body;\n if (!dependencies || dependencies.length === 0) {\n response\n .status(400)\n .json(\n \"Bad Request: 'dependencies' must be provided as part of the request body\",\n );\n return;\n }\n\n const serviceRelations: PagerDutyServiceDependency[] = [];\n\n dependencies.forEach(async dependency => {\n serviceRelations.push({\n supporting_service: {\n id: dependency,\n type: 'service',\n },\n dependent_service: {\n id: serviceId,\n type: 'service',\n },\n });\n });\n\n await removeServiceRelationsFromService(serviceRelations, account);\n\n response.sendStatus(200);\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(\n `Error occurred while processing request: ${error.message}`,\n );\n response.status(error.status).json({\n errors: [`${error.message}`],\n });\n }\n }\n },\n );\n\n // POST /dependencies/service/:serviceId\n router.post('/dependencies/service/:serviceId', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId = request.params.serviceId || '';\n const account = (request.query.account as string) || '';\n\n if (serviceId === '') {\n response\n .status(400)\n .json(\n \"Bad Request: ':serviceId' must be provided as part of the path\",\n );\n return;\n }\n\n const dependencies: string[] =\n Object.keys(request.body).length === 0 ? [] : request.body;\n if (!dependencies || dependencies.length === 0) {\n response\n .status(400)\n .json(\n \"Bad Request: 'dependencies' must be provided as part of the request body\",\n );\n return;\n }\n\n const serviceRelations: PagerDutyServiceDependency[] = [];\n\n dependencies.forEach(async dependency => {\n serviceRelations.push({\n supporting_service: {\n id: dependency,\n type: 'service',\n },\n dependent_service: {\n id: serviceId,\n type: 'service',\n },\n });\n });\n\n await addServiceRelationsToService(serviceRelations, account);\n\n response.sendStatus(200);\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(\n `Error occurred while processing request: ${error.message}`,\n );\n response.status(error.status).json({\n errors: [`${error.message}`],\n });\n }\n }\n });\n\n router.get('/dependencies/service/:serviceId', async (request, response) => {\n try {\n const serviceId = request.params.serviceId;\n const account = (request.query.account as string) || '';\n\n if (serviceId) {\n const serviceRelationships: PagerDutyServiceDependency[] =\n await getServiceRelationshipsById(serviceId, account);\n\n if (serviceRelationships) {\n response.json({\n relationships: serviceRelationships,\n });\n }\n } else {\n response\n .status(400)\n .json(\n \"Bad Request: ':serviceId' must be provided as part of the path\",\n );\n }\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [`${error.message}`],\n });\n }\n }\n });\n\n // GET /catalog/entity/:entityRef\n router.get(\n '/catalog/entity/:type/:namespace/:name',\n async (request, response) => {\n const type = request.params.type;\n const namespace = request.params.namespace;\n const name = request.params.name;\n\n try {\n if (type && namespace && name) {\n const entityRef = `${type}:${namespace}/${name}`.toLowerCase();\n const foundEntity = await catalogApi?.getEntityByRef(entityRef);\n\n if (foundEntity) {\n response.json(\n foundEntity.metadata.annotations?.['pagerduty.com/service-id'],\n );\n } else {\n response.status(404);\n }\n } else {\n response\n .status(400)\n .json(\n \"Bad Request: ':entityRef' must be provided as part of the path\",\n );\n }\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [`${error.message}`],\n });\n }\n }\n },\n );\n\n // POST /settings\n router.post('/settings', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const settings: PagerDutySetting[] = request.body;\n\n // For each setting, update or insert the value in the database\n await Promise.all(\n settings.map(async setting => {\n if (setting.id === undefined || setting.value === undefined) {\n response\n .status(400)\n .json(\"Bad Request: 'id' and 'value' are required\");\n return;\n }\n\n if (!isValidSetting(setting.value)) {\n response\n .status(400)\n .json(\n \"Bad Request: 'value' is invalid. Valid options are 'backstage', 'pagerduty', 'both' or 'disabled'\",\n );\n return;\n }\n\n await store.updateSetting(setting);\n }),\n );\n\n response.sendStatus(200);\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(\n `Error occurred while processing request: ${error.message}`,\n );\n response.status(error.status).json({\n errors: [`${error.message}`],\n });\n }\n }\n });\n\n // GET /settings/:settingId\n router.get('/settings/:settingId', async (request, response) => {\n try {\n // Get param from the request\n const settingId = request.params.settingId;\n\n // Find setting by id\n const setting = await store.findSetting(settingId);\n\n if (!setting) {\n response.status(404).json({});\n return;\n }\n\n response.json(setting);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [`${error.message}`],\n });\n }\n }\n });\n\n function isValidSetting(value: string): boolean {\n if (\n value === 'backstage' ||\n value === 'pagerduty' ||\n value === 'both' ||\n value === 'disabled'\n ) {\n return true;\n }\n\n return false;\n }\n\n // POST /mapping/entity\n router.post('/mapping/entity', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const entity: PagerDutyEntityMapping = request.body;\n\n if (!entity.serviceId) {\n response\n .status(400)\n .json(\n \"Bad Request: 'serviceId' must be provided as part of the request body\",\n );\n return;\n }\n\n // Get all the entity mappings from the database\n const entityMappings = await store.getAllEntityMappings();\n const oldMapping = entityMappings.find(\n mapping => mapping.serviceId === entity.serviceId,\n );\n\n // in case a mapping is defined and no integration exists,\n // we need to create one\n if (\n entity.entityRef !== '' &&\n (entity.integrationKey === '' || entity.integrationKey === undefined)\n ) {\n const backstageVendorId = 'PRO19CT';\n // check for existing integration key on service\n const service = await getServiceById(entity.serviceId, entity.account);\n const backstageIntegration = service.integrations?.find(\n integration => integration.vendor?.id === backstageVendorId,\n );\n\n if (!backstageIntegration) {\n // If an integration does not exist for service,\n // create it in PagerDuty\n const integrationKey = await createServiceIntegration({\n serviceId: entity.serviceId,\n vendorId: backstageVendorId,\n account: entity.account,\n });\n\n entity.integrationKey = integrationKey;\n } else {\n entity.integrationKey = backstageIntegration.integration_key;\n }\n }\n\n const entityMappingId = await store.insertEntityMapping(entity);\n\n // Refresh new and old entity unless they are empty strings\n if (entity.entityRef !== '') {\n // force refresh of new entity\n await catalogApi?.refreshEntity(entity.entityRef);\n }\n\n if (oldMapping && oldMapping.entityRef !== '') {\n // force refresh of old entity\n await catalogApi?.refreshEntity(oldMapping.entityRef);\n }\n\n response.json({\n id: entityMappingId,\n entityRef: entity.entityRef,\n integrationKey: entity.integrationKey,\n serviceId: entity.serviceId,\n status: entity.status,\n account: entity.account,\n });\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(\n `Error occurred while processing request: ${error.message}`,\n );\n response.status(error.status).json({\n errors: [`${error.message}`],\n });\n }\n }\n });\n\n // GET /mapping/entity\n router.get('/mapping/entity', async (_, response) => {\n try {\n // Get all the entity mappings from the database\n const entityMappings = await store.getAllEntityMappings();\n\n // Get all the entities from the catalog\n const componentEntities = await catalogApi!.getEntities({\n filter: {\n kind: 'Component',\n },\n });\n\n // Build reference dictionary of componentEntities with serviceId as the key and entity reference and name pair as the value\n const componentEntitiesDict: Record<\n string,\n { ref: string; name: string }\n > = await createComponentEntitiesReferenceDict(componentEntities);\n\n // Get all services from PagerDuty\n const pagerDutyServices = await getAllServices();\n\n // Build the response object\n const result: PagerDutyEntityMappingsResponse =\n await buildEntityMappingsResponse(\n entityMappings,\n componentEntitiesDict,\n componentEntities,\n pagerDutyServices,\n );\n\n response.json(result);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [`${error.message}`],\n });\n }\n }\n });\n\n // GET /mapping/entity\n router.get(\n '/mapping/entity/:type/:namespace/:name',\n async (request, response) => {\n try {\n // Get the type, namespace and entity name from the request parameters\n const entityType: string = request.params.type || '';\n const entityNamespace: string = request.params.namespace || '';\n const entityName: string = request.params.name || '';\n\n if (entityType === '' || entityNamespace === '' || entityName === '') {\n response.status(400).json('Required params not specified.');\n return;\n }\n\n const entityRef =\n `${entityType}:${entityNamespace}/${entityName}`.toLowerCase();\n\n // Get all the entity mappings from the database\n const entityMapping = await store.findEntityMappingByEntityRef(\n entityRef,\n );\n\n if (!entityMapping) {\n response\n .status(404)\n .json(`Mapping for entityRef ${entityRef} not found.`);\n return;\n }\n\n response.json({\n mapping: entityMapping,\n });\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [`${error.message}`],\n });\n }\n }\n },\n );\n\n // GET /mapping/entity/service/:serviceId\n router.get(\n '/mapping/entity/service/:serviceId',\n async (request, response) => {\n try {\n // Get the type, namespace and entity name from the request parameters\n const serviceId: string = request.params.serviceId ?? '';\n\n if (serviceId === '') {\n response.status(400).json('Required params not specified.');\n return;\n }\n\n // Get all the entity mappings from the database\n const entityMapping = await store.findEntityMappingByServiceId(\n serviceId,\n );\n\n if (!entityMapping) {\n response\n .status(404)\n .json(`Mapping for serviceId ${serviceId} not found.`);\n return;\n }\n\n response.json({\n mapping: entityMapping,\n });\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [`${error.message}`],\n });\n }\n }\n },\n );\n\n // GET /escalation_policies\n router.get('/escalation_policies', async (_, response) => {\n try {\n let escalationPolicyList = await getAllEscalationPolicies();\n\n // sort the escalation policies by account and name\n escalationPolicyList = escalationPolicyList.sort((a, b) => {\n if (a.account === b.account) {\n return a.name.localeCompare(b.name);\n }\n return a.account!.localeCompare(b.account!);\n });\n\n const escalationPolicyDropDownOptions = escalationPolicyList.map(\n policy => {\n let policyLabel = policy.name;\n if (policy.account && policy.account !== 'default') {\n policyLabel = `(${policy.account}) ${policy.name}`;\n }\n\n return {\n label: policyLabel,\n value: policy.id,\n };\n },\n );\n\n response.json(escalationPolicyDropDownOptions);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [`${error.message}`],\n });\n }\n }\n });\n\n // GET /oncall\n router.get('/oncall-users', async (request, response) => {\n try {\n // Get the escalation policy ID from the request parameters with parameter name \"escalation_policy_ids[]\"\n const escalationPolicyId: string =\n (request.query.escalation_policy_ids as string) || '';\n const account = (request.query.account as string) || '';\n\n if (escalationPolicyId === '') {\n response\n .status(400)\n .json(\"Bad Request: 'escalation_policy_ids[]' is required\");\n return;\n }\n\n const oncallUsers = await getOncallUsers(escalationPolicyId, account);\n const onCallUsersResponse: PagerDutyOnCallUsersResponse = {\n users: oncallUsers,\n };\n\n response.json(onCallUsersResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [`${error.message}`],\n });\n }\n }\n });\n\n // GET /services/:serviceId\n router.get('/services/:serviceId', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = (request.query.account as string) || '';\n\n if (serviceId === '') {\n response\n .status(400)\n .json(\n \"Bad Request: ':serviceId' must be provided as part of the path or 'integration_key' as a query parameter\",\n );\n return;\n }\n\n const service = await getServiceById(serviceId, account);\n const serviceResponse: PagerDutyServiceResponse = {\n service: service,\n };\n\n response.json(serviceResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [`${error.message}`],\n });\n }\n }\n });\n\n // GET /services?integration_key=:integrationKey\n router.get('/services', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const integrationKey: string =\n (request.query.integration_key as string) || '';\n const account = (request.query.account as string) || '';\n\n if (integrationKey !== '') {\n const service = await getServiceByIntegrationKey(\n integrationKey,\n account,\n );\n const serviceResponse: PagerDutyServiceResponse = {\n service: service,\n };\n\n response.json(serviceResponse);\n } else {\n const services = await getAllServices();\n const servicesResponse: PagerDutyServicesResponse = {\n services: services,\n };\n\n response.json(servicesResponse);\n }\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [`${error.message}`],\n });\n }\n }\n });\n\n // POST /services/:serviceId/integration/:vendorId\n router.post(\n '/services/:serviceId/integration/:vendorId',\n async (request, response) => {\n try {\n const serviceId: string = request.params.serviceId || '';\n const vendorId: string = request.params.vendorId || '';\n const account = (request.query.account as string) || '';\n\n if (serviceId === '' || vendorId === '') {\n response\n .status(400)\n .json(\n \"Bad Request: ':serviceId' and ':vendorId' must be provided as part of the path\",\n );\n return;\n }\n\n const integrationKey = await createServiceIntegration({\n serviceId,\n vendorId,\n account,\n });\n\n response.json(integrationKey);\n } catch (error) {\n if (error instanceof HttpError) {\n logger.error(\n `Error occurred while processing request: ${error.message}`,\n );\n response.status(error.status).json({\n errors: [`${error.message}`],\n });\n }\n }\n },\n );\n\n // GET /services/:serviceId/change-events\n router.get(\n '/services/:serviceId/change-events',\n async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = (request.query.account as string) || '';\n\n const changeEvents = await getChangeEvents(serviceId, account);\n const changeEventsResponse: PagerDutyChangeEventsResponse = {\n change_events: changeEvents,\n };\n\n response.json(changeEventsResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [`${error.message}`],\n });\n }\n }\n },\n );\n\n // GET /services/:serviceId/incidents\n router.get('/services/:serviceId/incidents', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = (request.query.account as string) || '';\n\n const incidents = await getIncidents(serviceId, account);\n const incidentsResponse: PagerDutyIncidentsResponse = {\n incidents,\n };\n\n response.json(incidentsResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [`${error.message}`],\n });\n }\n }\n });\n\n // GET /services/:serviceId/standards\n router.get('/services/:serviceId/standards', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = (request.query.account as string) || '';\n\n const serviceStandards = await getServiceStandards(serviceId, account);\n const serviceStandardsResponse: PagerDutyServiceStandardsResponse = {\n standards: serviceStandards,\n };\n\n response.json(serviceStandardsResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [`${error.message}`],\n });\n }\n }\n });\n\n // GET /services/:serviceId/metrics\n router.get('/services/:serviceId/metrics', async (request, response) => {\n try {\n // Get the serviceId from the request parameters\n const serviceId: string = request.params.serviceId || '';\n const account = (request.query.account as string) || '';\n\n const metrics = await getServiceMetrics(serviceId, account);\n\n const metricsResponse: PagerDutyServiceMetricsResponse = {\n metrics: metrics,\n };\n\n response.json(metricsResponse);\n } catch (error) {\n if (error instanceof HttpError) {\n response.status(error.status).json({\n errors: [`${error.message}`],\n });\n }\n }\n });\n\n // GET /health\n router.get('/health', async (_, response) => {\n response.status(200).json({ status: 'ok' });\n });\n\n // Add error handler\n router.use(errorHandler());\n\n // Return the router\n return router;\n}\n"],"names":["getServiceByIntegrationKey","auth","createLegacyAuthAdapters","loadAuthConfig","loadPagerDutyEndpointsFromConfig","Router","express","removeServiceRelationsFromService","HttpError","addServiceRelationsToService","getServiceRelationshipsById","getServiceById","createServiceIntegration","getAllServices","getAllEscalationPolicies","getOncallUsers","getChangeEvents","getIncidents","getServiceStandards","getServiceMetrics","errorHandler"],"mappings":"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"}
|
|
@@ -2,33 +2,25 @@
|
|
|
2
2
|
* @param {import('knex').Knex} knex
|
|
3
3
|
*/
|
|
4
4
|
exports.up = async function up(knex) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
.string('integrationKey');
|
|
16
|
-
table.string('entityRef');
|
|
17
|
-
table
|
|
18
|
-
.dateTime('processedDate')
|
|
19
|
-
.defaultTo(knex.fn.now());
|
|
20
|
-
table.index('index', 'entity_mapping_index_idx');
|
|
21
|
-
table.index(['serviceId', 'entityRef'], 'entity_mapping_service_id_idx');
|
|
22
|
-
});
|
|
5
|
+
await knex.schema.createTable('pagerduty_entity_mapping', table => {
|
|
6
|
+
table.bigIncrements('index').notNullable();
|
|
7
|
+
table.string('id').notNullable();
|
|
8
|
+
table.string('serviceId').unique().notNullable();
|
|
9
|
+
table.string('integrationKey');
|
|
10
|
+
table.string('entityRef');
|
|
11
|
+
table.dateTime('processedDate').defaultTo(knex.fn.now());
|
|
12
|
+
table.index('index', 'entity_mapping_index_idx');
|
|
13
|
+
table.index(['serviceId', 'entityRef'], 'entity_mapping_service_id_idx');
|
|
14
|
+
});
|
|
23
15
|
};
|
|
24
16
|
|
|
25
17
|
/**
|
|
26
18
|
* @param {import('knex').Knex} knex
|
|
27
19
|
*/
|
|
28
20
|
exports.down = async function down(knex) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
};
|
|
21
|
+
await knex.schema.alterTable('pagerduty_entity_mapping', table => {
|
|
22
|
+
table.dropIndex([], 'entity_mapping_index_idx');
|
|
23
|
+
table.dropIndex([], 'entity_mapping_service_id_idx');
|
|
24
|
+
});
|
|
25
|
+
await knex.schema.dropTable('pagerduty_entity_mapping');
|
|
26
|
+
};
|
|
@@ -2,19 +2,25 @@
|
|
|
2
2
|
* @param {import('knex').Knex} knex
|
|
3
3
|
*/
|
|
4
4
|
exports.up = async function up(knex) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
await knex.schema.alterTable('pagerduty_entity_mapping', table => {
|
|
6
|
+
table.string('account');
|
|
7
|
+
table.dropIndex(
|
|
8
|
+
['serviceId', 'entityRef'],
|
|
9
|
+
'entity_mapping_service_id_idx',
|
|
10
|
+
);
|
|
11
|
+
table.index(
|
|
12
|
+
['serviceId', 'entityRef', 'account'],
|
|
13
|
+
'entity_mapping_service_id_idx',
|
|
14
|
+
);
|
|
15
|
+
});
|
|
10
16
|
};
|
|
11
17
|
|
|
12
18
|
/**
|
|
13
19
|
* @param {import('knex').Knex} knex
|
|
14
20
|
*/
|
|
15
21
|
exports.down = async function down(knex) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
};
|
|
22
|
+
await knex.schema.alterTable('pagerduty_entity_mapping', table => {
|
|
23
|
+
table.dropColumn('account');
|
|
24
|
+
table.dropIndex([], 'entity_mapping_service_id_idx');
|
|
25
|
+
});
|
|
26
|
+
};
|
|
@@ -2,26 +2,20 @@
|
|
|
2
2
|
* @param {import('knex').Knex} knex
|
|
3
3
|
*/
|
|
4
4
|
exports.up = async function up(knex) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
.string('value');
|
|
12
|
-
table
|
|
13
|
-
.dateTime('updatedAt')
|
|
14
|
-
.defaultTo(knex.fn.now());
|
|
15
|
-
table.index(['id'], 'settings_id_idx');
|
|
16
|
-
});
|
|
5
|
+
await knex.schema.createTable('pagerduty_settings', table => {
|
|
6
|
+
table.string('id').unique().notNullable();
|
|
7
|
+
table.string('value');
|
|
8
|
+
table.dateTime('updatedAt').defaultTo(knex.fn.now());
|
|
9
|
+
table.index(['id'], 'settings_id_idx');
|
|
10
|
+
});
|
|
17
11
|
};
|
|
18
12
|
|
|
19
13
|
/**
|
|
20
14
|
* @param {import('knex').Knex} knex
|
|
21
15
|
*/
|
|
22
16
|
exports.down = async function down(knex) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
};
|
|
17
|
+
await knex.schema.alterTable('pagerduty_settings', table => {
|
|
18
|
+
table.dropIndex([], 'settings_id_idx');
|
|
19
|
+
});
|
|
20
|
+
await knex.schema.dropTable('pagerduty_settings');
|
|
21
|
+
};
|