@pagerduty/backstage-plugin-backend 0.9.7 → 0.9.8-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config.d.ts +1 -1
- package/dist/apis/pagerduty.cjs.js +72 -72
- package/dist/apis/pagerduty.cjs.js.map +1 -1
- package/dist/auth/auth.cjs.js +3 -3
- package/dist/auth/auth.cjs.js.map +1 -1
- package/dist/db/PagerDutyBackendDatabase.cjs.js.map +1 -1
- package/dist/service/router.cjs.js +20 -20
- package/dist/service/router.cjs.js.map +1 -1
- package/package.json +4 -4
|
@@ -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} from 'common';\n\nimport { DateTime } from 'luxon';\nimport { LoggerService, RootConfigService } 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\nexport function setFallbackEndpointConfig(account: PagerDutyAccountConfig) {\n fallbackEndpointConfig = {\n eventsBaseUrl: account.eventsBaseUrl ?? 'https://events.pagerduty.com/v2',\n apiBaseUrl: account.apiBaseUrl ?? 'https://api.pagerduty.com'\n };\n}\n\nexport function insertEndpointConfig(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\nexport function loadPagerDutyEndpointsFromConfig(config: RootConfigService, logger: LoggerService) {\n\n if (config.getOptional('pagerDuty.accounts')) {\n logger.debug(`New accounts configuration detected. Loading PagerDuty endpoints from config.`);\n isLegacyConfig = false;\n\n const accounts = config.getOptional<PagerDutyAccountConfig[]>('pagerDuty.accounts');\n\n if (accounts?.length === 1) {\n logger.debug(`Single account configuration detected. Loading PagerDuty endpoints from config to 'default'.`);\n EndpointConfig.default = {\n eventsBaseUrl: accounts[0].eventsBaseUrl !== undefined ? accounts[0].eventsBaseUrl : 'https://events.pagerduty.com/v2',\n apiBaseUrl: accounts[0].apiBaseUrl !== undefined ? accounts[0].apiBaseUrl : 'https://api.pagerduty.com'\n };\n }\n else {\n logger.debug(`Multiple account configuration detected. Loading PagerDuty endpoints from config.`);\n accounts?.forEach((account) => {\n\n if (account.isDefault) {\n setFallbackEndpointConfig(account);\n }\n\n insertEndpointConfig(account);\n });\n }\n }\n else {\n logger.debug(`Loading legacy PagerDuty endpoints from config.`);\n isLegacyConfig = true;\n\n EndpointConfig.default = {\n eventsBaseUrl: config.getOptionalString('pagerDuty.eventsBaseUrl') !== undefined ? config.getString('pagerDuty.eventsBaseUrl') : 'https://events.pagerduty.com/v2',\n apiBaseUrl: config.getOptionalString('pagerDuty.apiBaseUrl') !== undefined ? config.getString('pagerDuty.apiBaseUrl') : 'https://api.pagerduty.com'\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\n// Supporting router\nexport async function addServiceRelationsToService(serviceRelations: PagerDutyServiceDependency[], account?: string): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\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(`Failed to add service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to add service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.\", 400);\n case 401:\n throw new HttpError(\"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.\", 401);\n case 403:\n throw new HttpError(\"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.\", 403);\n case 404:\n throw new HttpError(\"Failed to add service dependencies. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n\n } catch (error) {\n throw new HttpError(`Failed to parse service dependency information: ${error}`, 500);\n }\n}\n\nexport async function removeServiceRelationsFromService(serviceRelations: PagerDutyServiceDependency[], account?: string): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\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(`Failed to remove service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to remove service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.\", 400);\n case 401:\n throw new HttpError(\"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.\", 401);\n case 403:\n throw new HttpError(\"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.\", 403);\n case 404:\n throw new HttpError(\"Failed to remove service dependencies. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n\n } catch (error) {\n throw new HttpError(`Failed to parse service dependency information: ${error}`, 500);\n }\n}\n\nexport async function getServiceRelationshipsById(serviceId: string, account?: string): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\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}/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(`Failed to list service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to list service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.\", 400);\n case 401:\n throw new HttpError(\"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.\", 401);\n case 403:\n throw new HttpError(\"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.\", 403);\n case 404:\n throw new HttpError(\"Failed to list service dependencies. The requested resource was not found.\", 404);\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(`Failed to parse service dependency information: ${error}`, 500);\n }\n}\n\n\nasync function getEscalationPolicies(offset: number, limit: number, account?: string): 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: {\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}/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(`Failed to list escalation policies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to list escalation policies. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to list escalation policies. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to list escalation policies. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to list escalation policies. Rate limit exceeded.\", 429);\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\n } catch (error) {\n throw new HttpError(`Failed to parse escalation policy information: ${error}`, 500);\n }\n}\n\nexport async function getAllEscalationPolicies(): Promise<PagerDutyEscalationPolicy[]> {\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 }\n else {\n moreResults = false;\n }\n } while (moreResults === true);\n\n } catch (error) {\n if (error instanceof HttpError) {\n throw error;\n }\n else {\n throw new HttpError(`${error}`, 500);\n }\n }\n\n }));\n\n return results;\n}\n\nexport async function isEventNoiseReductionEnabled(account?: string): Promise<boolean> {\n let response: Response;\n const baseUrl = 'https://api.pagerduty.com';\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 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(`Failed to read abilities. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 401:\n throw new Error(`Failed to read abilities. Caller did not supply credentials or did not provide the correct credentials.`);\n case 403:\n throw new Error(`Failed to read abilities. Caller is not authorized to view the requested resource.`);\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 (result.abilities.includes('preview_intelligent_alert_grouping')\n && result.abilities.includes('time_based_alert_grouping')) {\n return true;\n }\n\n return false;\n\n } catch (error) {\n throw new Error(`Failed to parse abilities information: ${error}`);\n }\n}\n\nexport async function getOncallUsers(escalationPolicy: string, account?: string): 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: {\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}/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(`Failed to list oncalls. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to list oncalls. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to list oncalls. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to list oncalls. Caller is not authorized to view the requested resource.\", 403);\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\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\n } catch (error) {\n throw new HttpError(`Failed to parse oncall information: ${error}`, 500);\n }\n}\n\nexport async function getServiceById(serviceId: string, account?: string): Promise<PagerDutyService> {\n let response: Response;\n const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies`;\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(`${baseUrl}/${serviceId}?${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(`Failed to get service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get service. Caller is not authorized to view the requested resource.\", 403);\n case 404:\n throw new HttpError(\"Failed to get service. The requested resource was not found.\", 404);\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 getServiceByIntegrationKey(integrationKey: string, account?: string): Promise<PagerDutyService> {\n let response: Response;\n const params = `query=${integrationKey}&time_zone=UTC&include[]=integrations&include[]=escalation_policies`;\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(`${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(`Failed to get service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get service. Caller is not authorized to view the requested resource.\", 403);\n case 404:\n throw new HttpError(\"Failed to get service. The requested resource was not found.\", 404);\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(`Failed to get service. The requested resource was not found.`, 404);\n }\n\n return result.services[0];\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 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(`Failed to get services. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get services. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get services. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get services. Caller is not authorized to view the requested resource.\", 403);\n default: // 200\n break;\n }\n\n result = await response.json() as PagerDutyServicesAPIResponse;\n\n // set account\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 getChangeEvents(serviceId: string, account?: string): 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: {\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}/services`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}/${serviceId}/change_events?${params}`, options);\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(`Failed to get change events for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get change events for service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get change events for service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get change events for service. Caller is not authorized to view the requested resource.\", 403);\n case 404:\n throw new HttpError(\"Failed to get change events for service. The requested resource was not found.\", 404);\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(`Failed to parse change events information: ${error}`, 500);\n }\n}\n\nexport async function getIncidents(serviceId: string, account?: string): 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: {\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}/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(`Failed to get incidents for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get incidents for service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get incidents for service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 402:\n throw new HttpError(\"Failed to get incidents for service. Account does not have the abilities to perform the action. Please review the response for the required abilities.\", 402);\n case 403:\n throw new HttpError(\"Failed to get incidents for service. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to get incidents for service. Too many requests have been made, the rate limit has been reached.\", 429);\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(serviceId: string, account?: string): Promise<PagerDutyServiceStandards> {\n let response: Response;\n\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}/standards/scores/technical_services/${serviceId}`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service standards for service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to get service standards for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 401:\n throw new HttpError(\"Failed to get service standards for service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get service standards for service. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to get service standards for service. Too many requests have been made, the rate limit has been reached.\", 429);\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(`Failed to parse service standards information: ${error}`, 500);\n }\n}\n\nexport async function getServiceMetrics(serviceId: string, account?: string): 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: [\n serviceId\n ]\n }\n });\n\n const options: RequestInit = {\n method: 'POST',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\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(`Failed to get service metrics for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"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.\", 400);\n case 429:\n throw new HttpError(\"Failed to get service metrics for service. Too many requests have been made, the rate limit has been reached.\", 429);\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(`Failed to parse service metrics information: ${error}`, 500);\n }\n}\n\nexport type CreateServiceIntegrationProps = {\n serviceId: string;\n vendorId: string;\n account?: string;\n}\n\nexport async function createServiceIntegration({ serviceId, vendorId, account }: CreateServiceIntegrationProps): Promise<string> {\n let response: Response;\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n const token = await getAuthToken(account);\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: {\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}/${serviceId}/integrations`, options);\n } catch (error) {\n throw new Error(`Failed to create service integration: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new Error(`Failed to create service integration. PagerDuty API returned a server error. Retrying with the same arguments will not work.`);\n }\n\n switch (response.status) {\n case 400:\n throw new Error(`Failed to create service integration. Caller provided invalid arguments.`);\n case 401:\n throw new Error(`Failed to create service integration. Caller did not supply credentials or did not provide the correct credentials.`);\n case 403:\n throw new Error(`Failed to create service integration. Caller is not authorized to view the requested resource.`);\n case 429:\n throw new Error(`Failed to create service integration. Rate limit exceeded.`);\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\n } catch (error) {\n throw new Error(`Failed to parse service information: ${error}`);\n }\n}\n\nexport async function fetchWithRetries(url: string, options: RequestInit): 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(`Failed to fetch data after ${maxRetries} retries. Last error: ${error}`);\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} from '@pagerduty/backstage-plugin-common';\n\nimport { DateTime } from 'luxon';\nimport { LoggerService, RootConfigService } 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\nexport function setFallbackEndpointConfig(account: PagerDutyAccountConfig) {\n fallbackEndpointConfig = {\n eventsBaseUrl: account.eventsBaseUrl ?? 'https://events.pagerduty.com/v2',\n apiBaseUrl: account.apiBaseUrl ?? 'https://api.pagerduty.com'\n };\n}\n\nexport function insertEndpointConfig(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\nexport function loadPagerDutyEndpointsFromConfig(config: RootConfigService, logger: LoggerService) {\n\n if (config.getOptional('pagerDuty.accounts')) {\n logger.debug(`New accounts configuration detected. Loading PagerDuty endpoints from config.`);\n isLegacyConfig = false;\n\n const accounts = config.getOptional<PagerDutyAccountConfig[]>('pagerDuty.accounts');\n\n if (accounts?.length === 1) {\n logger.debug(`Single account configuration detected. Loading PagerDuty endpoints from config to 'default'.`);\n EndpointConfig.default = {\n eventsBaseUrl: accounts[0].eventsBaseUrl !== undefined ? accounts[0].eventsBaseUrl : 'https://events.pagerduty.com/v2',\n apiBaseUrl: accounts[0].apiBaseUrl !== undefined ? accounts[0].apiBaseUrl : 'https://api.pagerduty.com'\n };\n }\n else {\n logger.debug(`Multiple account configuration detected. Loading PagerDuty endpoints from config.`);\n accounts?.forEach((account) => {\n\n if (account.isDefault) {\n setFallbackEndpointConfig(account);\n }\n\n insertEndpointConfig(account);\n });\n }\n }\n else {\n logger.debug(`Loading legacy PagerDuty endpoints from config.`);\n isLegacyConfig = true;\n\n EndpointConfig.default = {\n eventsBaseUrl: config.getOptionalString('pagerDuty.eventsBaseUrl') !== undefined ? config.getString('pagerDuty.eventsBaseUrl') : 'https://events.pagerduty.com/v2',\n apiBaseUrl: config.getOptionalString('pagerDuty.apiBaseUrl') !== undefined ? config.getString('pagerDuty.apiBaseUrl') : 'https://api.pagerduty.com'\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\n// Supporting router\nexport async function addServiceRelationsToService(serviceRelations: PagerDutyServiceDependency[], account?: string): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\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(`Failed to add service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to add service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.\", 400);\n case 401:\n throw new HttpError(\"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.\", 401);\n case 403:\n throw new HttpError(\"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.\", 403);\n case 404:\n throw new HttpError(\"Failed to add service dependencies. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n\n } catch (error) {\n throw new HttpError(`Failed to parse service dependency information: ${error}`, 500);\n }\n}\n\nexport async function removeServiceRelationsFromService(serviceRelations: PagerDutyServiceDependency[], account?: string): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\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(`Failed to remove service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to remove service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.\", 400);\n case 401:\n throw new HttpError(\"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.\", 401);\n case 403:\n throw new HttpError(\"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.\", 403);\n case 404:\n throw new HttpError(\"Failed to remove service dependencies. The requested resource was not found.\", 404);\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n\n } catch (error) {\n throw new HttpError(`Failed to parse service dependency information: ${error}`, 500);\n }\n}\n\nexport async function getServiceRelationshipsById(serviceId: string, account?: string): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\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}/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(`Failed to list service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to list service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.\", 400);\n case 401:\n throw new HttpError(\"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.\", 401);\n case 403:\n throw new HttpError(\"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.\", 403);\n case 404:\n throw new HttpError(\"Failed to list service dependencies. The requested resource was not found.\", 404);\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(`Failed to parse service dependency information: ${error}`, 500);\n }\n}\n\n\nasync function getEscalationPolicies(offset: number, limit: number, account?: string): 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: {\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}/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(`Failed to list escalation policies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to list escalation policies. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to list escalation policies. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to list escalation policies. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to list escalation policies. Rate limit exceeded.\", 429);\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\n } catch (error) {\n throw new HttpError(`Failed to parse escalation policy information: ${error}`, 500);\n }\n}\n\nexport async function getAllEscalationPolicies(): Promise<PagerDutyEscalationPolicy[]> {\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 }\n else {\n moreResults = false;\n }\n } while (moreResults === true);\n\n } catch (error) {\n if (error instanceof HttpError) {\n throw error;\n }\n else {\n throw new HttpError(`${error}`, 500);\n }\n }\n\n }));\n\n return results;\n}\n\nexport async function isEventNoiseReductionEnabled(account?: string): Promise<boolean> {\n let response: Response;\n const baseUrl = 'https://api.pagerduty.com';\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 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(`Failed to read abilities. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 401:\n throw new Error(`Failed to read abilities. Caller did not supply credentials or did not provide the correct credentials.`);\n case 403:\n throw new Error(`Failed to read abilities. Caller is not authorized to view the requested resource.`);\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 (result.abilities.includes('preview_intelligent_alert_grouping')\n && result.abilities.includes('time_based_alert_grouping')) {\n return true;\n }\n\n return false;\n\n } catch (error) {\n throw new Error(`Failed to parse abilities information: ${error}`);\n }\n}\n\nexport async function getOncallUsers(escalationPolicy: string, account?: string): 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: {\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}/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(`Failed to list oncalls. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to list oncalls. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to list oncalls. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to list oncalls. Caller is not authorized to view the requested resource.\", 403);\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\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\n } catch (error) {\n throw new HttpError(`Failed to parse oncall information: ${error}`, 500);\n }\n}\n\nexport async function getServiceById(serviceId: string, account?: string): Promise<PagerDutyService> {\n let response: Response;\n const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies`;\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(`${baseUrl}/${serviceId}?${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(`Failed to get service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get service. Caller is not authorized to view the requested resource.\", 403);\n case 404:\n throw new HttpError(\"Failed to get service. The requested resource was not found.\", 404);\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 getServiceByIntegrationKey(integrationKey: string, account?: string): Promise<PagerDutyService> {\n let response: Response;\n const params = `query=${integrationKey}&time_zone=UTC&include[]=integrations&include[]=escalation_policies`;\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(`${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(`Failed to get service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get service. Caller is not authorized to view the requested resource.\", 403);\n case 404:\n throw new HttpError(\"Failed to get service. The requested resource was not found.\", 404);\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(`Failed to get service. The requested resource was not found.`, 404);\n }\n\n return result.services[0];\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 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(`Failed to get services. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get services. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get services. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get services. Caller is not authorized to view the requested resource.\", 403);\n default: // 200\n break;\n }\n\n result = await response.json() as PagerDutyServicesAPIResponse;\n\n // set account\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 getChangeEvents(serviceId: string, account?: string): 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: {\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}/services`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}/${serviceId}/change_events?${params}`, options);\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(`Failed to get change events for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get change events for service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get change events for service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get change events for service. Caller is not authorized to view the requested resource.\", 403);\n case 404:\n throw new HttpError(\"Failed to get change events for service. The requested resource was not found.\", 404);\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(`Failed to parse change events information: ${error}`, 500);\n }\n}\n\nexport async function getIncidents(serviceId: string, account?: string): 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: {\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}/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(`Failed to get incidents for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to get incidents for service. Caller provided invalid arguments.\", 400);\n case 401:\n throw new HttpError(\"Failed to get incidents for service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 402:\n throw new HttpError(\"Failed to get incidents for service. Account does not have the abilities to perform the action. Please review the response for the required abilities.\", 402);\n case 403:\n throw new HttpError(\"Failed to get incidents for service. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to get incidents for service. Too many requests have been made, the rate limit has been reached.\", 429);\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(serviceId: string, account?: string): Promise<PagerDutyServiceStandards> {\n let response: Response;\n\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}/standards/scores/technical_services/${serviceId}`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service standards for service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(`Failed to get service standards for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 401:\n throw new HttpError(\"Failed to get service standards for service. Caller did not supply credentials or did not provide the correct credentials.\", 401);\n case 403:\n throw new HttpError(\"Failed to get service standards for service. Caller is not authorized to view the requested resource.\", 403);\n case 429:\n throw new HttpError(\"Failed to get service standards for service. Too many requests have been made, the rate limit has been reached.\", 429);\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(`Failed to parse service standards information: ${error}`, 500);\n }\n}\n\nexport async function getServiceMetrics(serviceId: string, account?: string): 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: [\n serviceId\n ]\n }\n });\n\n const options: RequestInit = {\n method: 'POST',\n headers: {\n Authorization: await getAuthToken(account),\n 'Accept': 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\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(`Failed to get service metrics for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`, response.status);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"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.\", 400);\n case 429:\n throw new HttpError(\"Failed to get service metrics for service. Too many requests have been made, the rate limit has been reached.\", 429);\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(`Failed to parse service metrics information: ${error}`, 500);\n }\n}\n\nexport type CreateServiceIntegrationProps = {\n serviceId: string;\n vendorId: string;\n account?: string;\n}\n\nexport async function createServiceIntegration({ serviceId, vendorId, account }: CreateServiceIntegrationProps): Promise<string> {\n let response: Response;\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n const token = await getAuthToken(account);\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: {\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}/${serviceId}/integrations`, options);\n } catch (error) {\n throw new Error(`Failed to create service integration: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new Error(`Failed to create service integration. PagerDuty API returned a server error. Retrying with the same arguments will not work.`);\n }\n\n switch (response.status) {\n case 400:\n throw new Error(`Failed to create service integration. Caller provided invalid arguments.`);\n case 401:\n throw new Error(`Failed to create service integration. Caller did not supply credentials or did not provide the correct credentials.`);\n case 403:\n throw new Error(`Failed to create service integration. Caller is not authorized to view the requested resource.`);\n case 429:\n throw new Error(`Failed to create service integration. Rate limit exceeded.`);\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\n } catch (error) {\n throw new Error(`Failed to parse service information: ${error}`);\n }\n}\n\nexport async function fetchWithRetries(url: string, options: RequestInit): 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(`Failed to fetch data after ${maxRetries} retries. Last error: ${error}`);\n}\n"],"names":["getAuthToken","HttpError","DateTime","fetch"],"mappings":"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"}
|
package/dist/auth/auth.cjs.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var backstagePluginCommon = require('@pagerduty/backstage-plugin-common');
|
|
4
4
|
|
|
5
5
|
let authPersistence;
|
|
6
6
|
let isLegacyConfig = false;
|
|
@@ -150,9 +150,9 @@ async function getOAuthToken(clientId, clientSecret, subDomain, region) {
|
|
|
150
150
|
}
|
|
151
151
|
switch (response.status) {
|
|
152
152
|
case 400:
|
|
153
|
-
throw new
|
|
153
|
+
throw new backstagePluginCommon.HttpError("Failed to retrieve valid token. Bad Request - Invalid arguments provided.", 400);
|
|
154
154
|
case 401:
|
|
155
|
-
throw new
|
|
155
|
+
throw new backstagePluginCommon.HttpError("Failed to retrieve valid token. Forbidden - Invalid credentials provided.", 401);
|
|
156
156
|
}
|
|
157
157
|
const authResponse = await response.json();
|
|
158
158
|
const result = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.cjs.js","sources":["../../src/auth/auth.ts"],"sourcesContent":["import { LoggerService, RootConfigService } from \"@backstage/backend-plugin-api\";\nimport { HttpError, PagerDutyAccountConfig } from \"common\";\n\ntype AccountTokenInfo = {\n authToken: string;\n authTokenExpiryDate: number;\n}\n\ntype Auth = {\n config: RootConfigService;\n logger: LoggerService;\n accountTokens: Record<string, AccountTokenInfo>;\n defaultAccount?: string;\n}\n\nlet authPersistence: Auth;\nlet isLegacyConfig = false;\n\nasync function checkForOAuthToken(tokenId: string): Promise<boolean> {\n if (authPersistence.accountTokens[tokenId]?.authToken !== '' &&\n authPersistence.accountTokens[tokenId]?.authToken.includes('Bearer')) {\n if (authPersistence.accountTokens[tokenId].authTokenExpiryDate > Date.now()) {\n return true\n }\n authPersistence.logger.info('OAuth token expired, renewing');\n await loadAuthConfig(authPersistence.config, authPersistence.logger);\n return authPersistence.accountTokens[tokenId].authTokenExpiryDate > Date.now()\n }\n return false\n}\n\nexport async function getAuthToken(accountId? : string): Promise<string> {\n // if authPersistence is not initialized, load the auth config\n if (!authPersistence?.accountTokens) {\n await loadAuthConfig(authPersistence.config, authPersistence.logger);\n }\n\n if (isLegacyConfig && authPersistence.accountTokens.default.authToken !== '' \n && (await checkForOAuthToken('default') || authPersistence.accountTokens.default.authToken.includes('Token'))) {\n return authPersistence.accountTokens.default.authToken;\n }\n const key = accountId && accountId !== '' ? accountId : authPersistence.defaultAccount ?? '';\n\n if (authPersistence.accountTokens[key]?.authToken !== ''\n && (await checkForOAuthToken(key) || authPersistence.accountTokens[key]?.authToken.includes('Token'))) {\n return authPersistence.accountTokens[key].authToken;\n }\n\n return '';\n}\n\nexport async function loadAuthConfig(config : RootConfigService, logger: LoggerService) {\n try {\n const defaultAccountId = 'default';\n\n // initiliaze the authPersistence in-memory object\n authPersistence = {\n config,\n logger,\n accountTokens: {}\n };\n\n // check if new accounts config is present\n if(!config.getOptional('pagerDuty.accounts')){\n isLegacyConfig = true;\n logger.warn('No PagerDuty accounts configuration found in config file. Reverting to legacy configuration.');\n\n if (!config.getOptionalString('pagerDuty.apiToken')) {\n logger.warn('No PagerDuty API token found in config file. Trying OAuth token instead...');\n\n if (!config.getOptional('pagerDuty.oauth')) {\n\n logger.error('No PagerDuty OAuth configuration found in config file.');\n\n } else if (!config.getOptionalString('pagerDuty.oauth.clientId') || !config.getOptionalString('pagerDuty.oauth.clientSecret') || !config.getOptionalString('pagerDuty.oauth.subDomain')) {\n\n logger.error(\"Missing required PagerDuty OAuth parameters in config file. 'clientId', 'clientSecret', and 'subDomain' are required. 'region' is optional.\");\n\n } else {\n const tokenInfo : AccountTokenInfo = await getOAuthToken(\n config.getString('pagerDuty.oauth.clientId'),\n config.getString('pagerDuty.oauth.clientSecret'),\n config.getString('pagerDuty.oauth.subDomain'),\n config.getOptionalString('pagerDuty.oauth.region') ?? 'us');\n\n authPersistence.accountTokens[defaultAccountId] = tokenInfo;\n\n logger.info('PagerDuty OAuth configuration loaded successfully.');\n }\n } else {\n authPersistence.accountTokens[defaultAccountId] = {\n authToken: `Token token=${config.getString('pagerDuty.apiToken')}`,\n authTokenExpiryDate: Date.now() + 3600000 * 24 * 365 * 2 // 2 years\n };\n\n logger.info('PagerDuty API token loaded successfully.');\n }\n } \n else { // new accounts config is present\n logger.info('New PagerDuty accounts configuration found in config file.');\n isLegacyConfig = false;\n const accounts = config.getOptional<PagerDutyAccountConfig[]>('pagerDuty.accounts') || [];\n\n\n if(accounts && accounts?.length === 1){\n logger.info('Only one account found in config file. Setting it as default.');\n authPersistence.defaultAccount = accounts[0].id;\n }\n\n await Promise.all(accounts.map(async account => {\n const maskedAccountId = maskString(account.id);\n\n if(account.isDefault && !authPersistence.defaultAccount){\n logger.info(`Default account found in config file. Setting it as default.`);\n authPersistence.defaultAccount = account.id;\n }\n\n if (!account.apiToken) {\n logger.warn('No PagerDuty API token found in config file. Trying OAuth token instead...');\n\n if (!account.oauth) {\n logger.error('No PagerDuty OAuth configuration found in config file.');\n } else if (!account.oauth.clientId || !account.oauth.clientSecret || !account.oauth.subDomain) {\n logger.error(\"Missing required PagerDuty OAuth parameters in config file. 'clientId', 'clientSecret', and 'subDomain' are required. 'region' is optional.\");\n } else {\n const tokenInfo : AccountTokenInfo = await getOAuthToken(\n account.oauth.clientId,\n account.oauth.clientSecret,\n account.oauth.subDomain,\n account.oauth.region ?? 'us');\n\n authPersistence.accountTokens[account.id] = tokenInfo;\n\n logger.info(`PagerDuty OAuth configuration loaded successfully for account ${maskedAccountId}.`);\n }\n } else {\n authPersistence.accountTokens[account.id] = {\n authToken: `Token token=${account.apiToken}`,\n authTokenExpiryDate: Date.now() + 3600000 * 24 * 365 * 2 // 2 years\n };\n\n logger.info(`PagerDuty API token loaded successfully for account ${maskedAccountId}.`);\n }\n }));\n\n if(!authPersistence.defaultAccount){\n logger.error('No default account found in config file. One account must be marked as default.');\n }\n }\n }\n catch (error) {\n logger.error(`Unable to retrieve valid PagerDuty AUTH configuration from config file: ${error}`);\n }\n}\n\nasync function getOAuthToken(clientId: string, clientSecret: string, subDomain: string, region: string): Promise<AccountTokenInfo> {\n // check if required parameters are provided\n if (!clientId || !clientSecret || !subDomain) {\n throw new Error('Missing required PagerDuty OAuth parameters.');\n }\n\n // define the scopes required for the OAuth token\n const scopes = `\n abilities.read \n analytics.read\n change_events.read \n escalation_policies.read \n incidents.read \n oncalls.read \n schedules.read \n services.read \n services.write \n standards.read\n teams.read \n users.read \n vendors.read\n `;\n\n // encode the parameters for the request\n const urlencoded = new URLSearchParams();\n urlencoded.append(\"grant_type\", \"client_credentials\");\n urlencoded.append(\"client_id\", clientId);\n urlencoded.append(\"client_secret\", clientSecret);\n urlencoded.append(\"scope\", `as_account-${region}.${subDomain} ${scopes}`);\n\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: urlencoded,\n };\n const baseUrl = 'https://identity.pagerduty.com/oauth/token';\n\n try {\n response = await fetch(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve oauth token: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to retrieve valid token. Bad Request - Invalid arguments provided.\", 400);\n case 401:\n throw new HttpError(\"Failed to retrieve valid token. Forbidden - Invalid credentials provided.\", 401);\n default: // 200\n break;\n }\n\n const authResponse = await response.json();\n\n const result : AccountTokenInfo = {\n authToken: `Bearer ${authResponse.access_token}`,\n authTokenExpiryDate: Date.now() + (authResponse.expires_in * 1000)\n };\n\n return result;\n}\n\nfunction maskString(str: string) : string {\n return str[0] + '*'.repeat(str.length - 2) + str.slice(-1);\n}"],"names":["HttpError"],"mappings":";;;;AAeA,IAAI,eAAA;AACJ,IAAI,cAAA,GAAiB,KAAA;AAErB,eAAe,mBAAmB,OAAA,EAAmC;AACjE,EAAA,IAAI,eAAA,CAAgB,aAAA,CAAc,OAAO,CAAA,EAAG,SAAA,KAAc,EAAA,IACtD,eAAA,CAAgB,aAAA,CAAc,OAAO,CAAA,EAAG,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,EAAG;AAClE,IAAA,IAAI,gBAAgB,aAAA,CAAc,OAAO,EAAE,mBAAA,GAAsB,IAAA,CAAK,KAAI,EAAG;AACzE,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,eAAA,CAAgB,MAAA,CAAO,KAAK,+BAA+B,CAAA;AAC3D,IAAA,MAAM,cAAA,CAAe,eAAA,CAAgB,MAAA,EAAQ,eAAA,CAAgB,MAAM,CAAA;AACnE,IAAA,OAAO,gBAAgB,aAAA,CAAc,OAAO,CAAA,CAAE,mBAAA,GAAsB,KAAK,GAAA,EAAI;AAAA,EACjF;AACJ,EAAA,OAAO,KAAA;AACX;AAEA,eAAsB,aAAa,SAAA,EAAsC;AAErE,EAAA,IAAI,CAAC,iBAAiB,aAAA,EAAe;AACjC,IAAA,MAAM,cAAA,CAAe,eAAA,CAAgB,MAAA,EAAQ,eAAA,CAAgB,MAAM,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,kBAAkB,eAAA,CAAgB,aAAA,CAAc,OAAA,CAAQ,SAAA,KAAc,OAClE,MAAM,kBAAA,CAAmB,SAAS,CAAA,IAAK,gBAAgB,aAAA,CAAc,OAAA,CAAQ,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,CAAA,EAAI;AAC3G,IAAA,OAAO,eAAA,CAAgB,cAAc,OAAA,CAAQ,SAAA;AAAA,EACrD;AACA,EAAA,MAAM,MAAM,SAAA,IAAa,SAAA,KAAc,EAAA,GAAK,SAAA,GAAY,gBAAgB,cAAA,IAAkB,EAAA;AAE1F,EAAA,IAAI,gBAAgB,aAAA,CAAc,GAAG,CAAA,EAAG,SAAA,KAAc,OAC9C,MAAM,kBAAA,CAAmB,GAAG,CAAA,IAAK,gBAAgB,aAAA,CAAc,GAAG,GAAG,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,CAAA,EAAI;AACnG,IAAA,OAAO,eAAA,CAAgB,aAAA,CAAc,GAAG,CAAA,CAAE,SAAA;AAAA,EAClD;AAEA,EAAA,OAAO,EAAA;AACX;AAEA,eAAsB,cAAA,CAAe,QAA4B,MAAA,EAAuB;AACpF,EAAA,IAAI;AACA,IAAA,MAAM,gBAAA,GAAmB,SAAA;AAGzB,IAAA,eAAA,GAAkB;AAAA,MACd,MAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAe;AAAC,KACpB;AAGA,IAAA,IAAG,CAAC,MAAA,CAAO,WAAA,CAAY,oBAAoB,CAAA,EAAE;AACzC,MAAA,cAAA,GAAiB,IAAA;AACjB,MAAA,MAAA,CAAO,KAAK,8FAA8F,CAAA;AAE1G,MAAA,IAAI,CAAC,MAAA,CAAO,iBAAA,CAAkB,oBAAoB,CAAA,EAAG;AACjD,QAAA,MAAA,CAAO,KAAK,4EAA4E,CAAA;AAExF,QAAA,IAAI,CAAC,MAAA,CAAO,WAAA,CAAY,iBAAiB,CAAA,EAAG;AAExC,UAAA,MAAA,CAAO,MAAM,wDAAwD,CAAA;AAAA,QAEzE,CAAA,MAAA,IAAW,CAAC,MAAA,CAAO,iBAAA,CAAkB,0BAA0B,CAAA,IAAK,CAAC,MAAA,CAAO,iBAAA,CAAkB,8BAA8B,CAAA,IAAK,CAAC,MAAA,CAAO,iBAAA,CAAkB,2BAA2B,CAAA,EAAG;AAErL,UAAA,MAAA,CAAO,MAAM,6IAA6I,CAAA;AAAA,QAE9J,CAAA,MAAO;AACH,UAAA,MAAM,YAA+B,MAAM,aAAA;AAAA,YACvC,MAAA,CAAO,UAAU,0BAA0B,CAAA;AAAA,YAC3C,MAAA,CAAO,UAAU,8BAA8B,CAAA;AAAA,YAC/C,MAAA,CAAO,UAAU,2BAA2B,CAAA;AAAA,YAC5C,MAAA,CAAO,iBAAA,CAAkB,wBAAwB,CAAA,IAAK;AAAA,WAAI;AAE9D,UAAA,eAAA,CAAgB,aAAA,CAAc,gBAAgB,CAAA,GAAI,SAAA;AAElD,UAAA,MAAA,CAAO,KAAK,oDAAoD,CAAA;AAAA,QACpE;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,eAAA,CAAgB,aAAA,CAAc,gBAAgB,CAAA,GAAI;AAAA,UAC9C,SAAA,EAAW,CAAA,YAAA,EAAe,MAAA,CAAO,SAAA,CAAU,oBAAoB,CAAC,CAAA,CAAA;AAAA,UAChE,qBAAqB,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,GAAU,KAAK,GAAA,GAAM;AAAA;AAAA,SAC3D;AAEA,QAAA,MAAA,CAAO,KAAK,0CAA0C,CAAA;AAAA,MAC1D;AAAA,IACJ,CAAA,MACK;AACD,MAAA,MAAA,CAAO,KAAK,4DAA4D,CAAA;AACxE,MAAA,cAAA,GAAiB,KAAA;AACjB,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,WAAA,CAAsC,oBAAoB,KAAK,EAAC;AAGxF,MAAA,IAAG,QAAA,IAAY,QAAA,EAAU,MAAA,KAAW,CAAA,EAAE;AAClC,QAAA,MAAA,CAAO,KAAK,+DAA+D,CAAA;AAC3E,QAAA,eAAA,CAAgB,cAAA,GAAiB,QAAA,CAAS,CAAC,CAAA,CAAE,EAAA;AAAA,MACjD;AAEA,MAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAM,OAAA,KAAW;AAC5C,QAAA,MAAM,eAAA,GAAkB,UAAA,CAAW,OAAA,CAAQ,EAAE,CAAA;AAE7C,QAAA,IAAG,OAAA,CAAQ,SAAA,IAAa,CAAC,eAAA,CAAgB,cAAA,EAAe;AACpD,UAAA,MAAA,CAAO,KAAK,CAAA,4DAAA,CAA8D,CAAA;AAC1E,UAAA,eAAA,CAAgB,iBAAiB,OAAA,CAAQ,EAAA;AAAA,QAC7C;AAEA,QAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACnB,UAAA,MAAA,CAAO,KAAK,4EAA4E,CAAA;AAExF,UAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAChB,YAAA,MAAA,CAAO,MAAM,wDAAwD,CAAA;AAAA,UACzE,CAAA,MAAA,IAAW,CAAC,OAAA,CAAQ,KAAA,CAAM,QAAA,IAAY,CAAC,OAAA,CAAQ,KAAA,CAAM,YAAA,IAAgB,CAAC,OAAA,CAAQ,KAAA,CAAM,SAAA,EAAW;AAC3F,YAAA,MAAA,CAAO,MAAM,6IAA6I,CAAA;AAAA,UAC9J,CAAA,MAAO;AACH,YAAA,MAAM,YAA+B,MAAM,aAAA;AAAA,cACvC,QAAQ,KAAA,CAAM,QAAA;AAAA,cACd,QAAQ,KAAA,CAAM,YAAA;AAAA,cACd,QAAQ,KAAA,CAAM,SAAA;AAAA,cACd,OAAA,CAAQ,MAAM,MAAA,IAAU;AAAA,aAAI;AAEhC,YAAA,eAAA,CAAgB,aAAA,CAAc,OAAA,CAAQ,EAAE,CAAA,GAAI,SAAA;AAE5C,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,8DAAA,EAAiE,eAAe,CAAA,CAAA,CAAG,CAAA;AAAA,UACnG;AAAA,QACJ,CAAA,MAAO;AACH,UAAA,eAAA,CAAgB,aAAA,CAAc,OAAA,CAAQ,EAAE,CAAA,GAAI;AAAA,YACxC,SAAA,EAAW,CAAA,YAAA,EAAe,OAAA,CAAQ,QAAQ,CAAA,CAAA;AAAA,YAC1C,qBAAqB,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,GAAU,KAAK,GAAA,GAAM;AAAA;AAAA,WAC3D;AAEA,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,oDAAA,EAAuD,eAAe,CAAA,CAAA,CAAG,CAAA;AAAA,QACzF;AAAA,MACJ,CAAC,CAAC,CAAA;AAEF,MAAA,IAAG,CAAC,gBAAgB,cAAA,EAAe;AAC/B,QAAA,MAAA,CAAO,MAAM,iFAAiF,CAAA;AAAA,MAClG;AAAA,IACJ;AAAA,EACJ,SACO,KAAA,EAAO;AACV,IAAA,MAAA,CAAO,KAAA,CAAM,CAAA,wEAAA,EAA2E,KAAK,CAAA,CAAE,CAAA;AAAA,EACnG;AACJ;AAEA,eAAe,aAAA,CAAc,QAAA,EAAkB,YAAA,EAAsB,SAAA,EAAmB,MAAA,EAA2C;AAE/H,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,YAAA,IAAgB,CAAC,SAAA,EAAW;AAC1C,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAClE;AAGA,EAAA,MAAM,MAAA,GAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAiBf,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,UAAA,CAAW,MAAA,CAAO,cAAc,oBAAoB,CAAA;AACpD,EAAA,UAAA,CAAW,MAAA,CAAO,aAAa,QAAQ,CAAA;AACvC,EAAA,UAAA,CAAW,MAAA,CAAO,iBAAiB,YAAY,CAAA;AAC/C,EAAA,UAAA,CAAW,MAAA,CAAO,SAAS,CAAA,WAAA,EAAc,MAAM,IAAI,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAExE,EAAA,IAAI,QAAA;AACJ,EAAA,MAAM,OAAA,GAAuB;AAAA,IACzB,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACL,cAAA,EAAgB;AAAA,KACpB;AAAA,IACA,IAAA,EAAM;AAAA,GACV;AACA,EAAA,MAAM,OAAA,GAAU,4CAAA;AAEhB,EAAA,IAAI;AACA,IAAA,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,EAAS,OAAO,CAAA;AAAA,EAC3C,SAAS,KAAA,EAAO;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,KAAK,CAAA,CAAE,CAAA;AAAA,EAC9D;AAEA,EAAA,QAAQ,SAAS,MAAA;AAAQ,IACrB,KAAK,GAAA;AACD,MAAA,MAAM,IAAIA,gBAAA,CAAU,2EAAA,EAA6E,GAAG,CAAA;AAAA,IACxG,KAAK,GAAA;AACD,MAAA,MAAM,IAAIA,gBAAA,CAAU,2EAAA,EAA6E,GAAG,CAAA;AAEpG;AAGR,EAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,EAAK;AAEzC,EAAA,MAAM,MAAA,GAA4B;AAAA,IAC9B,SAAA,EAAW,CAAA,OAAA,EAAU,YAAA,CAAa,YAAY,CAAA,CAAA;AAAA,IAC9C,mBAAA,EAAqB,IAAA,CAAK,GAAA,EAAI,GAAK,aAAa,UAAA,GAAa;AAAA,GACjE;AAEA,EAAA,OAAO,MAAA;AACX;AAEA,SAAS,WAAW,GAAA,EAAsB;AACtC,EAAA,OAAO,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AAC7D;;;;;"}
|
|
1
|
+
{"version":3,"file":"auth.cjs.js","sources":["../../src/auth/auth.ts"],"sourcesContent":["import { LoggerService, RootConfigService } from \"@backstage/backend-plugin-api\";\nimport { HttpError, PagerDutyAccountConfig } from \"@pagerduty/backstage-plugin-common\";\n\ntype AccountTokenInfo = {\n authToken: string;\n authTokenExpiryDate: number;\n}\n\ntype Auth = {\n config: RootConfigService;\n logger: LoggerService;\n accountTokens: Record<string, AccountTokenInfo>;\n defaultAccount?: string;\n}\n\nlet authPersistence: Auth;\nlet isLegacyConfig = false;\n\nasync function checkForOAuthToken(tokenId: string): Promise<boolean> {\n if (authPersistence.accountTokens[tokenId]?.authToken !== '' &&\n authPersistence.accountTokens[tokenId]?.authToken.includes('Bearer')) {\n if (authPersistence.accountTokens[tokenId].authTokenExpiryDate > Date.now()) {\n return true\n }\n authPersistence.logger.info('OAuth token expired, renewing');\n await loadAuthConfig(authPersistence.config, authPersistence.logger);\n return authPersistence.accountTokens[tokenId].authTokenExpiryDate > Date.now()\n }\n return false\n}\n\nexport async function getAuthToken(accountId? : string): Promise<string> {\n // if authPersistence is not initialized, load the auth config\n if (!authPersistence?.accountTokens) {\n await loadAuthConfig(authPersistence.config, authPersistence.logger);\n }\n\n if (isLegacyConfig && authPersistence.accountTokens.default.authToken !== '' \n && (await checkForOAuthToken('default') || authPersistence.accountTokens.default.authToken.includes('Token'))) {\n return authPersistence.accountTokens.default.authToken;\n }\n const key = accountId && accountId !== '' ? accountId : authPersistence.defaultAccount ?? '';\n\n if (authPersistence.accountTokens[key]?.authToken !== ''\n && (await checkForOAuthToken(key) || authPersistence.accountTokens[key]?.authToken.includes('Token'))) {\n return authPersistence.accountTokens[key].authToken;\n }\n\n return '';\n}\n\nexport async function loadAuthConfig(config : RootConfigService, logger: LoggerService) {\n try {\n const defaultAccountId = 'default';\n\n // initiliaze the authPersistence in-memory object\n authPersistence = {\n config,\n logger,\n accountTokens: {}\n };\n\n // check if new accounts config is present\n if(!config.getOptional('pagerDuty.accounts')){\n isLegacyConfig = true;\n logger.warn('No PagerDuty accounts configuration found in config file. Reverting to legacy configuration.');\n\n if (!config.getOptionalString('pagerDuty.apiToken')) {\n logger.warn('No PagerDuty API token found in config file. Trying OAuth token instead...');\n\n if (!config.getOptional('pagerDuty.oauth')) {\n\n logger.error('No PagerDuty OAuth configuration found in config file.');\n\n } else if (!config.getOptionalString('pagerDuty.oauth.clientId') || !config.getOptionalString('pagerDuty.oauth.clientSecret') || !config.getOptionalString('pagerDuty.oauth.subDomain')) {\n\n logger.error(\"Missing required PagerDuty OAuth parameters in config file. 'clientId', 'clientSecret', and 'subDomain' are required. 'region' is optional.\");\n\n } else {\n const tokenInfo : AccountTokenInfo = await getOAuthToken(\n config.getString('pagerDuty.oauth.clientId'),\n config.getString('pagerDuty.oauth.clientSecret'),\n config.getString('pagerDuty.oauth.subDomain'),\n config.getOptionalString('pagerDuty.oauth.region') ?? 'us');\n\n authPersistence.accountTokens[defaultAccountId] = tokenInfo;\n\n logger.info('PagerDuty OAuth configuration loaded successfully.');\n }\n } else {\n authPersistence.accountTokens[defaultAccountId] = {\n authToken: `Token token=${config.getString('pagerDuty.apiToken')}`,\n authTokenExpiryDate: Date.now() + 3600000 * 24 * 365 * 2 // 2 years\n };\n\n logger.info('PagerDuty API token loaded successfully.');\n }\n } \n else { // new accounts config is present\n logger.info('New PagerDuty accounts configuration found in config file.');\n isLegacyConfig = false;\n const accounts = config.getOptional<PagerDutyAccountConfig[]>('pagerDuty.accounts') || [];\n\n\n if(accounts && accounts?.length === 1){\n logger.info('Only one account found in config file. Setting it as default.');\n authPersistence.defaultAccount = accounts[0].id;\n }\n\n await Promise.all(accounts.map(async account => {\n const maskedAccountId = maskString(account.id);\n\n if(account.isDefault && !authPersistence.defaultAccount){\n logger.info(`Default account found in config file. Setting it as default.`);\n authPersistence.defaultAccount = account.id;\n }\n\n if (!account.apiToken) {\n logger.warn('No PagerDuty API token found in config file. Trying OAuth token instead...');\n\n if (!account.oauth) {\n logger.error('No PagerDuty OAuth configuration found in config file.');\n } else if (!account.oauth.clientId || !account.oauth.clientSecret || !account.oauth.subDomain) {\n logger.error(\"Missing required PagerDuty OAuth parameters in config file. 'clientId', 'clientSecret', and 'subDomain' are required. 'region' is optional.\");\n } else {\n const tokenInfo : AccountTokenInfo = await getOAuthToken(\n account.oauth.clientId,\n account.oauth.clientSecret,\n account.oauth.subDomain,\n account.oauth.region ?? 'us');\n\n authPersistence.accountTokens[account.id] = tokenInfo;\n\n logger.info(`PagerDuty OAuth configuration loaded successfully for account ${maskedAccountId}.`);\n }\n } else {\n authPersistence.accountTokens[account.id] = {\n authToken: `Token token=${account.apiToken}`,\n authTokenExpiryDate: Date.now() + 3600000 * 24 * 365 * 2 // 2 years\n };\n\n logger.info(`PagerDuty API token loaded successfully for account ${maskedAccountId}.`);\n }\n }));\n\n if(!authPersistence.defaultAccount){\n logger.error('No default account found in config file. One account must be marked as default.');\n }\n }\n }\n catch (error) {\n logger.error(`Unable to retrieve valid PagerDuty AUTH configuration from config file: ${error}`);\n }\n}\n\nasync function getOAuthToken(clientId: string, clientSecret: string, subDomain: string, region: string): Promise<AccountTokenInfo> {\n // check if required parameters are provided\n if (!clientId || !clientSecret || !subDomain) {\n throw new Error('Missing required PagerDuty OAuth parameters.');\n }\n\n // define the scopes required for the OAuth token\n const scopes = `\n abilities.read \n analytics.read\n change_events.read \n escalation_policies.read \n incidents.read \n oncalls.read \n schedules.read \n services.read \n services.write \n standards.read\n teams.read \n users.read \n vendors.read\n `;\n\n // encode the parameters for the request\n const urlencoded = new URLSearchParams();\n urlencoded.append(\"grant_type\", \"client_credentials\");\n urlencoded.append(\"client_id\", clientId);\n urlencoded.append(\"client_secret\", clientSecret);\n urlencoded.append(\"scope\", `as_account-${region}.${subDomain} ${scopes}`);\n\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: urlencoded,\n };\n const baseUrl = 'https://identity.pagerduty.com/oauth/token';\n\n try {\n response = await fetch(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve oauth token: ${error}`);\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\"Failed to retrieve valid token. Bad Request - Invalid arguments provided.\", 400);\n case 401:\n throw new HttpError(\"Failed to retrieve valid token. Forbidden - Invalid credentials provided.\", 401);\n default: // 200\n break;\n }\n\n const authResponse = await response.json();\n\n const result : AccountTokenInfo = {\n authToken: `Bearer ${authResponse.access_token}`,\n authTokenExpiryDate: Date.now() + (authResponse.expires_in * 1000)\n };\n\n return result;\n}\n\nfunction maskString(str: string) : string {\n return str[0] + '*'.repeat(str.length - 2) + str.slice(-1);\n}"],"names":["HttpError"],"mappings":";;;;AAeA,IAAI,eAAA;AACJ,IAAI,cAAA,GAAiB,KAAA;AAErB,eAAe,mBAAmB,OAAA,EAAmC;AACjE,EAAA,IAAI,eAAA,CAAgB,aAAA,CAAc,OAAO,CAAA,EAAG,SAAA,KAAc,EAAA,IACtD,eAAA,CAAgB,aAAA,CAAc,OAAO,CAAA,EAAG,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,EAAG;AAClE,IAAA,IAAI,gBAAgB,aAAA,CAAc,OAAO,EAAE,mBAAA,GAAsB,IAAA,CAAK,KAAI,EAAG;AACzE,MAAA,OAAO,IAAA;AAAA,IACX;AACA,IAAA,eAAA,CAAgB,MAAA,CAAO,KAAK,+BAA+B,CAAA;AAC3D,IAAA,MAAM,cAAA,CAAe,eAAA,CAAgB,MAAA,EAAQ,eAAA,CAAgB,MAAM,CAAA;AACnE,IAAA,OAAO,gBAAgB,aAAA,CAAc,OAAO,CAAA,CAAE,mBAAA,GAAsB,KAAK,GAAA,EAAI;AAAA,EACjF;AACJ,EAAA,OAAO,KAAA;AACX;AAEA,eAAsB,aAAa,SAAA,EAAsC;AAErE,EAAA,IAAI,CAAC,iBAAiB,aAAA,EAAe;AACjC,IAAA,MAAM,cAAA,CAAe,eAAA,CAAgB,MAAA,EAAQ,eAAA,CAAgB,MAAM,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,kBAAkB,eAAA,CAAgB,aAAA,CAAc,OAAA,CAAQ,SAAA,KAAc,OAClE,MAAM,kBAAA,CAAmB,SAAS,CAAA,IAAK,gBAAgB,aAAA,CAAc,OAAA,CAAQ,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,CAAA,EAAI;AAC3G,IAAA,OAAO,eAAA,CAAgB,cAAc,OAAA,CAAQ,SAAA;AAAA,EACrD;AACA,EAAA,MAAM,MAAM,SAAA,IAAa,SAAA,KAAc,EAAA,GAAK,SAAA,GAAY,gBAAgB,cAAA,IAAkB,EAAA;AAE1F,EAAA,IAAI,gBAAgB,aAAA,CAAc,GAAG,CAAA,EAAG,SAAA,KAAc,OAC9C,MAAM,kBAAA,CAAmB,GAAG,CAAA,IAAK,gBAAgB,aAAA,CAAc,GAAG,GAAG,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,CAAA,EAAI;AACnG,IAAA,OAAO,eAAA,CAAgB,aAAA,CAAc,GAAG,CAAA,CAAE,SAAA;AAAA,EAClD;AAEA,EAAA,OAAO,EAAA;AACX;AAEA,eAAsB,cAAA,CAAe,QAA4B,MAAA,EAAuB;AACpF,EAAA,IAAI;AACA,IAAA,MAAM,gBAAA,GAAmB,SAAA;AAGzB,IAAA,eAAA,GAAkB;AAAA,MACd,MAAA;AAAA,MACA,MAAA;AAAA,MACA,eAAe;AAAC,KACpB;AAGA,IAAA,IAAG,CAAC,MAAA,CAAO,WAAA,CAAY,oBAAoB,CAAA,EAAE;AACzC,MAAA,cAAA,GAAiB,IAAA;AACjB,MAAA,MAAA,CAAO,KAAK,8FAA8F,CAAA;AAE1G,MAAA,IAAI,CAAC,MAAA,CAAO,iBAAA,CAAkB,oBAAoB,CAAA,EAAG;AACjD,QAAA,MAAA,CAAO,KAAK,4EAA4E,CAAA;AAExF,QAAA,IAAI,CAAC,MAAA,CAAO,WAAA,CAAY,iBAAiB,CAAA,EAAG;AAExC,UAAA,MAAA,CAAO,MAAM,wDAAwD,CAAA;AAAA,QAEzE,CAAA,MAAA,IAAW,CAAC,MAAA,CAAO,iBAAA,CAAkB,0BAA0B,CAAA,IAAK,CAAC,MAAA,CAAO,iBAAA,CAAkB,8BAA8B,CAAA,IAAK,CAAC,MAAA,CAAO,iBAAA,CAAkB,2BAA2B,CAAA,EAAG;AAErL,UAAA,MAAA,CAAO,MAAM,6IAA6I,CAAA;AAAA,QAE9J,CAAA,MAAO;AACH,UAAA,MAAM,YAA+B,MAAM,aAAA;AAAA,YACvC,MAAA,CAAO,UAAU,0BAA0B,CAAA;AAAA,YAC3C,MAAA,CAAO,UAAU,8BAA8B,CAAA;AAAA,YAC/C,MAAA,CAAO,UAAU,2BAA2B,CAAA;AAAA,YAC5C,MAAA,CAAO,iBAAA,CAAkB,wBAAwB,CAAA,IAAK;AAAA,WAAI;AAE9D,UAAA,eAAA,CAAgB,aAAA,CAAc,gBAAgB,CAAA,GAAI,SAAA;AAElD,UAAA,MAAA,CAAO,KAAK,oDAAoD,CAAA;AAAA,QACpE;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,eAAA,CAAgB,aAAA,CAAc,gBAAgB,CAAA,GAAI;AAAA,UAC9C,SAAA,EAAW,CAAA,YAAA,EAAe,MAAA,CAAO,SAAA,CAAU,oBAAoB,CAAC,CAAA,CAAA;AAAA,UAChE,qBAAqB,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,GAAU,KAAK,GAAA,GAAM;AAAA;AAAA,SAC3D;AAEA,QAAA,MAAA,CAAO,KAAK,0CAA0C,CAAA;AAAA,MAC1D;AAAA,IACJ,CAAA,MACK;AACD,MAAA,MAAA,CAAO,KAAK,4DAA4D,CAAA;AACxE,MAAA,cAAA,GAAiB,KAAA;AACjB,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,WAAA,CAAsC,oBAAoB,KAAK,EAAC;AAGxF,MAAA,IAAG,QAAA,IAAY,QAAA,EAAU,MAAA,KAAW,CAAA,EAAE;AAClC,QAAA,MAAA,CAAO,KAAK,+DAA+D,CAAA;AAC3E,QAAA,eAAA,CAAgB,cAAA,GAAiB,QAAA,CAAS,CAAC,CAAA,CAAE,EAAA;AAAA,MACjD;AAEA,MAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,OAAM,OAAA,KAAW;AAC5C,QAAA,MAAM,eAAA,GAAkB,UAAA,CAAW,OAAA,CAAQ,EAAE,CAAA;AAE7C,QAAA,IAAG,OAAA,CAAQ,SAAA,IAAa,CAAC,eAAA,CAAgB,cAAA,EAAe;AACpD,UAAA,MAAA,CAAO,KAAK,CAAA,4DAAA,CAA8D,CAAA;AAC1E,UAAA,eAAA,CAAgB,iBAAiB,OAAA,CAAQ,EAAA;AAAA,QAC7C;AAEA,QAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACnB,UAAA,MAAA,CAAO,KAAK,4EAA4E,CAAA;AAExF,UAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAChB,YAAA,MAAA,CAAO,MAAM,wDAAwD,CAAA;AAAA,UACzE,CAAA,MAAA,IAAW,CAAC,OAAA,CAAQ,KAAA,CAAM,QAAA,IAAY,CAAC,OAAA,CAAQ,KAAA,CAAM,YAAA,IAAgB,CAAC,OAAA,CAAQ,KAAA,CAAM,SAAA,EAAW;AAC3F,YAAA,MAAA,CAAO,MAAM,6IAA6I,CAAA;AAAA,UAC9J,CAAA,MAAO;AACH,YAAA,MAAM,YAA+B,MAAM,aAAA;AAAA,cACvC,QAAQ,KAAA,CAAM,QAAA;AAAA,cACd,QAAQ,KAAA,CAAM,YAAA;AAAA,cACd,QAAQ,KAAA,CAAM,SAAA;AAAA,cACd,OAAA,CAAQ,MAAM,MAAA,IAAU;AAAA,aAAI;AAEhC,YAAA,eAAA,CAAgB,aAAA,CAAc,OAAA,CAAQ,EAAE,CAAA,GAAI,SAAA;AAE5C,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,8DAAA,EAAiE,eAAe,CAAA,CAAA,CAAG,CAAA;AAAA,UACnG;AAAA,QACJ,CAAA,MAAO;AACH,UAAA,eAAA,CAAgB,aAAA,CAAc,OAAA,CAAQ,EAAE,CAAA,GAAI;AAAA,YACxC,SAAA,EAAW,CAAA,YAAA,EAAe,OAAA,CAAQ,QAAQ,CAAA,CAAA;AAAA,YAC1C,qBAAqB,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,GAAU,KAAK,GAAA,GAAM;AAAA;AAAA,WAC3D;AAEA,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,oDAAA,EAAuD,eAAe,CAAA,CAAA,CAAG,CAAA;AAAA,QACzF;AAAA,MACJ,CAAC,CAAC,CAAA;AAEF,MAAA,IAAG,CAAC,gBAAgB,cAAA,EAAe;AAC/B,QAAA,MAAA,CAAO,MAAM,iFAAiF,CAAA;AAAA,MAClG;AAAA,IACJ;AAAA,EACJ,SACO,KAAA,EAAO;AACV,IAAA,MAAA,CAAO,KAAA,CAAM,CAAA,wEAAA,EAA2E,KAAK,CAAA,CAAE,CAAA;AAAA,EACnG;AACJ;AAEA,eAAe,aAAA,CAAc,QAAA,EAAkB,YAAA,EAAsB,SAAA,EAAmB,MAAA,EAA2C;AAE/H,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,YAAA,IAAgB,CAAC,SAAA,EAAW;AAC1C,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAClE;AAGA,EAAA,MAAM,MAAA,GAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAiBf,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,EAAA,UAAA,CAAW,MAAA,CAAO,cAAc,oBAAoB,CAAA;AACpD,EAAA,UAAA,CAAW,MAAA,CAAO,aAAa,QAAQ,CAAA;AACvC,EAAA,UAAA,CAAW,MAAA,CAAO,iBAAiB,YAAY,CAAA;AAC/C,EAAA,UAAA,CAAW,MAAA,CAAO,SAAS,CAAA,WAAA,EAAc,MAAM,IAAI,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAExE,EAAA,IAAI,QAAA;AACJ,EAAA,MAAM,OAAA,GAAuB;AAAA,IACzB,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACL,cAAA,EAAgB;AAAA,KACpB;AAAA,IACA,IAAA,EAAM;AAAA,GACV;AACA,EAAA,MAAM,OAAA,GAAU,4CAAA;AAEhB,EAAA,IAAI;AACA,IAAA,QAAA,GAAW,MAAM,KAAA,CAAM,OAAA,EAAS,OAAO,CAAA;AAAA,EAC3C,SAAS,KAAA,EAAO;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,KAAK,CAAA,CAAE,CAAA;AAAA,EAC9D;AAEA,EAAA,QAAQ,SAAS,MAAA;AAAQ,IACrB,KAAK,GAAA;AACD,MAAA,MAAM,IAAIA,+BAAA,CAAU,2EAAA,EAA6E,GAAG,CAAA;AAAA,IACxG,KAAK,GAAA;AACD,MAAA,MAAM,IAAIA,+BAAA,CAAU,2EAAA,EAA6E,GAAG,CAAA;AAEpG;AAGR,EAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,EAAK;AAEzC,EAAA,MAAM,MAAA,GAA4B;AAAA,IAC9B,SAAA,EAAW,CAAA,OAAA,EAAU,YAAA,CAAa,YAAY,CAAA,CAAA;AAAA,IAC9C,mBAAA,EAAqB,IAAA,CAAK,GAAA,EAAI,GAAK,aAAa,UAAA,GAAa;AAAA,GACjE;AAEA,EAAA,OAAO,MAAA;AACX;AAEA,SAAS,WAAW,GAAA,EAAsB;AACtC,EAAA,OAAO,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AAC7D;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PagerDutyBackendDatabase.cjs.js","sources":["../../src/db/PagerDutyBackendDatabase.ts"],"sourcesContent":["import { PagerDutyEntityMapping, PagerDutySetting } from \"common\";\nimport { resolvePackagePath } from \"@backstage/backend-plugin-api\";\nimport { Knex } from 'knex';\nimport { v4 as uuid } from 'uuid';\n\nexport type RawDbEntityResultRow = {\n id: string;\n entityRef: string;\n serviceId: string;\n integrationKey: string;\n account?: string;\n processedDate?: Date;\n};\n\n/** @public */\nexport interface PagerDutyBackendStore {\n insertEntityMapping(entity: PagerDutyEntityMapping): Promise <string> \n getAllEntityMappings(): Promise<RawDbEntityResultRow[]>\n findEntityMappingByEntityRef(entityRef: string): Promise<RawDbEntityResultRow | undefined>\n findEntityMappingByServiceId(serviceId: string): Promise<RawDbEntityResultRow | undefined>\n updateSetting(setting: PagerDutySetting): Promise<string>\n findSetting(settingId: string): Promise<PagerDutySetting | undefined>\n getAllSettings(): Promise<PagerDutySetting[]>\n}\n\ntype Options = {\n skipMigrations?: boolean;\n};\n\n/** @public */\nexport class PagerDutyBackendDatabase implements PagerDutyBackendStore {\n static async create(knex: Knex, options?: Options): Promise<PagerDutyBackendStore> {\n if (!options?.skipMigrations) {\n const migrationsDir = resolvePackagePath(\"@pagerduty/backstage-plugin-backend\", \"migrations\");\n \n await knex.migrate.latest({\n directory: migrationsDir,\n extension: 'js',\n });\n }\n\n return new PagerDutyBackendDatabase(knex);\n }\n\n constructor(private readonly db: Knex) { }\n\n async insertEntityMapping(entity: PagerDutyEntityMapping): Promise<string> {\n const entityMappingId = uuid();\n\n const [result] = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping')\n .insert({\n id: entityMappingId,\n entityRef: entity.entityRef,\n serviceId: entity.serviceId,\n integrationKey: entity.integrationKey,\n account: entity.account,\n processedDate: new Date(),\n })\n .onConflict(['serviceId'])\n .merge(['entityRef', 'integrationKey', 'account', 'processedDate']) \n .returning('id');\n\n return result.id;\n }\n\n async getAllEntityMappings(): Promise<RawDbEntityResultRow[]> {\n const rawEntities = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping');\n\n if (!rawEntities) {\n return [];\n }\n\n return rawEntities;\n }\n\n async findEntityMappingByEntityRef(entityRef: string): Promise<RawDbEntityResultRow | undefined> {\n const rawEntity = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping')\n .where('entityRef', entityRef)\n .first();\n\n return rawEntity;\n }\n\n async findEntityMappingByServiceId(serviceId: string): Promise<RawDbEntityResultRow | undefined> {\n const rawEntity = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping')\n .where('serviceId', serviceId)\n .first();\n\n return rawEntity;\n }\n\n async updateSetting(setting: PagerDutySetting): Promise<string> {\n const [result] = await this.db<PagerDutySetting>('pagerduty_settings')\n .insert({\n id: setting.id,\n value: setting.value \n })\n .onConflict(['id'])\n .merge(['value'])\n .returning('id');\n\n return result.id;\n }\n\n async findSetting(settingId: string): Promise<PagerDutySetting | undefined> {\n const rawEntity = await this.db<PagerDutySetting>('pagerduty_settings')\n .where('id', settingId)\n .first();\n\n return rawEntity;\n }\n\n async getAllSettings(): Promise<PagerDutySetting[]> {\n const rawEntities = await this.db<PagerDutySetting>('pagerduty_settings');\n\n if (!rawEntities) {\n return [];\n }\n\n return rawEntities;\n }\n}"],"names":["resolvePackagePath","uuid"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PagerDutyBackendDatabase.cjs.js","sources":["../../src/db/PagerDutyBackendDatabase.ts"],"sourcesContent":["import { PagerDutyEntityMapping, PagerDutySetting } from \"@pagerduty/backstage-plugin-common\";\nimport { resolvePackagePath } from \"@backstage/backend-plugin-api\";\nimport { Knex } from 'knex';\nimport { v4 as uuid } from 'uuid';\n\nexport type RawDbEntityResultRow = {\n id: string;\n entityRef: string;\n serviceId: string;\n integrationKey: string;\n account?: string;\n processedDate?: Date;\n};\n\n/** @public */\nexport interface PagerDutyBackendStore {\n insertEntityMapping(entity: PagerDutyEntityMapping): Promise <string> \n getAllEntityMappings(): Promise<RawDbEntityResultRow[]>\n findEntityMappingByEntityRef(entityRef: string): Promise<RawDbEntityResultRow | undefined>\n findEntityMappingByServiceId(serviceId: string): Promise<RawDbEntityResultRow | undefined>\n updateSetting(setting: PagerDutySetting): Promise<string>\n findSetting(settingId: string): Promise<PagerDutySetting | undefined>\n getAllSettings(): Promise<PagerDutySetting[]>\n}\n\ntype Options = {\n skipMigrations?: boolean;\n};\n\n/** @public */\nexport class PagerDutyBackendDatabase implements PagerDutyBackendStore {\n static async create(knex: Knex, options?: Options): Promise<PagerDutyBackendStore> {\n if (!options?.skipMigrations) {\n const migrationsDir = resolvePackagePath(\"@pagerduty/backstage-plugin-backend\", \"migrations\");\n \n await knex.migrate.latest({\n directory: migrationsDir,\n extension: 'js',\n });\n }\n\n return new PagerDutyBackendDatabase(knex);\n }\n\n constructor(private readonly db: Knex) { }\n\n async insertEntityMapping(entity: PagerDutyEntityMapping): Promise<string> {\n const entityMappingId = uuid();\n\n const [result] = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping')\n .insert({\n id: entityMappingId,\n entityRef: entity.entityRef,\n serviceId: entity.serviceId,\n integrationKey: entity.integrationKey,\n account: entity.account,\n processedDate: new Date(),\n })\n .onConflict(['serviceId'])\n .merge(['entityRef', 'integrationKey', 'account', 'processedDate']) \n .returning('id');\n\n return result.id;\n }\n\n async getAllEntityMappings(): Promise<RawDbEntityResultRow[]> {\n const rawEntities = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping');\n\n if (!rawEntities) {\n return [];\n }\n\n return rawEntities;\n }\n\n async findEntityMappingByEntityRef(entityRef: string): Promise<RawDbEntityResultRow | undefined> {\n const rawEntity = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping')\n .where('entityRef', entityRef)\n .first();\n\n return rawEntity;\n }\n\n async findEntityMappingByServiceId(serviceId: string): Promise<RawDbEntityResultRow | undefined> {\n const rawEntity = await this.db<RawDbEntityResultRow>('pagerduty_entity_mapping')\n .where('serviceId', serviceId)\n .first();\n\n return rawEntity;\n }\n\n async updateSetting(setting: PagerDutySetting): Promise<string> {\n const [result] = await this.db<PagerDutySetting>('pagerduty_settings')\n .insert({\n id: setting.id,\n value: setting.value \n })\n .onConflict(['id'])\n .merge(['value'])\n .returning('id');\n\n return result.id;\n }\n\n async findSetting(settingId: string): Promise<PagerDutySetting | undefined> {\n const rawEntity = await this.db<PagerDutySetting>('pagerduty_settings')\n .where('id', settingId)\n .first();\n\n return rawEntity;\n }\n\n async getAllSettings(): Promise<PagerDutySetting[]> {\n const rawEntities = await this.db<PagerDutySetting>('pagerduty_settings');\n\n if (!rawEntities) {\n return [];\n }\n\n return rawEntities;\n }\n}"],"names":["resolvePackagePath","uuid"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var backendCommon = require('@backstage/backend-common');
|
|
4
4
|
var pagerduty = require('../apis/pagerduty.cjs.js');
|
|
5
|
-
var
|
|
5
|
+
var backstagePluginCommon = require('@pagerduty/backstage-plugin-common');
|
|
6
6
|
var auth = require('../auth/auth.cjs.js');
|
|
7
7
|
var express = require('express');
|
|
8
8
|
var Router = require('express-promise-router');
|
|
@@ -201,7 +201,7 @@ async function createRouter(options) {
|
|
|
201
201
|
await pagerduty.removeServiceRelationsFromService(serviceRelations, account);
|
|
202
202
|
response.sendStatus(200);
|
|
203
203
|
} catch (error) {
|
|
204
|
-
if (error instanceof
|
|
204
|
+
if (error instanceof backstagePluginCommon.HttpError) {
|
|
205
205
|
logger.error(`Error occurred while processing request: ${error.message}`);
|
|
206
206
|
response.status(error.status).json({
|
|
207
207
|
errors: [
|
|
@@ -240,7 +240,7 @@ async function createRouter(options) {
|
|
|
240
240
|
await pagerduty.addServiceRelationsToService(serviceRelations, account);
|
|
241
241
|
response.sendStatus(200);
|
|
242
242
|
} catch (error) {
|
|
243
|
-
if (error instanceof
|
|
243
|
+
if (error instanceof backstagePluginCommon.HttpError) {
|
|
244
244
|
logger.error(`Error occurred while processing request: ${error.message}`);
|
|
245
245
|
response.status(error.status).json({
|
|
246
246
|
errors: [
|
|
@@ -265,7 +265,7 @@ async function createRouter(options) {
|
|
|
265
265
|
response.status(400).json("Bad Request: ':serviceId' must be provided as part of the path");
|
|
266
266
|
}
|
|
267
267
|
} catch (error) {
|
|
268
|
-
if (error instanceof
|
|
268
|
+
if (error instanceof backstagePluginCommon.HttpError) {
|
|
269
269
|
response.status(error.status).json({
|
|
270
270
|
errors: [
|
|
271
271
|
`${error.message}`
|
|
@@ -291,7 +291,7 @@ async function createRouter(options) {
|
|
|
291
291
|
response.status(400).json("Bad Request: ':entityRef' must be provided as part of the path");
|
|
292
292
|
}
|
|
293
293
|
} catch (error) {
|
|
294
|
-
if (error instanceof
|
|
294
|
+
if (error instanceof backstagePluginCommon.HttpError) {
|
|
295
295
|
response.status(error.status).json({
|
|
296
296
|
errors: [
|
|
297
297
|
`${error.message}`
|
|
@@ -316,7 +316,7 @@ async function createRouter(options) {
|
|
|
316
316
|
}));
|
|
317
317
|
response.sendStatus(200);
|
|
318
318
|
} catch (error) {
|
|
319
|
-
if (error instanceof
|
|
319
|
+
if (error instanceof backstagePluginCommon.HttpError) {
|
|
320
320
|
logger.error(`Error occurred while processing request: ${error.message}`);
|
|
321
321
|
response.status(error.status).json({
|
|
322
322
|
errors: [
|
|
@@ -336,7 +336,7 @@ async function createRouter(options) {
|
|
|
336
336
|
}
|
|
337
337
|
response.json(setting);
|
|
338
338
|
} catch (error) {
|
|
339
|
-
if (error instanceof
|
|
339
|
+
if (error instanceof backstagePluginCommon.HttpError) {
|
|
340
340
|
response.status(error.status).json({
|
|
341
341
|
errors: [
|
|
342
342
|
`${error.message}`
|
|
@@ -391,7 +391,7 @@ async function createRouter(options) {
|
|
|
391
391
|
account: entity.account
|
|
392
392
|
});
|
|
393
393
|
} catch (error) {
|
|
394
|
-
if (error instanceof
|
|
394
|
+
if (error instanceof backstagePluginCommon.HttpError) {
|
|
395
395
|
logger.error(`Error occurred while processing request: ${error.message}`);
|
|
396
396
|
response.status(error.status).json({
|
|
397
397
|
errors: [
|
|
@@ -414,7 +414,7 @@ async function createRouter(options) {
|
|
|
414
414
|
const result = await buildEntityMappingsResponse(entityMappings, componentEntitiesDict, componentEntities, pagerDutyServices);
|
|
415
415
|
response.json(result);
|
|
416
416
|
} catch (error) {
|
|
417
|
-
if (error instanceof
|
|
417
|
+
if (error instanceof backstagePluginCommon.HttpError) {
|
|
418
418
|
response.status(error.status).json({
|
|
419
419
|
errors: [
|
|
420
420
|
`${error.message}`
|
|
@@ -442,7 +442,7 @@ async function createRouter(options) {
|
|
|
442
442
|
mapping: entityMapping
|
|
443
443
|
});
|
|
444
444
|
} catch (error) {
|
|
445
|
-
if (error instanceof
|
|
445
|
+
if (error instanceof backstagePluginCommon.HttpError) {
|
|
446
446
|
response.status(error.status).json({
|
|
447
447
|
errors: [
|
|
448
448
|
`${error.message}`
|
|
@@ -467,7 +467,7 @@ async function createRouter(options) {
|
|
|
467
467
|
mapping: entityMapping
|
|
468
468
|
});
|
|
469
469
|
} catch (error) {
|
|
470
|
-
if (error instanceof
|
|
470
|
+
if (error instanceof backstagePluginCommon.HttpError) {
|
|
471
471
|
response.status(error.status).json({
|
|
472
472
|
errors: [
|
|
473
473
|
`${error.message}`
|
|
@@ -497,7 +497,7 @@ async function createRouter(options) {
|
|
|
497
497
|
});
|
|
498
498
|
response.json(escalationPolicyDropDownOptions);
|
|
499
499
|
} catch (error) {
|
|
500
|
-
if (error instanceof
|
|
500
|
+
if (error instanceof backstagePluginCommon.HttpError) {
|
|
501
501
|
response.status(error.status).json({
|
|
502
502
|
errors: [
|
|
503
503
|
`${error.message}`
|
|
@@ -520,7 +520,7 @@ async function createRouter(options) {
|
|
|
520
520
|
};
|
|
521
521
|
response.json(onCallUsersResponse);
|
|
522
522
|
} catch (error) {
|
|
523
|
-
if (error instanceof
|
|
523
|
+
if (error instanceof backstagePluginCommon.HttpError) {
|
|
524
524
|
response.status(error.status).json({
|
|
525
525
|
errors: [
|
|
526
526
|
`${error.message}`
|
|
@@ -543,7 +543,7 @@ async function createRouter(options) {
|
|
|
543
543
|
};
|
|
544
544
|
response.json(serviceResponse);
|
|
545
545
|
} catch (error) {
|
|
546
|
-
if (error instanceof
|
|
546
|
+
if (error instanceof backstagePluginCommon.HttpError) {
|
|
547
547
|
response.status(error.status).json({
|
|
548
548
|
errors: [
|
|
549
549
|
`${error.message}`
|
|
@@ -570,7 +570,7 @@ async function createRouter(options) {
|
|
|
570
570
|
response.json(servicesResponse);
|
|
571
571
|
}
|
|
572
572
|
} catch (error) {
|
|
573
|
-
if (error instanceof
|
|
573
|
+
if (error instanceof backstagePluginCommon.HttpError) {
|
|
574
574
|
response.status(error.status).json({
|
|
575
575
|
errors: [
|
|
576
576
|
`${error.message}`
|
|
@@ -595,7 +595,7 @@ async function createRouter(options) {
|
|
|
595
595
|
});
|
|
596
596
|
response.json(integrationKey);
|
|
597
597
|
} catch (error) {
|
|
598
|
-
if (error instanceof
|
|
598
|
+
if (error instanceof backstagePluginCommon.HttpError) {
|
|
599
599
|
logger.error(`Error occurred while processing request: ${error.message}`);
|
|
600
600
|
response.status(error.status).json({
|
|
601
601
|
errors: [
|
|
@@ -615,7 +615,7 @@ async function createRouter(options) {
|
|
|
615
615
|
};
|
|
616
616
|
response.json(changeEventsResponse);
|
|
617
617
|
} catch (error) {
|
|
618
|
-
if (error instanceof
|
|
618
|
+
if (error instanceof backstagePluginCommon.HttpError) {
|
|
619
619
|
response.status(error.status).json({
|
|
620
620
|
errors: [
|
|
621
621
|
`${error.message}`
|
|
@@ -634,7 +634,7 @@ async function createRouter(options) {
|
|
|
634
634
|
};
|
|
635
635
|
response.json(incidentsResponse);
|
|
636
636
|
} catch (error) {
|
|
637
|
-
if (error instanceof
|
|
637
|
+
if (error instanceof backstagePluginCommon.HttpError) {
|
|
638
638
|
response.status(error.status).json({
|
|
639
639
|
errors: [
|
|
640
640
|
`${error.message}`
|
|
@@ -653,7 +653,7 @@ async function createRouter(options) {
|
|
|
653
653
|
};
|
|
654
654
|
response.json(serviceStandardsResponse);
|
|
655
655
|
} catch (error) {
|
|
656
|
-
if (error instanceof
|
|
656
|
+
if (error instanceof backstagePluginCommon.HttpError) {
|
|
657
657
|
response.status(error.status).json({
|
|
658
658
|
errors: [
|
|
659
659
|
`${error.message}`
|
|
@@ -672,7 +672,7 @@ async function createRouter(options) {
|
|
|
672
672
|
};
|
|
673
673
|
response.json(metricsResponse);
|
|
674
674
|
} catch (error) {
|
|
675
|
-
if (error instanceof
|
|
675
|
+
if (error instanceof backstagePluginCommon.HttpError) {
|
|
676
676
|
response.status(error.status).json({
|
|
677
677
|
errors: [
|
|
678
678
|
`${error.message}`
|