@pagerduty/backstage-plugin-backend 0.12.0 → 0.14.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/CHANGELOG.md +30 -0
- package/config.d.ts +43 -0
- package/dist/apis/pagerduty.cjs.js +364 -24
- package/dist/apis/pagerduty.cjs.js.map +1 -1
- package/dist/controllers/mappings-controller.cjs.js +31 -7
- package/dist/controllers/mappings-controller.cjs.js.map +1 -1
- package/dist/db/PagerDutyBackendDatabase.cjs.js +202 -4
- package/dist/db/PagerDutyBackendDatabase.cjs.js.map +1 -1
- package/dist/index.d.ts +44 -3
- package/dist/plugin.cjs.js +30 -4
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/service/customFieldsController.cjs.js +459 -0
- package/dist/service/customFieldsController.cjs.js.map +1 -0
- package/dist/service/router.cjs.js +99 -110
- package/dist/service/router.cjs.js.map +1 -1
- package/dist/services/autoMatchJobs.cjs.js +53 -0
- package/dist/services/autoMatchJobs.cjs.js.map +1 -0
- package/dist/services/autoMatchRunner.cjs.js +73 -0
- package/dist/services/autoMatchRunner.cjs.js.map +1 -0
- package/dist/services/dataLoader.cjs.js +14 -7
- package/dist/services/dataLoader.cjs.js.map +1 -1
- package/dist/services/syncLogsCleanup.cjs.js +77 -0
- package/dist/services/syncLogsCleanup.cjs.js.map +1 -0
- package/migrations/20260225113251_add_pagerduty_custom_fields_table.js +31 -0
- package/migrations/20260313_add_custom_fields_unique_indexes.js +27 -0
- package/migrations/20260515_add_custom_field_sync_logs_table.js +32 -0
- package/migrations/20260612_add_sync_logs_timestamp_index.js +19 -0
- package/package.json +7 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagerduty.cjs.js","sources":["../../src/apis/pagerduty.ts"],"sourcesContent":["import fetch from 'node-fetch';\nimport type { RequestInit, Response } from 'node-fetch';\n\nimport { getAuthToken } from '../auth/auth';\n\nimport {\n PagerDutyServiceResponse,\n PagerDutyServicesResponse,\n PagerDutyEscalationPolicy,\n PagerDutyEscalationPoliciesResponse,\n PagerDutyAbilitiesResponse,\n PagerDutyOnCallsResponse,\n PagerDutyUser,\n PagerDutyService,\n PagerDutyChangeEventsResponse,\n PagerDutyChangeEvent,\n PagerDutyIncident,\n PagerDutyIncidentsResponse,\n PagerDutyServiceStandards,\n PagerDutyServiceMetrics,\n HttpError,\n PagerDutyServicesAPIResponse,\n PagerDutyAccountConfig,\n PagerDutyIntegrationResponse,\n PagerDutyServiceDependency,\n PagerDutyServiceDependencyResponse,\n PagerDutyTeam,\n PagerDutyTeamsResponse,\n} from '@pagerduty/backstage-plugin-common';\n\nimport { DateTime } from 'luxon';\nimport {\n LoggerService,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\n\nexport type PagerDutyEndpointConfig = {\n eventsBaseUrl: string;\n apiBaseUrl: string;\n};\n\nconst EndpointConfig: Record<string, PagerDutyEndpointConfig> = {};\nlet fallbackEndpointConfig: PagerDutyEndpointConfig;\nlet isLegacyConfig = false;\n\nconst SubdomainConfig: Record<string, string> = {};\nlet fallbackSubdomain: string | undefined;\n\nexport function setFallbackAccountConfig(account: PagerDutyAccountConfig) {\n fallbackEndpointConfig = {\n eventsBaseUrl: account.eventsBaseUrl ?? 'https://events.pagerduty.com/v2',\n apiBaseUrl: account.apiBaseUrl ?? 'https://api.pagerduty.com',\n };\n\n if (account.oauth?.subDomain) {\n fallbackSubdomain = account.oauth.subDomain;\n }\n}\n\nexport function insertAccountConfig(account: PagerDutyAccountConfig) {\n EndpointConfig[account.id] = {\n eventsBaseUrl: account.eventsBaseUrl ?? 'https://events.pagerduty.com/v2',\n apiBaseUrl: account.apiBaseUrl ?? 'https://api.pagerduty.com',\n };\n\n if (account.oauth?.subDomain) {\n SubdomainConfig[account.id] = account.oauth.subDomain;\n }\n}\n\nexport function loadPagerDutyEndpointsFromConfig(\n config: RootConfigService,\n logger: LoggerService,\n) {\n const accounts = config.getOptional<PagerDutyAccountConfig[]>('pagerDuty.accounts');\n\n if (accounts) {\n logger.debug(\n `New accounts configuration detected. Loading PagerDuty endpoints from config.`,\n );\n isLegacyConfig = false;\n\n if (accounts?.length === 1) {\n logger.debug(\n `Single account configuration detected. Loading PagerDuty endpoints from config to 'default'.`,\n );\n EndpointConfig.default = {\n eventsBaseUrl:\n accounts[0].eventsBaseUrl !== undefined\n ? accounts[0].eventsBaseUrl\n : 'https://events.pagerduty.com/v2',\n apiBaseUrl:\n accounts[0].apiBaseUrl !== undefined\n ? accounts[0].apiBaseUrl\n : 'https://api.pagerduty.com',\n };\n\n if (accounts[0].oauth?.subDomain) {\n SubdomainConfig.default = accounts[0].oauth.subDomain;\n }\n } else {\n logger.debug(\n `Multiple account configuration detected. Loading PagerDuty endpoints from config.`,\n );\n accounts?.forEach(account => {\n if (account.isDefault) {\n setFallbackAccountConfig(account);\n }\n\n insertAccountConfig(account);\n });\n }\n } else {\n logger.debug(`Loading legacy PagerDuty endpoints from config.`);\n isLegacyConfig = true;\n\n EndpointConfig.default = {\n eventsBaseUrl:\n config.getOptionalString('pagerDuty.eventsBaseUrl') !== undefined\n ? config.getString('pagerDuty.eventsBaseUrl')\n : 'https://events.pagerduty.com/v2',\n apiBaseUrl:\n config.getOptionalString('pagerDuty.apiBaseUrl') !== undefined\n ? config.getString('pagerDuty.apiBaseUrl')\n : 'https://api.pagerduty.com',\n };\n\n const legacySubdomain = config.getOptionalString('pagerDuty.oauth.subDomain');\n\n if (legacySubdomain) {\n SubdomainConfig.default = legacySubdomain;\n }\n }\n}\n\nfunction getApiBaseUrl(account?: string): string {\n if (isLegacyConfig === true) {\n return EndpointConfig.default.apiBaseUrl;\n }\n\n if (account) {\n return EndpointConfig[account].apiBaseUrl;\n }\n\n return fallbackEndpointConfig.apiBaseUrl;\n}\n\nfunction getSubdomain(account?: string): string {\n if (isLegacyConfig === true) {\n return SubdomainConfig.default;\n }\n\n if (account && account !== 'default') {\n return SubdomainConfig[account] ?? fallbackSubdomain ?? SubdomainConfig.default;\n }\n\n return fallbackSubdomain ?? SubdomainConfig.default;\n}\n\nasync function getDefaultHeaders(account?: string): Promise<Record<string, string>> {\n const subdomain = getSubdomain(account);\n const clientHeader = `\"Backstage\" <https://${subdomain}.backstage.com>`;\n\n return {\n Authorization: await getAuthToken(account),\n Accept: 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n 'X-PagerDuty-Client': clientHeader,\n };\n}\n\n// Supporting router\nexport async function addServiceRelationsToService(\n serviceRelations: PagerDutyServiceDependency[],\n account?: string,\n): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: await getDefaultHeaders(account),\n body: JSON.stringify({\n relationships: serviceRelations,\n }),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/service_dependencies/associate`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service dependencies: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to add service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to add service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to add service dependencies. Caller did not supply credentials or did not provide the correct credentials. If you are using an API key, it may be invalid or your Authorization header may be malformed.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to add service dependencies. Caller is not authorized to view the requested resource. While your authentication is valid, the authenticated user or token does not have permission to perform this action.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to add service dependencies. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n } catch (error) {\n throw new HttpError(\n `Failed to parse service dependency information: ${error}`,\n 500,\n );\n }\n}\n\nexport async function removeServiceRelationsFromService(\n serviceRelations: PagerDutyServiceDependency[],\n account?: string,\n): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: await getDefaultHeaders(account),\n body: JSON.stringify({\n relationships: serviceRelations,\n }),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/service_dependencies/disassociate`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service dependencies: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to remove service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to remove service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to remove service dependencies. Caller did not supply credentials or did not provide the correct credentials. If you are using an API key, it may be invalid or your Authorization header may be malformed.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to remove service dependencies. Caller is not authorized to view the requested resource. While your authentication is valid, the authenticated user or token does not have permission to perform this action.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to remove service dependencies. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n } catch (error) {\n throw new HttpError(\n `Failed to parse service dependency information: ${error}`,\n 500,\n );\n }\n}\n\nexport async function getServiceRelationshipsById(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/service_dependencies/technical_services/${serviceId}`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service dependencies: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to list service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to list service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to list service dependencies. Caller did not supply credentials or did not provide the correct credentials. If you are using an API key, it may be invalid or your Authorization header may be malformed.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to list service dependencies. Caller is not authorized to view the requested resource. While your authentication is valid, the authenticated user or token does not have permission to perform this action.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to list service dependencies. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n } catch (error) {\n throw new HttpError(\n `Failed to parse service dependency information: ${error}`,\n 500,\n );\n }\n}\n\nasync function getEscalationPolicies(\n offset: number,\n limit: number,\n account?: string,\n): Promise<[boolean, PagerDutyEscalationPolicy[]]> {\n let response: Response;\n const params = `total=true&sort_by=name&offset=${offset}&limit=${limit}`;\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/escalation_policies`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve escalation policies: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to list escalation policies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to list escalation policies. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to list escalation policies. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to list escalation policies. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 429:\n throw new HttpError(\n 'Failed to list escalation policies. Rate limit exceeded.',\n 429,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyEscalationPoliciesResponse;\n try {\n result = (await response.json()) as PagerDutyEscalationPoliciesResponse;\n\n return [result.more ?? false, result.escalation_policies];\n } catch (error) {\n throw new HttpError(\n `Failed to parse escalation policy information: ${error}`,\n 500,\n );\n }\n}\n\nexport async function getAllEscalationPolicies(): Promise<\n PagerDutyEscalationPolicy[]\n> {\n const limit = 50;\n let offset = 0;\n let moreResults = false;\n let results: PagerDutyEscalationPolicy[] = [];\n\n await Promise.all(\n Object.keys(EndpointConfig).map(async account => {\n try {\n // reset offset value\n offset = 0;\n\n do {\n const res = await getEscalationPolicies(offset, limit, account);\n\n // set account for each escalation policy\n res[1].forEach(policy => {\n policy.account = account;\n });\n\n // update results\n results = results.concat(res[1]);\n\n // if more results exist\n if (res[0] === true) {\n moreResults = true;\n offset += limit;\n } else {\n moreResults = false;\n }\n } while (moreResults === true);\n } catch (error) {\n if (error instanceof HttpError) {\n throw error;\n } else {\n throw new HttpError(`${error}`, 500);\n }\n }\n }),\n );\n\n return results;\n}\n\nasync function getTeams(\n offset: number,\n limit: number,\n account?: string,\n): Promise<[boolean, PagerDutyTeam[]]> {\n let response: Response;\n const params = `total=true&sort_by=name&offset=${offset}&limit=${limit}`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n Accept: 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/teams`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve teams: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to list teams. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to list teams. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to list teams. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to list teams. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 429:\n throw new HttpError('Failed to list teams. Rate limit exceeded.', 429);\n default: // 200\n break;\n }\n\n let result: PagerDutyTeamsResponse;\n try {\n result = (await response.json()) as PagerDutyTeamsResponse;\n\n return [result.more ?? false, result.teams];\n } catch (error) {\n throw new HttpError(`Failed to parse team information: ${error}`, 500);\n }\n}\n\nexport async function getAllTeams(account?: string): Promise<PagerDutyTeam[]> {\n const limit = 50;\n let offset = 0;\n let moreResults = false;\n let results: PagerDutyTeam[] = [];\n\n const accountsToFetch = account ? [account] : Object.keys(EndpointConfig);\n\n await Promise.all(\n accountsToFetch.map(async acc => {\n try {\n offset = 0;\n\n do {\n const res = await getTeams(offset, limit, acc);\n\n res[1].forEach(team => {\n team.account = acc;\n });\n\n results = results.concat(res[1]);\n\n if (res[0] === true) {\n moreResults = true;\n offset += limit;\n } else {\n moreResults = false;\n }\n } while (moreResults === true);\n } catch (error) {\n if (error instanceof HttpError) {\n throw error;\n } else {\n throw new HttpError(`${error}`, 500);\n }\n }\n }),\n );\n\n // Sort teams alphabetically by name\n results.sort((a, b) => a.name.localeCompare(b.name));\n\n return results;\n}\n\nexport async function isEventNoiseReductionEnabled(\n account?: string,\n): Promise<boolean> {\n let response: Response;\n const baseUrl = 'https://api.pagerduty.com';\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n try {\n response = await fetchWithRetries(`${baseUrl}/abilities`, options);\n } catch (error) {\n throw new Error(`Failed to read abilities: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to read abilities. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 401:\n throw new Error(\n `Failed to read abilities. Caller did not supply credentials or did not provide the correct credentials.`,\n );\n case 403:\n throw new Error(\n `Failed to read abilities. Caller is not authorized to view the requested resource.`,\n );\n case 429:\n throw new Error(`Failed to read abilities. Rate limit exceeded.`);\n default: // 200\n break;\n }\n\n let result: PagerDutyAbilitiesResponse;\n try {\n result = (await response.json()) as PagerDutyAbilitiesResponse;\n\n if (\n result.abilities.includes('preview_intelligent_alert_grouping') &&\n result.abilities.includes('time_based_alert_grouping')\n ) {\n return true;\n }\n\n return false;\n } catch (error) {\n throw new Error(`Failed to parse abilities information: ${error}`);\n }\n}\n\nexport async function getOncallUsers(\n escalationPolicy: string,\n account?: string,\n): Promise<PagerDutyUser[]> {\n let response: Response;\n const params = `time_zone=UTC&include[]=users&escalation_policy_ids[]=${escalationPolicy}`;\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/oncalls`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve oncalls: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to list oncalls. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to list oncalls. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to list oncalls. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to list oncalls. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 429:\n throw new HttpError('Failed to list oncalls. Rate limit exceeded.', 429);\n default: // 200\n break;\n }\n\n let result: PagerDutyOnCallsResponse;\n let usersItem: PagerDutyUser[];\n try {\n result = (await response.json()) as PagerDutyOnCallsResponse;\n\n if (result.oncalls.length !== 0) {\n const oncallsSorted = [...result.oncalls].sort((a, b) => {\n return a.escalation_level - b.escalation_level;\n });\n\n const oncallsFiltered = oncallsSorted.filter(oncall => {\n return oncall.escalation_level === oncallsSorted[0].escalation_level;\n });\n\n usersItem = [...oncallsFiltered]\n .sort((a, b) => (a.user.name > b.user.name ? 1 : -1))\n .map(oncall => oncall.user);\n\n // remove duplicates from usersItem\n const uniqueUsers = new Map();\n usersItem.forEach(user => {\n uniqueUsers.set(user.id, user);\n });\n\n usersItem.length = 0;\n uniqueUsers.forEach(user => {\n usersItem.push(user);\n });\n\n return usersItem;\n }\n\n return [];\n } catch (error) {\n throw new HttpError(`Failed to parse oncall information: ${error}`, 500);\n }\n}\n\nexport async function getServiceById(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyService> {\n let response: Response;\n const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies`;\n\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetchWithRetries(\n `${baseUrl}/${serviceId}?${params}`,\n options,\n );\n } catch (error) {\n throw new Error(`Failed to retrieve service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get service. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to get service. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceResponse;\n try {\n result = (await response.json()) as PagerDutyServiceResponse;\n\n return result.service;\n } catch (error) {\n throw new HttpError(`Failed to parse service information: ${error}`, 500);\n }\n}\n\nexport async function getSerivcesByIdsAndAccount(\n serviceIds: string[],\n account?: string,\n): Promise<PagerDutyService[]> {\n let response: Response;\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: token,\n Accept: 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetchWithRetries(\n `${baseUrl}?id[]=${serviceIds.join('&id[]=')}`,\n options,\n );\n } catch (error) {\n throw new Error(`Failed to retrieve service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get service. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to get service. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServicesResponse;\n try {\n result = (await response.json()) as PagerDutyServicesResponse;\n\n return result.services ?? [];\n } catch (error) {\n throw new HttpError(`Failed to parse service information: ${error}`, 500);\n }\n}\n\nexport async function getServiceByIntegrationKey(\n integrationKey: string,\n account?: string,\n): Promise<PagerDutyService> {\n let response: Response;\n const params = `query=${integrationKey}&time_zone=UTC&include[]=integrations&include[]=escalation_policies`;\n\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get service. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to get service. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServicesResponse;\n try {\n result = (await response.json()) as PagerDutyServicesResponse;\n } catch (error) {\n throw new HttpError(`Failed to parse service information: ${error}`, 500);\n }\n\n if (result.services.length === 0) {\n throw new HttpError(\n `Failed to get service. The requested resource was not found.`,\n 404,\n );\n }\n\n return result.services[0];\n}\n\nexport async function getServicesByIds(\n ids: string[],\n): Promise<PagerDutyService[]> {\n let services: PagerDutyService[] = [];\n await Promise.all(\n Object.entries(EndpointConfig).map(async ([account, _]) => {\n services = await getSerivcesByIdsAndAccount(ids, account);\n }),\n );\n return services;\n}\n\nexport async function getAllServices(): Promise<PagerDutyService[]> {\n const allServices: PagerDutyService[] = [];\n\n await Promise.all(\n Object.entries(EndpointConfig).map(async ([account, _]) => {\n let response: Response;\n const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies&include[]=teams&total=true`;\n\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n let offset = 0;\n const limit = 50;\n let result: PagerDutyServicesAPIResponse;\n\n try {\n do {\n const paginatedUrl = `${baseUrl}?${params}&offset=${offset}&limit=${limit}`;\n\n response = await fetchWithRetries(paginatedUrl, options);\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get services. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get services. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get services. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get services. Caller is not authorized to view the requested resource.',\n 403,\n );\n default: // 200\n break;\n }\n\n result = (await response.json()) as PagerDutyServicesAPIResponse;\n\n result.services.forEach(service => {\n service.account = account;\n });\n\n allServices.push(...result.services);\n\n offset += limit;\n } while (offset < result.total!);\n } catch (error) {\n throw error;\n }\n }),\n );\n\n return allServices;\n}\n\nexport async function getServicesByPartialName(\n partialName: string,\n): Promise<PagerDutyService[]> {\n const allServices: PagerDutyService[] = [];\n\n await Promise.all(\n Object.entries(EndpointConfig).map(async ([account, _]) => {\n let response: Response;\n const params = `query=${encodeURIComponent(partialName)}&time_zone=UTC&include[]=integrations&include[]=escalation_policies&include[]=teams&total=true`;\n\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: token,\n Accept: 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n let offset = 0;\n const limit = 50;\n let result: PagerDutyServicesAPIResponse;\n\n try {\n do {\n const paginatedUrl = `${baseUrl}?${params}&offset=${offset}&limit=${limit}`;\n\n response = await fetchWithRetries(paginatedUrl, options);\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get services. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get services. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get services. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get services. Caller is not authorized to view the requested resource.',\n 403,\n );\n default: // 200\n break;\n }\n\n result = (await response.json()) as PagerDutyServicesAPIResponse;\n\n result.services.forEach(service => {\n service.account = account;\n });\n\n allServices.push(...result.services);\n\n offset += limit;\n } while (offset < result.total!);\n } catch (error) {\n throw error;\n }\n }),\n );\n\n return allServices;\n}\n\nexport async function getFilteredServices(\n teamIds?: string[],\n query?: string,\n maxLimit?: number,\n account?: string,\n): Promise<PagerDutyService[]> {\n const allServices: PagerDutyService[] = [];\n const limit = maxLimit || 100;\n\n const accountsToFetch = account ? [account] : Object.keys(EndpointConfig);\n\n await Promise.all(\n accountsToFetch.map(async (acc) => {\n let response: Response;\n let params = `time_zone=UTC&limit=${limit}`;\n\n if (teamIds && teamIds.length > 0) {\n const teamIdsParam = teamIds\n .map(id => `team_ids[]=${id}`)\n .join('&');\n params += `&${teamIdsParam}`;\n }\n\n if (query && query.trim() !== '') {\n params += `&query=${encodeURIComponent(query.trim())}`;\n }\n\n const token = await getAuthToken(acc);\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: token,\n Accept: 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(acc);\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n // Fetch only ONE page with the specified limit\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get services. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get services. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get services. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get services. Caller is not authorized to view the requested resource.',\n 403,\n );\n default: // 200\n break;\n }\n\n const result = (await response.json()) as PagerDutyServicesAPIResponse;\n\n // set account for each service\n result.services.forEach(service => {\n service.account = acc;\n });\n\n allServices.push(...result.services);\n } catch (error) {\n throw error;\n }\n }),\n );\n\n return allServices;\n}\n\nexport async function getChangeEvents(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyChangeEvent[]> {\n let response: Response;\n const params = `limit=5&time_zone=UTC&sort_by=timestamp`;\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetchWithRetries(\n `${baseUrl}/${serviceId}/change_events?${params}`,\n options,\n );\n } catch (error) {\n throw new Error(`Failed to retrieve change events for service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get change events for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get change events for service. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get change events for service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get change events for service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to get change events for service. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyChangeEventsResponse;\n try {\n result = (await response.json()) as PagerDutyChangeEventsResponse;\n\n return result.change_events;\n } catch (error) {\n throw new HttpError(\n `Failed to parse change events information: ${error}`,\n 500,\n );\n }\n}\n\nexport async function getIncidents(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyIncident[]> {\n let response: Response;\n const params = `time_zone=UTC&sort_by=created_at&statuses[]=triggered&statuses[]=acknowledged&service_ids[]=${serviceId}`;\n\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/incidents`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve incidents for service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get incidents for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get incidents for service. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get incidents for service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 402:\n throw new HttpError(\n 'Failed to get incidents for service. Account does not have the abilities to perform the action. Please review the response for the required abilities.',\n 402,\n );\n case 403:\n throw new HttpError(\n 'Failed to get incidents for service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 429:\n throw new HttpError(\n 'Failed to get incidents for service. Too many requests have been made, the rate limit has been reached.',\n 429,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyIncidentsResponse;\n try {\n result = (await response.json()) as PagerDutyIncidentsResponse;\n\n return result.incidents;\n } catch (error) {\n throw new HttpError(`Failed to parse incidents information: ${error}`, 500);\n }\n}\n\nexport async function getServiceStandards(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyServiceStandards> {\n let response: Response;\n\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/standards/scores/technical_services/${serviceId}`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(\n `Failed to retrieve service standards for service: ${error}`,\n );\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get service standards for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 401:\n throw new HttpError(\n 'Failed to get service standards for service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get service standards for service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 429:\n throw new HttpError(\n 'Failed to get service standards for service. Too many requests have been made, the rate limit has been reached.',\n 429,\n );\n default: // 200\n break;\n }\n\n try {\n const result = await response.json();\n return result;\n } catch (error) {\n throw new HttpError(\n `Failed to parse service standards information: ${error}`,\n 500,\n );\n }\n}\n\nexport async function getServiceMetrics(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyServiceMetrics[]> {\n let response: Response;\n\n const endDate = DateTime.now();\n const startDate = endDate.minus({ days: 30 });\n const body = JSON.stringify({\n filters: {\n created_at_start: startDate.toISO(),\n created_at_end: endDate.toISO(),\n service_ids: [serviceId],\n },\n });\n\n const options: RequestInit = {\n method: 'POST',\n headers: await getDefaultHeaders(account),\n body: body,\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/analytics/metrics/incidents/services`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service metrics for service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get service metrics for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get service metrics for service. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.',\n 400,\n );\n case 429:\n throw new HttpError(\n 'Failed to get service metrics for service. Too many requests have been made, the rate limit has been reached.',\n 429,\n );\n default: // 200\n break;\n }\n\n try {\n const result = await response.json();\n\n return result.data;\n } catch (error) {\n throw new HttpError(\n `Failed to parse service metrics information: ${error}`,\n 500,\n );\n }\n}\n\nexport type CreateServiceIntegrationProps = {\n serviceId: string;\n vendorId: string;\n account?: string;\n};\n\nexport async function createServiceIntegration({\n serviceId,\n vendorId,\n account,\n}: CreateServiceIntegrationProps): Promise<string> {\n let response: Response;\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n const options: RequestInit = {\n method: 'POST',\n body: JSON.stringify({\n integration: {\n name: 'Backstage',\n service: {\n id: serviceId,\n type: 'service_reference',\n },\n vendor: {\n id: vendorId,\n type: 'vendor_reference',\n },\n },\n }),\n headers: await getDefaultHeaders(account),\n };\n\n try {\n response = await fetchWithRetries(\n `${baseUrl}/${serviceId}/integrations`,\n options,\n );\n } catch (error) {\n throw new Error(`Failed to create service integration: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new Error(\n `Failed to create service integration. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new Error(\n `Failed to create service integration. Caller provided invalid arguments.`,\n );\n case 401:\n throw new Error(\n `Failed to create service integration. Caller did not supply credentials or did not provide the correct credentials.`,\n );\n case 403:\n throw new Error(\n `Failed to create service integration. Caller is not authorized to view the requested resource.`,\n );\n case 429:\n throw new Error(\n `Failed to create service integration. Rate limit exceeded.`,\n );\n default: // 201\n break;\n }\n\n let result: PagerDutyIntegrationResponse;\n try {\n result = (await response.json()) as PagerDutyIntegrationResponse;\n\n return result.integration.integration_key ?? '';\n } catch (error) {\n throw new Error(`Failed to parse service information: ${error}`);\n }\n}\n\nexport async function fetchWithRetries(\n url: string,\n options: RequestInit,\n): Promise<Response> {\n let response: Response;\n let error: Error = new Error();\n\n // set retry parameters\n const maxRetries = 5;\n const delay = 1000;\n let factor = 2;\n\n for (let i = 0; i < maxRetries; i++) {\n try {\n response = await fetch(url, options);\n return response;\n } catch (e) {\n error = e as Error;\n }\n\n const timeout = delay * factor;\n await new Promise(resolve => setTimeout(resolve, timeout));\n factor *= 2;\n }\n\n throw new Error(\n `Failed to fetch data after ${maxRetries} retries. Last error: ${error}`,\n );\n}\n"],"names":["getAuthToken","HttpError","DateTime","fetch"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pagerduty.cjs.js","sources":["../../src/apis/pagerduty.ts"],"sourcesContent":["import fetch from 'node-fetch';\nimport type { RequestInit, Response } from 'node-fetch';\n\nimport { getAuthToken } from '../auth/auth';\n\nimport {\n PagerDutyServiceResponse,\n PagerDutyServicesResponse,\n PagerDutyEscalationPolicy,\n PagerDutyEscalationPoliciesResponse,\n PagerDutyAbilitiesResponse,\n PagerDutyOnCallsResponse,\n PagerDutyUser,\n PagerDutyService,\n PagerDutyChangeEventsResponse,\n PagerDutyChangeEvent,\n PagerDutyIncident,\n PagerDutyIncidentsResponse,\n PagerDutyServiceStandards,\n PagerDutyServiceMetrics,\n HttpError,\n PagerDutyServicesAPIResponse,\n PagerDutyAccountConfig,\n PagerDutyIntegrationResponse,\n PagerDutyServiceDependency,\n PagerDutyServiceDependencyResponse,\n PagerDutyTeam,\n PagerDutyTeamsResponse,\n PagerDutyCustomFieldCreateRequest,\n PagerDutyCustomFieldResponse,\n PagerDutyCustomFieldsResponse,\n PagerDutyCustomFieldUpdateRequest,\n PagerDutyServiceCustomFieldValuesRequest,\n PagerDutyServiceCustomFieldValuesResponse,\n} from '@pagerduty/backstage-plugin-common';\n\nimport { DateTime } from 'luxon';\nimport {\n CacheService,\n LoggerService,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\n\nexport type PagerDutyEndpointConfig = {\n eventsBaseUrl: string;\n apiBaseUrl: string;\n};\n\nconst EndpointConfig: Record<string, PagerDutyEndpointConfig> = {};\nlet fallbackEndpointConfig: PagerDutyEndpointConfig;\nlet isLegacyConfig = false;\n\nconst SubdomainConfig: Record<string, string> = {};\nlet fallbackSubdomain: string | undefined;\n\nexport function setFallbackAccountConfig(account: PagerDutyAccountConfig) {\n fallbackEndpointConfig = {\n eventsBaseUrl: account.eventsBaseUrl ?? 'https://events.pagerduty.com/v2',\n apiBaseUrl: account.apiBaseUrl ?? 'https://api.pagerduty.com',\n };\n\n if (account.oauth?.subDomain) {\n fallbackSubdomain = account.oauth.subDomain;\n }\n}\n\nexport function insertAccountConfig(account: PagerDutyAccountConfig) {\n EndpointConfig[account.id] = {\n eventsBaseUrl: account.eventsBaseUrl ?? 'https://events.pagerduty.com/v2',\n apiBaseUrl: account.apiBaseUrl ?? 'https://api.pagerduty.com',\n };\n\n if (account.oauth?.subDomain) {\n SubdomainConfig[account.id] = account.oauth.subDomain;\n }\n}\n\n// Remove a previously inserted account from the in-memory endpoint config.\n// Primarily used by tests to tear down accounts they register so the shared\n// EndpointConfig does not leak between cases.\nexport function removeAccountConfig(accountId: string) {\n delete EndpointConfig[accountId];\n delete SubdomainConfig[accountId];\n}\n\nexport function loadPagerDutyEndpointsFromConfig(\n config: RootConfigService,\n logger: LoggerService,\n) {\n const accounts = config.getOptional<PagerDutyAccountConfig[]>('pagerDuty.accounts');\n\n if (accounts) {\n logger.debug(\n `New accounts configuration detected. Loading PagerDuty endpoints from config.`,\n );\n isLegacyConfig = false;\n\n if (accounts?.length === 1) {\n logger.debug(\n `Single account configuration detected. Loading PagerDuty endpoints from config to 'default'.`,\n );\n EndpointConfig.default = {\n eventsBaseUrl:\n accounts[0].eventsBaseUrl !== undefined\n ? accounts[0].eventsBaseUrl\n : 'https://events.pagerduty.com/v2',\n apiBaseUrl:\n accounts[0].apiBaseUrl !== undefined\n ? accounts[0].apiBaseUrl\n : 'https://api.pagerduty.com',\n };\n\n if (accounts[0].oauth?.subDomain) {\n SubdomainConfig.default = accounts[0].oauth.subDomain;\n }\n } else {\n logger.debug(\n `Multiple account configuration detected. Loading PagerDuty endpoints from config.`,\n );\n accounts?.forEach(account => {\n if (account.isDefault) {\n setFallbackAccountConfig(account);\n }\n\n insertAccountConfig(account);\n });\n }\n } else {\n logger.debug(`Loading legacy PagerDuty endpoints from config.`);\n isLegacyConfig = true;\n\n EndpointConfig.default = {\n eventsBaseUrl:\n config.getOptionalString('pagerDuty.eventsBaseUrl') !== undefined\n ? config.getString('pagerDuty.eventsBaseUrl')\n : 'https://events.pagerduty.com/v2',\n apiBaseUrl:\n config.getOptionalString('pagerDuty.apiBaseUrl') !== undefined\n ? config.getString('pagerDuty.apiBaseUrl')\n : 'https://api.pagerduty.com',\n };\n\n const legacySubdomain = config.getOptionalString('pagerDuty.oauth.subDomain');\n\n if (legacySubdomain) {\n SubdomainConfig.default = legacySubdomain;\n }\n }\n}\n\nfunction getApiBaseUrl(account?: string): string {\n if (isLegacyConfig === true) {\n return EndpointConfig.default.apiBaseUrl;\n }\n\n if (account) {\n return EndpointConfig[account].apiBaseUrl;\n }\n\n return fallbackEndpointConfig.apiBaseUrl;\n}\n\nfunction getSubdomain(account?: string): string {\n if (isLegacyConfig === true) {\n return SubdomainConfig.default;\n }\n\n if (account && account !== 'default') {\n return SubdomainConfig[account] ?? fallbackSubdomain ?? SubdomainConfig.default;\n }\n\n return fallbackSubdomain ?? SubdomainConfig.default;\n}\n\nasync function getDefaultHeaders(account?: string): Promise<Record<string, string>> {\n const subdomain = getSubdomain(account);\n const clientHeader = `\"Backstage\" <https://${subdomain}.backstage.com>`;\n\n return {\n Authorization: await getAuthToken(account),\n Accept: 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n 'X-PagerDuty-Client': clientHeader,\n };\n}\n\n// Caching for PagerDuty services. A full fetch is cached as a list, and each\n// service is also indexed by id so single-service lookups can be served from\n// the cache without hitting the API again.\nconst SERVICES_CACHE_TTL_MS = 20 * 60 * 1000;\nconst ALL_SERVICES_CACHE_KEY = 'pagerduty:services:all';\n\n// Normalize the account segment so callers that pass an empty string (e.g. the\n// frontend bulk-mapping payload) hit the same key as the full-fetch indexer,\n// which stores services under the EndpointConfig key ('default' for single\n// account setups).\nconst serviceCacheKey = (serviceId: string, account?: string) =>\n `pagerduty:service:${account || 'default'}:${serviceId}`;\n\nasync function readCache<T>(\n cache: CacheService | undefined,\n key: string,\n): Promise<T | undefined> {\n if (!cache) {\n return undefined;\n }\n return (await cache.get(key)) as T | undefined;\n}\n\nasync function writeCache(\n cache: CacheService | undefined,\n key: string,\n value: unknown,\n): Promise<void> {\n if (!cache) {\n return;\n }\n await cache.set(\n key,\n value as Parameters<CacheService['set']>[1],\n { ttl: SERVICES_CACHE_TTL_MS },\n );\n}\n\nasync function deleteCache(\n cache: CacheService | undefined,\n key: string,\n): Promise<void> {\n if (!cache) {\n return;\n }\n await cache.delete(key);\n}\n\n// Supporting router\nexport async function addServiceRelationsToService(\n serviceRelations: PagerDutyServiceDependency[],\n account?: string,\n): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: await getDefaultHeaders(account),\n body: JSON.stringify({\n relationships: serviceRelations,\n }),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/service_dependencies/associate`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service dependencies: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to add service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to add service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to add service dependencies. Caller did not supply credentials or did not provide the correct credentials. If you are using an API key, it may be invalid or your Authorization header may be malformed.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to add service dependencies. Caller is not authorized to view the requested resource. While your authentication is valid, the authenticated user or token does not have permission to perform this action.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to add service dependencies. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n } catch (error) {\n throw new HttpError(\n `Failed to parse service dependency information: ${error}`,\n 500,\n );\n }\n}\n\nexport async function removeServiceRelationsFromService(\n serviceRelations: PagerDutyServiceDependency[],\n account?: string,\n): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: await getDefaultHeaders(account),\n body: JSON.stringify({\n relationships: serviceRelations,\n }),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/service_dependencies/disassociate`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service dependencies: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to remove service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to remove service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to remove service dependencies. Caller did not supply credentials or did not provide the correct credentials. If you are using an API key, it may be invalid or your Authorization header may be malformed.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to remove service dependencies. Caller is not authorized to view the requested resource. While your authentication is valid, the authenticated user or token does not have permission to perform this action.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to remove service dependencies. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n } catch (error) {\n throw new HttpError(\n `Failed to parse service dependency information: ${error}`,\n 500,\n );\n }\n}\n\nexport async function getServiceRelationshipsById(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/service_dependencies/technical_services/${encodeURIComponent(serviceId)}`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service dependencies: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to list service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to list service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to list service dependencies. Caller did not supply credentials or did not provide the correct credentials. If you are using an API key, it may be invalid or your Authorization header may be malformed.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to list service dependencies. Caller is not authorized to view the requested resource. While your authentication is valid, the authenticated user or token does not have permission to perform this action.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to list service dependencies. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n } catch (error) {\n throw new HttpError(\n `Failed to parse service dependency information: ${error}`,\n 500,\n );\n }\n}\n\nasync function getEscalationPolicies(\n offset: number,\n limit: number,\n account?: string,\n): Promise<[boolean, PagerDutyEscalationPolicy[]]> {\n let response: Response;\n const params = `total=true&sort_by=name&offset=${offset}&limit=${limit}`;\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/escalation_policies`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve escalation policies: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to list escalation policies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to list escalation policies. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to list escalation policies. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to list escalation policies. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 429:\n throw new HttpError(\n 'Failed to list escalation policies. Rate limit exceeded.',\n 429,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyEscalationPoliciesResponse;\n try {\n result = (await response.json()) as PagerDutyEscalationPoliciesResponse;\n\n return [result.more ?? false, result.escalation_policies];\n } catch (error) {\n throw new HttpError(\n `Failed to parse escalation policy information: ${error}`,\n 500,\n );\n }\n}\n\nexport async function getAllEscalationPolicies(): Promise<\n PagerDutyEscalationPolicy[]\n> {\n const limit = 50;\n let offset = 0;\n let moreResults = false;\n let results: PagerDutyEscalationPolicy[] = [];\n\n await Promise.all(\n Object.keys(EndpointConfig).map(async account => {\n try {\n // reset offset value\n offset = 0;\n\n do {\n const res = await getEscalationPolicies(offset, limit, account);\n\n // set account for each escalation policy\n res[1].forEach(policy => {\n policy.account = account;\n });\n\n // update results\n results = results.concat(res[1]);\n\n // if more results exist\n if (res[0] === true) {\n moreResults = true;\n offset += limit;\n } else {\n moreResults = false;\n }\n } while (moreResults === true);\n } catch (error) {\n if (error instanceof HttpError) {\n throw error;\n } else {\n throw new HttpError(`${error}`, 500);\n }\n }\n }),\n );\n\n return results;\n}\n\nasync function getTeams(\n offset: number,\n limit: number,\n account?: string,\n): Promise<[boolean, PagerDutyTeam[]]> {\n let response: Response;\n const params = `total=true&sort_by=name&offset=${offset}&limit=${limit}`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: await getAuthToken(account),\n Accept: 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/teams`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve teams: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to list teams. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to list teams. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to list teams. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to list teams. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 429:\n throw new HttpError('Failed to list teams. Rate limit exceeded.', 429);\n default: // 200\n break;\n }\n\n let result: PagerDutyTeamsResponse;\n try {\n result = (await response.json()) as PagerDutyTeamsResponse;\n\n return [result.more ?? false, result.teams];\n } catch (error) {\n throw new HttpError(`Failed to parse team information: ${error}`, 500);\n }\n}\n\nexport async function getAllTeams(account?: string): Promise<PagerDutyTeam[]> {\n const limit = 50;\n let offset = 0;\n let moreResults = false;\n let results: PagerDutyTeam[] = [];\n\n const accountsToFetch = account ? [account] : Object.keys(EndpointConfig);\n\n await Promise.all(\n accountsToFetch.map(async acc => {\n try {\n offset = 0;\n\n do {\n const res = await getTeams(offset, limit, acc);\n\n res[1].forEach(team => {\n team.account = acc;\n });\n\n results = results.concat(res[1]);\n\n if (res[0] === true) {\n moreResults = true;\n offset += limit;\n } else {\n moreResults = false;\n }\n } while (moreResults === true);\n } catch (error) {\n if (error instanceof HttpError) {\n throw error;\n } else {\n throw new HttpError(`${error}`, 500);\n }\n }\n }),\n );\n\n // Sort teams alphabetically by name\n results.sort((a, b) => a.name.localeCompare(b.name));\n\n return results;\n}\n\nexport async function isEventNoiseReductionEnabled(\n account?: string,\n): Promise<boolean> {\n let response: Response;\n const baseUrl = 'https://api.pagerduty.com';\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n try {\n response = await fetchWithRetries(`${baseUrl}/abilities`, options);\n } catch (error) {\n throw new Error(`Failed to read abilities: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to read abilities. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 401:\n throw new Error(\n `Failed to read abilities. Caller did not supply credentials or did not provide the correct credentials.`,\n );\n case 403:\n throw new Error(\n `Failed to read abilities. Caller is not authorized to view the requested resource.`,\n );\n case 429:\n throw new Error(`Failed to read abilities. Rate limit exceeded.`);\n default: // 200\n break;\n }\n\n let result: PagerDutyAbilitiesResponse;\n try {\n result = (await response.json()) as PagerDutyAbilitiesResponse;\n\n if (\n result.abilities.includes('preview_intelligent_alert_grouping') &&\n result.abilities.includes('time_based_alert_grouping')\n ) {\n return true;\n }\n\n return false;\n } catch (error) {\n throw new Error(`Failed to parse abilities information: ${error}`);\n }\n}\n\nexport async function getOncallUsers(\n escalationPolicy: string,\n account?: string,\n): Promise<PagerDutyUser[]> {\n let response: Response;\n const params = `time_zone=UTC&include[]=users&escalation_policy_ids[]=${escalationPolicy}`;\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/oncalls`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve oncalls: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to list oncalls. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to list oncalls. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to list oncalls. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to list oncalls. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 429:\n throw new HttpError('Failed to list oncalls. Rate limit exceeded.', 429);\n default: // 200\n break;\n }\n\n let result: PagerDutyOnCallsResponse;\n let usersItem: PagerDutyUser[];\n try {\n result = (await response.json()) as PagerDutyOnCallsResponse;\n\n if (result.oncalls.length !== 0) {\n const oncallsSorted = [...result.oncalls].sort((a, b) => {\n return a.escalation_level - b.escalation_level;\n });\n\n const oncallsFiltered = oncallsSorted.filter(oncall => {\n return oncall.escalation_level === oncallsSorted[0].escalation_level;\n });\n\n usersItem = [...oncallsFiltered]\n .sort((a, b) => (a.user.name > b.user.name ? 1 : -1))\n .map(oncall => oncall.user);\n\n // remove duplicates from usersItem\n const uniqueUsers = new Map();\n usersItem.forEach(user => {\n uniqueUsers.set(user.id, user);\n });\n\n usersItem.length = 0;\n uniqueUsers.forEach(user => {\n usersItem.push(user);\n });\n\n return usersItem;\n }\n\n return [];\n } catch (error) {\n throw new HttpError(`Failed to parse oncall information: ${error}`, 500);\n }\n}\n\nexport async function getServiceById(\n serviceId: string,\n account?: string,\n cache?: CacheService,\n logger?: LoggerService,\n): Promise<PagerDutyService> {\n // Serve from cache first if this specific service is already cached.\n const cacheKey = serviceCacheKey(serviceId, account);\n const cached = await readCache<PagerDutyService>(cache, cacheKey);\n if (cached) {\n logger?.debug(`getServiceById: cache HIT for ${cacheKey}`);\n return cached;\n }\n if (cache) {\n logger?.debug(\n `getServiceById: cache MISS for ${cacheKey}, fetching from PagerDuty API`,\n );\n }\n\n let response: Response;\n const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies`;\n\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetchWithRetries(\n `${baseUrl}/${encodeURIComponent(serviceId)}?${params}`,\n options,\n );\n } catch (error) {\n throw new Error(`Failed to retrieve service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get service. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to get service. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceResponse;\n try {\n result = (await response.json()) as PagerDutyServiceResponse;\n\n await writeCache(cache, serviceCacheKey(serviceId, account), result.service);\n\n return result.service;\n } catch (error) {\n throw new HttpError(`Failed to parse service information: ${error}`, 500);\n }\n}\n\n// PagerDuty's `id[]` filter accepts at most 100 ids per request, and packing\n// too many into the query string produces a URL long enough for the API\n// gateway to reject with an HTML error page. Keep batches well under both\n// limits.\nconst SERVICE_IDS_BATCH_SIZE = 50;\n\n// PagerDuty resource ids are uppercase alphanumeric, conventionally 7 chars\n// (e.g. \"PXXXXXX\"). The `id[]` list filter rejects the ENTIRE request with a\n// 400 if any single value is malformed, so drop clearly-invalid ids before\n// calling the API. Permissive on length (>= 6) to avoid rejecting valid ids,\n// while still catching pasted URLs, whitespace, lowercase, and typos.\nconst SERVICE_ID_PATTERN = /^[A-Z0-9]{6,}$/;\n\nexport function isValidServiceId(id: string | undefined | null): boolean {\n if (typeof id !== 'string') {\n return false;\n }\n return SERVICE_ID_PATTERN.test(id.trim());\n}\n\nasync function getServicesByIdsBatch(\n serviceIds: string[],\n account?: string,\n): Promise<PagerDutyService[]> {\n let response: Response;\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: token,\n Accept: 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n const params = new URLSearchParams();\n serviceIds.forEach(id => params.append('id[]', id));\n // Without an explicit limit the `/services` list endpoint defaults to a page\n // size of 25, which would silently drop ids 26+ of a full batch. Set the\n // limit to the batch size (kept under PagerDuty's 100-id ceiling) so the\n // whole batch always fits in this single, non-paginated request.\n params.append('limit', String(SERVICE_IDS_BATCH_SIZE));\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n // The `id[]` list filter returns 400 if any single id is malformed. We\n // already sanitize ids before calling this, but treat a 400 from the\n // *list* endpoint as \"no matching services\" rather than failing the whole\n // page — a list query that matches nothing should degrade gracefully.\n // (Single-service fetches such as getServiceById still throw on 400.)\n return [];\n case 401:\n throw new HttpError(\n 'Failed to get service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to get service. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServicesResponse;\n try {\n result = (await response.json()) as PagerDutyServicesResponse;\n\n return result.services ?? [];\n } catch (error) {\n throw new HttpError(`Failed to parse service information: ${error}`, 500);\n }\n}\n\nexport async function getSerivcesByIdsAndAccount(\n serviceIds: string[],\n account?: string,\n): Promise<PagerDutyService[]> {\n // Service ids originate from user-authored entity annotations and stored\n // mappings, so trim and drop any malformed values. PagerDuty rejects the\n // entire `id[]` request with a 400 if even one value is malformed, which\n // would otherwise fail the whole page. Re-dedupe after trimming since that\n // can newly collide e.g. \"PXXXXXX \" with \"PXXXXXX\".\n const sanitizedServiceIds = Array.from(\n new Set(\n serviceIds\n .map(id => (typeof id === 'string' ? id.trim() : ''))\n .filter(id => isValidServiceId(id)),\n ),\n );\n\n if (sanitizedServiceIds.length === 0) {\n return [];\n }\n\n const batches: string[][] = [];\n for (let i = 0; i < sanitizedServiceIds.length; i += SERVICE_IDS_BATCH_SIZE) {\n batches.push(sanitizedServiceIds.slice(i, i + SERVICE_IDS_BATCH_SIZE));\n }\n\n const results = await Promise.all(\n batches.map(batch => getServicesByIdsBatch(batch, account)),\n );\n\n return results.flat();\n}\n\nexport async function getServiceByIntegrationKey(\n integrationKey: string,\n account?: string,\n): Promise<PagerDutyService> {\n let response: Response;\n const params = `query=${integrationKey}&time_zone=UTC&include[]=integrations&include[]=escalation_policies`;\n\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get service. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to get service. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServicesResponse;\n try {\n result = (await response.json()) as PagerDutyServicesResponse;\n } catch (error) {\n throw new HttpError(`Failed to parse service information: ${error}`, 500);\n }\n\n if (result.services.length === 0) {\n throw new HttpError(\n `Failed to get service. The requested resource was not found.`,\n 404,\n );\n }\n\n return result.services[0];\n}\n\nexport async function getServicesByIds(\n ids: string[],\n): Promise<PagerDutyService[]> {\n const servicesPerAccount = await Promise.all(\n Object.keys(EndpointConfig).map(account =>\n getSerivcesByIdsAndAccount(ids, account),\n ),\n );\n return servicesPerAccount.flat();\n}\n\nexport async function getAllServices(\n cache?: CacheService,\n): Promise<PagerDutyService[]> {\n // Return the cached service list if we already have one. An empty array is a\n // valid cached result (an account with zero services), so check for presence\n // rather than length — otherwise `[]` would be treated as a miss and trigger\n // a fresh full fetch on every call.\n const cached = await readCache<PagerDutyService[]>(\n cache,\n ALL_SERVICES_CACHE_KEY,\n );\n if (cached !== undefined) {\n return cached;\n }\n\n const allServices: PagerDutyService[] = [];\n\n await Promise.all(\n Object.entries(EndpointConfig).map(async ([account, _]) => {\n let response: Response;\n const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies&include[]=teams&total=true`;\n\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n let offset = 0;\n const limit = 50;\n let result: PagerDutyServicesAPIResponse;\n\n try {\n do {\n const paginatedUrl = `${baseUrl}?${params}&offset=${offset}&limit=${limit}`;\n\n response = await fetchWithRetries(paginatedUrl, options);\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get services. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get services. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get services. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get services. Caller is not authorized to view the requested resource.',\n 403,\n );\n default: // 200\n break;\n }\n\n result = (await response.json()) as PagerDutyServicesAPIResponse;\n\n result.services.forEach(service => {\n service.account = account;\n });\n\n allServices.push(...result.services);\n\n offset += limit;\n } while (offset < result.total!);\n } catch (error) {\n throw error;\n }\n }),\n );\n\n // Cache the full list, and index each service by id so single-service\n // lookups can be served from the cache too.\n await writeCache(cache, ALL_SERVICES_CACHE_KEY, allServices);\n await Promise.all(\n allServices.map(service =>\n writeCache(cache, serviceCacheKey(service.id, service.account), service),\n ),\n );\n\n return allServices;\n}\n\nexport async function getServicesByPartialName(\n partialName: string,\n): Promise<PagerDutyService[]> {\n const allServices: PagerDutyService[] = [];\n\n await Promise.all(\n Object.entries(EndpointConfig).map(async ([account, _]) => {\n let response: Response;\n const params = `query=${encodeURIComponent(partialName)}&time_zone=UTC&include[]=integrations&include[]=escalation_policies&include[]=teams&total=true`;\n\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: token,\n Accept: 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n let offset = 0;\n const limit = 50;\n let result: PagerDutyServicesAPIResponse;\n\n try {\n do {\n const paginatedUrl = `${baseUrl}?${params}&offset=${offset}&limit=${limit}`;\n\n response = await fetchWithRetries(paginatedUrl, options);\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get services. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get services. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get services. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get services. Caller is not authorized to view the requested resource.',\n 403,\n );\n default: // 200\n break;\n }\n\n result = (await response.json()) as PagerDutyServicesAPIResponse;\n\n result.services.forEach(service => {\n service.account = account;\n });\n\n allServices.push(...result.services);\n\n offset += limit;\n } while (offset < result.total!);\n } catch (error) {\n throw error;\n }\n }),\n );\n\n return allServices;\n}\n\nexport async function getFilteredServices(\n teamIds?: string[],\n query?: string,\n maxLimit?: number,\n account?: string,\n): Promise<PagerDutyService[]> {\n const allServices: PagerDutyService[] = [];\n const limit = maxLimit || 100;\n\n const accountsToFetch = account ? [account] : Object.keys(EndpointConfig);\n\n await Promise.all(\n accountsToFetch.map(async (acc) => {\n let response: Response;\n let params = `time_zone=UTC&limit=${limit}`;\n\n if (teamIds && teamIds.length > 0) {\n const teamIdsParam = teamIds\n .map(id => `team_ids[]=${id}`)\n .join('&');\n params += `&${teamIdsParam}`;\n }\n\n if (query && query.trim() !== '') {\n params += `&query=${encodeURIComponent(query.trim())}`;\n }\n\n const token = await getAuthToken(acc);\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: token,\n Accept: 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(acc);\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n // Fetch only ONE page with the specified limit\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get services. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get services. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get services. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get services. Caller is not authorized to view the requested resource.',\n 403,\n );\n default: // 200\n break;\n }\n\n const result = (await response.json()) as PagerDutyServicesAPIResponse;\n\n // set account for each service\n result.services.forEach(service => {\n service.account = acc;\n });\n\n allServices.push(...result.services);\n } catch (error) {\n throw error;\n }\n }),\n );\n\n return allServices;\n}\n\nexport async function getChangeEvents(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyChangeEvent[]> {\n let response: Response;\n const params = `limit=5&time_zone=UTC&sort_by=timestamp`;\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetchWithRetries(\n `${baseUrl}/${encodeURIComponent(serviceId)}/change_events?${params}`,\n options,\n );\n } catch (error) {\n throw new Error(`Failed to retrieve change events for service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get change events for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get change events for service. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get change events for service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get change events for service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to get change events for service. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyChangeEventsResponse;\n try {\n result = (await response.json()) as PagerDutyChangeEventsResponse;\n\n return result.change_events;\n } catch (error) {\n throw new HttpError(\n `Failed to parse change events information: ${error}`,\n 500,\n );\n }\n}\n\nexport async function getIncidents(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyIncident[]> {\n let response: Response;\n const params = `time_zone=UTC&sort_by=created_at&statuses[]=triggered&statuses[]=acknowledged&service_ids[]=${encodeURIComponent(serviceId)}`;\n\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/incidents`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve incidents for service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get incidents for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get incidents for service. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get incidents for service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 402:\n throw new HttpError(\n 'Failed to get incidents for service. Account does not have the abilities to perform the action. Please review the response for the required abilities.',\n 402,\n );\n case 403:\n throw new HttpError(\n 'Failed to get incidents for service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 429:\n throw new HttpError(\n 'Failed to get incidents for service. Too many requests have been made, the rate limit has been reached.',\n 429,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyIncidentsResponse;\n try {\n result = (await response.json()) as PagerDutyIncidentsResponse;\n\n return result.incidents;\n } catch (error) {\n throw new HttpError(`Failed to parse incidents information: ${error}`, 500);\n }\n}\n\nexport async function getServiceStandards(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyServiceStandards> {\n let response: Response;\n\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/standards/scores/technical_services/${encodeURIComponent(serviceId)}`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(\n `Failed to retrieve service standards for service: ${error}`,\n );\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get service standards for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 401:\n throw new HttpError(\n 'Failed to get service standards for service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get service standards for service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 429:\n throw new HttpError(\n 'Failed to get service standards for service. Too many requests have been made, the rate limit has been reached.',\n 429,\n );\n default: // 200\n break;\n }\n\n try {\n const result = await response.json();\n return result;\n } catch (error) {\n throw new HttpError(\n `Failed to parse service standards information: ${error}`,\n 500,\n );\n }\n}\n\nexport async function getServiceMetrics(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyServiceMetrics[]> {\n let response: Response;\n\n const endDate = DateTime.now();\n const startDate = endDate.minus({ days: 30 });\n const body = JSON.stringify({\n filters: {\n created_at_start: startDate.toISO(),\n created_at_end: endDate.toISO(),\n service_ids: [serviceId],\n },\n });\n\n const options: RequestInit = {\n method: 'POST',\n headers: await getDefaultHeaders(account),\n body: body,\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/analytics/metrics/incidents/services`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service metrics for service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get service metrics for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get service metrics for service. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.',\n 400,\n );\n case 429:\n throw new HttpError(\n 'Failed to get service metrics for service. Too many requests have been made, the rate limit has been reached.',\n 429,\n );\n default: // 200\n break;\n }\n\n try {\n const result = await response.json();\n\n return result.data;\n } catch (error) {\n throw new HttpError(\n `Failed to parse service metrics information: ${error}`,\n 500,\n );\n }\n}\n\nexport type CreateServiceIntegrationProps = {\n serviceId: string;\n vendorId: string;\n account?: string;\n cache?: CacheService;\n};\n\nexport async function createServiceIntegration({\n serviceId,\n vendorId,\n account,\n cache,\n}: CreateServiceIntegrationProps): Promise<string> {\n let response: Response;\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n const options: RequestInit = {\n method: 'POST',\n body: JSON.stringify({\n integration: {\n name: 'Backstage',\n service: {\n id: serviceId,\n type: 'service_reference',\n },\n vendor: {\n id: vendorId,\n type: 'vendor_reference',\n },\n },\n }),\n headers: await getDefaultHeaders(account),\n };\n\n try {\n response = await fetchWithRetries(\n `${baseUrl}/${encodeURIComponent(serviceId)}/integrations`,\n options,\n );\n } catch (error) {\n throw new Error(`Failed to create service integration: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new Error(\n `Failed to create service integration. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new Error(\n `Failed to create service integration. Caller provided invalid arguments.`,\n );\n case 401:\n throw new Error(\n `Failed to create service integration. Caller did not supply credentials or did not provide the correct credentials.`,\n );\n case 403:\n throw new Error(\n `Failed to create service integration. Caller is not authorized to view the requested resource.`,\n );\n case 429:\n throw new Error(\n `Failed to create service integration. Rate limit exceeded.`,\n );\n default: // 201\n break;\n }\n\n let result: PagerDutyIntegrationResponse;\n try {\n result = (await response.json()) as PagerDutyIntegrationResponse;\n\n // We just added an integration to this service, so any cached copy now has\n // a stale `integrations` array. Evict the per-id entry and the full list\n // (which embeds the same stale service) so the next read re-fetches and\n // sees the new integration — otherwise a subsequent confirm/bulk mapping\n // would create a duplicate Backstage integration within the cache TTL.\n await deleteCache(cache, serviceCacheKey(serviceId, account));\n await deleteCache(cache, ALL_SERVICES_CACHE_KEY);\n\n return result.integration.integration_key ?? '';\n } catch (error) {\n throw new Error(`Failed to parse service information: ${error}`);\n }\n}\n\nfunction getAllowedApiOrigins(): Set<string> {\n const origins = new Set<string>();\n\n const addOrigin = (apiBaseUrl?: string) => {\n if (!apiBaseUrl) {\n return;\n }\n try {\n origins.add(new URL(apiBaseUrl).origin);\n } catch {\n // ignore malformed configured URLs\n }\n };\n\n Object.values(EndpointConfig).forEach(cfg => addOrigin(cfg.apiBaseUrl));\n addOrigin(fallbackEndpointConfig?.apiBaseUrl);\n\n // Always allow the public PagerDuty API host (default for every config path,\n // and used directly by isEventNoiseReductionEnabled).\n origins.add('https://api.pagerduty.com');\n\n return origins;\n}\n\nexport async function fetchWithRetries(\n url: string,\n options: RequestInit,\n): Promise<Response> {\n // Guard against SSRF: only allow requests to configured PagerDuty API origins.\n // The host is server-controlled, but path segments may be user-provided, so we\n // validate the resolved origin against an allow-list before fetching.\n let requestOrigin: string;\n try {\n requestOrigin = new URL(url).origin;\n } catch {\n throw new Error('Refusing to fetch invalid URL.');\n }\n\n if (!getAllowedApiOrigins().has(requestOrigin)) {\n throw new Error(\n `Refusing to fetch URL with disallowed origin: ${requestOrigin}`,\n );\n }\n\n let response: Response;\n let error: Error = new Error();\n\n // set retry parameters\n const maxRetries = 5;\n const delay = 1000;\n let factor = 2;\n\n for (let i = 0; i < maxRetries; i++) {\n try {\n response = await fetch(url, options);\n return response;\n } catch (e) {\n error = e as Error;\n }\n\n const timeout = delay * factor;\n await new Promise(resolve => setTimeout(resolve, timeout));\n factor *= 2;\n }\n\n throw new Error(\n `Failed to fetch data after ${maxRetries} retries. Last error: ${error}`,\n );\n}\n\nexport type CreateCustomFieldProps = {\n request: PagerDutyCustomFieldCreateRequest;\n account?: string;\n};\n\nexport async function createCustomField({\n request,\n account,\n}: CreateCustomFieldProps): Promise<PagerDutyCustomFieldResponse> {\n let response: Response;\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services/custom_fields`;\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'POST',\n body: JSON.stringify(request),\n headers: {\n Authorization: token,\n Accept: 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to create custom field: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to create custom field. PagerDuty API returned a server error.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400: {\n const errorData = await response.json().catch(() => ({}));\n throw new HttpError(\n `Failed to create custom field. Invalid arguments: ${JSON.stringify(errorData)}`,\n 400,\n );\n }\n case 401:\n throw new HttpError(\n `Failed to create custom field. Invalid credentials provided.`,\n 401,\n );\n case 403:\n throw new HttpError(\n `Failed to create custom field. Not authorized to perform this action.`,\n 403,\n );\n case 409: {\n const errorData = await response.json().catch(() => ({}));\n throw new HttpError(\n `Custom field with this name already exists: ${JSON.stringify(errorData)}`,\n 409,\n );\n }\n case 429:\n throw new HttpError(`Rate limit exceeded.`, 429);\n default: // 201\n break;\n }\n\n try {\n const result = (await response.json()) as PagerDutyCustomFieldResponse;\n return result;\n } catch (error) {\n throw new Error(`Failed to parse custom field response: ${error}`);\n }\n}\n\nexport type UpdateCustomFieldProps = {\n fieldId: string;\n request: PagerDutyCustomFieldUpdateRequest;\n account?: string;\n};\n\nexport async function updateCustomField({\n fieldId,\n request,\n account,\n}: UpdateCustomFieldProps): Promise<PagerDutyCustomFieldResponse> {\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services/custom_fields/${encodeURIComponent(fieldId)}`;\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'PUT',\n body: JSON.stringify(request),\n headers: {\n Authorization: token,\n Accept: 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n let response: Response;\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to update custom field: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to update custom field. PagerDuty API returned a server error.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400: {\n const errorData = await response.json().catch(() => ({}));\n throw new HttpError(\n `Failed to update custom field. Invalid arguments: ${JSON.stringify(errorData)}`,\n 400,\n );\n }\n case 401:\n throw new HttpError(\n `Failed to update custom field. Invalid credentials provided.`,\n 401,\n );\n case 403:\n throw new HttpError(\n `Failed to update custom field. Not authorized to perform this action.`,\n 403,\n );\n case 404:\n throw new HttpError(\n `Failed to update custom field. Custom field not found.`,\n 404,\n );\n case 409: {\n const errorData = await response.json().catch(() => ({}));\n throw new HttpError(\n `Custom field with this name already exists: ${JSON.stringify(errorData)}`,\n 409,\n );\n }\n case 429:\n throw new HttpError(`Rate limit exceeded.`, 429);\n default: // 200\n break;\n }\n\n try {\n const result = (await response.json()) as PagerDutyCustomFieldResponse;\n return result;\n } catch (error) {\n throw new Error(`Failed to parse custom field response: ${error}`);\n }\n}\n\nexport type GetCustomFieldsProps = {\n account?: string;\n};\n\nexport async function getCustomFields({\n account,\n}: GetCustomFieldsProps = {}): Promise<PagerDutyCustomFieldsResponse> {\n let response: Response;\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services/custom_fields`;\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: token,\n Accept: 'application/vnd.pagerduty+json;version=2',\n },\n };\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to get custom fields: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get custom fields. PagerDuty API returned a server error.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 401:\n throw new HttpError(\n `Failed to get custom fields. Invalid credentials provided.`,\n 401,\n );\n case 403:\n throw new HttpError(\n `Failed to get custom fields. Not authorized to perform this action.`,\n 403,\n );\n case 429:\n throw new HttpError(`Rate limit exceeded.`, 429);\n default: // 200\n break;\n }\n\n try {\n const result = (await response.json()) as PagerDutyCustomFieldsResponse;\n return result;\n } catch (error) {\n throw new Error(`Failed to parse custom fields response: ${error}`);\n }\n}\n\nexport type DeleteCustomFieldProps = {\n fieldId: string;\n account?: string;\n};\n\nexport async function deleteCustomField({\n fieldId,\n account,\n}: DeleteCustomFieldProps): Promise<void> {\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services/custom_fields/${encodeURIComponent(fieldId)}`;\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'DELETE',\n headers: {\n Authorization: token,\n Accept: 'application/vnd.pagerduty+json;version=2',\n },\n };\n\n let response: Response;\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to delete custom field: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to delete custom field. PagerDuty API returned a server error.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 401:\n throw new HttpError(\n `Failed to delete custom field. Invalid credentials provided.`,\n 401,\n );\n case 403:\n throw new HttpError(\n `Failed to delete custom field. Caller is not authorized to delete this custom field.`,\n 403,\n );\n case 404:\n throw new HttpError(`Custom field not found.`, 404);\n case 429:\n throw new HttpError(`Rate limit exceeded.`, 429);\n default: // 204\n break;\n }\n}\n\nexport type SetServiceCustomFieldValuesProps = {\n serviceId: string;\n request: PagerDutyServiceCustomFieldValuesRequest;\n account?: string;\n};\n\nexport async function setServiceCustomFieldValues({\n serviceId,\n request,\n account,\n}: SetServiceCustomFieldValuesProps): Promise<PagerDutyServiceCustomFieldValuesResponse> {\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services/${encodeURIComponent(serviceId)}/custom_fields/values`;\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'PUT',\n body: JSON.stringify(request),\n headers: {\n Authorization: token,\n Accept: 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n let response: Response;\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to set service custom field values: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to set service custom field values. PagerDuty API returned a server error.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400: {\n const errorData = await response.json().catch(() => ({}));\n throw new HttpError(\n `Failed to set service custom field values. Invalid arguments: ${JSON.stringify(errorData)}`,\n 400,\n );\n }\n case 401:\n throw new HttpError(\n `Failed to set service custom field values. Invalid credentials provided.`,\n 401,\n );\n case 403:\n throw new HttpError(\n `Failed to set service custom field values. Not authorized to perform this action.`,\n 403,\n );\n case 404:\n throw new HttpError(\n `Failed to set service custom field values. Service or custom field not found.`,\n 404,\n );\n case 429:\n throw new HttpError(`Rate limit exceeded.`, 429);\n default: // 200\n break;\n }\n\n try {\n const result =\n (await response.json()) as PagerDutyServiceCustomFieldValuesResponse;\n return result;\n } catch (error) {\n throw new Error(\n `Failed to parse set service custom field values response: ${error}`,\n );\n }\n}\n"],"names":["getAuthToken","HttpError","DateTime","fetch"],"mappings":"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"}
|
|
@@ -38,7 +38,7 @@ function compareEntities(a, b, column, direction) {
|
|
|
38
38
|
}
|
|
39
39
|
return direction === "ascending" ? comparison : -comparison;
|
|
40
40
|
}
|
|
41
|
-
function getMappingEntities(store, catalogApi) {
|
|
41
|
+
function getMappingEntities(store, catalogApi, logger) {
|
|
42
42
|
return async function getMappingEntitiesFunction(request, response) {
|
|
43
43
|
try {
|
|
44
44
|
const { offset = 0, limit = 10, filters = {}, sort, account } = request.body;
|
|
@@ -110,7 +110,24 @@ function getMappingEntities(store, catalogApi) {
|
|
|
110
110
|
return mapping.entityRef === entityRef || mapping.integrationKey === integrationKey;
|
|
111
111
|
});
|
|
112
112
|
});
|
|
113
|
-
const
|
|
113
|
+
const rawPagerDutyServiceIds = [
|
|
114
|
+
...currentPageMappings.map((mapping) => mapping.serviceId),
|
|
115
|
+
...componentEntities.items.map(
|
|
116
|
+
(entity) => catalogEntity.getPagerDutyServiceId(entity)
|
|
117
|
+
)
|
|
118
|
+
].filter(Boolean);
|
|
119
|
+
const uniqueTrimmedServiceIds = Array.from(
|
|
120
|
+
new Set(rawPagerDutyServiceIds.map((id) => id.trim()))
|
|
121
|
+
);
|
|
122
|
+
const currentPagePagerDutyServiceIds = uniqueTrimmedServiceIds.filter((id) => {
|
|
123
|
+
if (pagerduty.isValidServiceId(id)) {
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
logger?.warn(
|
|
127
|
+
`Ignoring malformed PagerDuty service id "${id}" while building entity mappings`
|
|
128
|
+
);
|
|
129
|
+
return false;
|
|
130
|
+
});
|
|
114
131
|
const currentPagePagerDutyServices = await pagerduty.getServicesByIds(currentPagePagerDutyServiceIds);
|
|
115
132
|
const componentEntitiesDict = await catalogEntity.createComponentEntitiesReferenceDict(componentEntities);
|
|
116
133
|
const maps = await _buildEntityMappingsResponse(
|
|
@@ -141,8 +158,13 @@ function getMappingEntities(store, catalogApi) {
|
|
|
141
158
|
escalationPolicy: "",
|
|
142
159
|
account: ""
|
|
143
160
|
};
|
|
161
|
+
const entityRef = catalogEntity.entityRef(entity).toLowerCase();
|
|
162
|
+
const entityMapping = maps.mappings.find(
|
|
163
|
+
(mapping) => mapping.entityRef === entityRef || mapping.integrationKey && mapping.integrationKey === annotations["pagerduty.com/integration-key"] || mapping.serviceId && mapping.serviceId === annotations["pagerduty.com/service-id"]
|
|
164
|
+
);
|
|
144
165
|
let service = null;
|
|
145
166
|
let isServiceError = null;
|
|
167
|
+
let resolvedFromMapping = false;
|
|
146
168
|
if (annotations["pagerduty.com/service-id"]) {
|
|
147
169
|
const serviceId = annotations["pagerduty.com/service-id"];
|
|
148
170
|
service = currentPagePagerDutyServices.find((s) => s.id === serviceId);
|
|
@@ -157,10 +179,12 @@ function getMappingEntities(store, catalogApi) {
|
|
|
157
179
|
}
|
|
158
180
|
}
|
|
159
181
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
182
|
+
if (!service && !isServiceError && entityMapping?.entityRef === entityRef && entityMapping?.serviceId) {
|
|
183
|
+
service = currentPagePagerDutyServices.find(
|
|
184
|
+
(s) => s.id === entityMapping.serviceId
|
|
185
|
+
);
|
|
186
|
+
resolvedFromMapping = !!service;
|
|
187
|
+
}
|
|
164
188
|
if (service) {
|
|
165
189
|
formattedEntity.serviceName = service.name;
|
|
166
190
|
formattedEntity.serviceUrl = service.html_url;
|
|
@@ -168,7 +192,7 @@ function getMappingEntities(store, catalogApi) {
|
|
|
168
192
|
formattedEntity.escalationPolicy = service.escalation_policy?.name ?? "";
|
|
169
193
|
formattedEntity.account = service.account || "";
|
|
170
194
|
if (entityMapping) {
|
|
171
|
-
const expectedEntityRef = componentEntitiesDict[service.id]?.ref;
|
|
195
|
+
const expectedEntityRef = resolvedFromMapping ? entityMapping.entityRef : componentEntitiesDict[service.id]?.ref;
|
|
172
196
|
if (expectedEntityRef && expectedEntityRef === entityMapping.entityRef) {
|
|
173
197
|
formattedEntity.status = entityMapping.status || "NotMapped";
|
|
174
198
|
} else {
|