@pagerduty/backstage-plugin-backend 0.10.2 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,74 @@
1
+ # @pagerduty/backstage-plugin-backend
2
+
3
+ ## 0.11.0
4
+
5
+ ### Minor Changes
6
+
7
+ - dae278a: Add auto-matching algorithm for mapping PagerDuty services to Backstage components
8
+
9
+ ### Patch Changes
10
+
11
+ - 821f4e2: Include x-pagerduty-client header in PagerDuty API requests
12
+ - 47afbbc: Make changesets mandatory for all the packages
13
+ - Updated dependencies [47afbbc]
14
+ - @pagerduty/backstage-plugin-common@0.2.6
15
+
16
+ ## 0.10.3
17
+
18
+ ### Patch Changes
19
+
20
+ - 63a9957: Fix issue related to the use of backstage:^ token as a version for Backstage dependencies
21
+ - Updated dependencies [63a9957]
22
+ - @pagerduty/backstage-plugin-common@0.2.5
23
+
24
+ ## 0.10.2
25
+
26
+ ### Patch Changes
27
+
28
+ - 2947469: Remove unnecessary dependencies
29
+ - Updated dependencies [2947469]
30
+ - @pagerduty/backstage-plugin-common@0.2.4
31
+
32
+ ## 0.10.1
33
+
34
+ ### Patch Changes
35
+
36
+ - 444e9b3: Update NPM releases to use Trusted Publisher
37
+
38
+ ## 0.10.0
39
+
40
+ ### Minor Changes
41
+
42
+ - b29f897: Disables unauthenticated access to plugin routes by default
43
+ - **breaking change**: this change sets the default access for the backend plugin to authenticated. Previous uses of the plugin made it unauthenticated which if it was your case, now you need to set `enableUnauthenticatedAccess` to true.
44
+
45
+ ## 0.9.11
46
+
47
+ ### Patch Changes
48
+
49
+ - 7e65a56: Remove remainings of old backend system
50
+ - 7e65a56: Fix package.json metadata to improve Portal relations
51
+
52
+ ## 0.9.10
53
+
54
+ ### Patch Changes
55
+
56
+ - 987dda8: Release package with correct type definition
57
+
58
+ ## 0.9.9
59
+
60
+ ### Patch Changes
61
+
62
+ - 44ea32e: Release new patch version to use new release pipeline
63
+
64
+ ## 0.9.8
65
+
66
+ ### Patch Changes
67
+
68
+ - 60c1117: Release healthy versions
69
+
70
+ ## 0.9.7
71
+
72
+ ### Patch Changes
73
+
74
+ - 1abe215: testing version bump
@@ -12,25 +12,33 @@ var fetch__default = /*#__PURE__*/_interopDefaultCompat(fetch);
12
12
  const EndpointConfig = {};
13
13
  let fallbackEndpointConfig;
14
14
  let isLegacyConfig = false;
15
- function setFallbackEndpointConfig(account) {
15
+ const SubdomainConfig = {};
16
+ let fallbackSubdomain;
17
+ function setFallbackAccountConfig(account) {
16
18
  fallbackEndpointConfig = {
17
19
  eventsBaseUrl: account.eventsBaseUrl ?? "https://events.pagerduty.com/v2",
18
20
  apiBaseUrl: account.apiBaseUrl ?? "https://api.pagerduty.com"
19
21
  };
22
+ if (account.oauth?.subDomain) {
23
+ fallbackSubdomain = account.oauth.subDomain;
24
+ }
20
25
  }
21
- function insertEndpointConfig(account) {
26
+ function insertAccountConfig(account) {
22
27
  EndpointConfig[account.id] = {
23
28
  eventsBaseUrl: account.eventsBaseUrl ?? "https://events.pagerduty.com/v2",
24
29
  apiBaseUrl: account.apiBaseUrl ?? "https://api.pagerduty.com"
25
30
  };
31
+ if (account.oauth?.subDomain) {
32
+ SubdomainConfig[account.id] = account.oauth.subDomain;
33
+ }
26
34
  }
27
35
  function loadPagerDutyEndpointsFromConfig(config, logger) {
28
- if (config.getOptional("pagerDuty.accounts")) {
36
+ const accounts = config.getOptional("pagerDuty.accounts");
37
+ if (accounts) {
29
38
  logger.debug(
30
39
  `New accounts configuration detected. Loading PagerDuty endpoints from config.`
31
40
  );
32
41
  isLegacyConfig = false;
33
- const accounts = config.getOptional("pagerDuty.accounts");
34
42
  if (accounts?.length === 1) {
35
43
  logger.debug(
36
44
  `Single account configuration detected. Loading PagerDuty endpoints from config to 'default'.`
@@ -39,15 +47,18 @@ function loadPagerDutyEndpointsFromConfig(config, logger) {
39
47
  eventsBaseUrl: accounts[0].eventsBaseUrl !== void 0 ? accounts[0].eventsBaseUrl : "https://events.pagerduty.com/v2",
40
48
  apiBaseUrl: accounts[0].apiBaseUrl !== void 0 ? accounts[0].apiBaseUrl : "https://api.pagerduty.com"
41
49
  };
50
+ if (accounts[0].oauth?.subDomain) {
51
+ SubdomainConfig.default = accounts[0].oauth.subDomain;
52
+ }
42
53
  } else {
43
54
  logger.debug(
44
55
  `Multiple account configuration detected. Loading PagerDuty endpoints from config.`
45
56
  );
46
57
  accounts?.forEach((account) => {
47
58
  if (account.isDefault) {
48
- setFallbackEndpointConfig(account);
59
+ setFallbackAccountConfig(account);
49
60
  }
50
- insertEndpointConfig(account);
61
+ insertAccountConfig(account);
51
62
  });
52
63
  }
53
64
  } else {
@@ -57,6 +68,10 @@ function loadPagerDutyEndpointsFromConfig(config, logger) {
57
68
  eventsBaseUrl: config.getOptionalString("pagerDuty.eventsBaseUrl") !== void 0 ? config.getString("pagerDuty.eventsBaseUrl") : "https://events.pagerduty.com/v2",
58
69
  apiBaseUrl: config.getOptionalString("pagerDuty.apiBaseUrl") !== void 0 ? config.getString("pagerDuty.apiBaseUrl") : "https://api.pagerduty.com"
59
70
  };
71
+ const legacySubdomain = config.getOptionalString("pagerDuty.oauth.subDomain");
72
+ if (legacySubdomain) {
73
+ SubdomainConfig.default = legacySubdomain;
74
+ }
60
75
  }
61
76
  }
62
77
  function getApiBaseUrl(account) {
@@ -68,15 +83,30 @@ function getApiBaseUrl(account) {
68
83
  }
69
84
  return fallbackEndpointConfig.apiBaseUrl;
70
85
  }
86
+ function getSubdomain(account) {
87
+ if (isLegacyConfig === true) {
88
+ return SubdomainConfig.default;
89
+ }
90
+ if (account && account !== "default") {
91
+ return SubdomainConfig[account] ?? fallbackSubdomain ?? SubdomainConfig.default;
92
+ }
93
+ return fallbackSubdomain ?? SubdomainConfig.default;
94
+ }
95
+ async function getDefaultHeaders(account) {
96
+ const subdomain = getSubdomain(account);
97
+ const clientHeader = `"Backstage" <https://${subdomain}.backstage.com>`;
98
+ return {
99
+ Authorization: await auth.getAuthToken(account),
100
+ Accept: "application/vnd.pagerduty+json;version=2",
101
+ "Content-Type": "application/json",
102
+ "X-PagerDuty-Client": clientHeader
103
+ };
104
+ }
71
105
  async function addServiceRelationsToService(serviceRelations, account) {
72
106
  let response;
73
107
  const options = {
74
108
  method: "POST",
75
- headers: {
76
- Authorization: await auth.getAuthToken(account),
77
- Accept: "application/vnd.pagerduty+json;version=2",
78
- "Content-Type": "application/json"
79
- },
109
+ headers: await getDefaultHeaders(account),
80
110
  body: JSON.stringify({
81
111
  relationships: serviceRelations
82
112
  })
@@ -131,11 +161,7 @@ async function removeServiceRelationsFromService(serviceRelations, account) {
131
161
  let response;
132
162
  const options = {
133
163
  method: "POST",
134
- headers: {
135
- Authorization: await auth.getAuthToken(account),
136
- Accept: "application/vnd.pagerduty+json;version=2",
137
- "Content-Type": "application/json"
138
- },
164
+ headers: await getDefaultHeaders(account),
139
165
  body: JSON.stringify({
140
166
  relationships: serviceRelations
141
167
  })
@@ -190,11 +216,7 @@ async function getServiceRelationshipsById(serviceId, account) {
190
216
  let response;
191
217
  const options = {
192
218
  method: "GET",
193
- headers: {
194
- Authorization: await auth.getAuthToken(account),
195
- Accept: "application/vnd.pagerduty+json;version=2",
196
- "Content-Type": "application/json"
197
- }
219
+ headers: await getDefaultHeaders(account)
198
220
  };
199
221
  const apiBaseUrl = getApiBaseUrl(account);
200
222
  const baseUrl = `${apiBaseUrl}/service_dependencies/technical_services/${serviceId}`;
@@ -247,11 +269,7 @@ async function getEscalationPolicies(offset, limit, account) {
247
269
  const params = `total=true&sort_by=name&offset=${offset}&limit=${limit}`;
248
270
  const options = {
249
271
  method: "GET",
250
- headers: {
251
- Authorization: await auth.getAuthToken(account),
252
- Accept: "application/vnd.pagerduty+json;version=2",
253
- "Content-Type": "application/json"
254
- }
272
+ headers: await getDefaultHeaders(account)
255
273
  };
256
274
  const apiBaseUrl = getApiBaseUrl(account);
257
275
  const baseUrl = `${apiBaseUrl}/escalation_policies`;
@@ -337,11 +355,7 @@ async function getOncallUsers(escalationPolicy, account) {
337
355
  const params = `time_zone=UTC&include[]=users&escalation_policy_ids[]=${escalationPolicy}`;
338
356
  const options = {
339
357
  method: "GET",
340
- headers: {
341
- Authorization: await auth.getAuthToken(account),
342
- Accept: "application/vnd.pagerduty+json;version=2",
343
- "Content-Type": "application/json"
344
- }
358
+ headers: await getDefaultHeaders(account)
345
359
  };
346
360
  const apiBaseUrl = getApiBaseUrl(account);
347
361
  const baseUrl = `${apiBaseUrl}/oncalls`;
@@ -405,14 +419,9 @@ async function getOncallUsers(escalationPolicy, account) {
405
419
  async function getServiceById(serviceId, account) {
406
420
  let response;
407
421
  const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies`;
408
- const token = await auth.getAuthToken(account);
409
422
  const options = {
410
423
  method: "GET",
411
- headers: {
412
- Authorization: token,
413
- Accept: "application/vnd.pagerduty+json;version=2",
414
- "Content-Type": "application/json"
415
- }
424
+ headers: await getDefaultHeaders(account)
416
425
  };
417
426
  const apiBaseUrl = getApiBaseUrl(account);
418
427
  const baseUrl = `${apiBaseUrl}/services`;
@@ -463,14 +472,9 @@ async function getServiceById(serviceId, account) {
463
472
  async function getServiceByIntegrationKey(integrationKey, account) {
464
473
  let response;
465
474
  const params = `query=${integrationKey}&time_zone=UTC&include[]=integrations&include[]=escalation_policies`;
466
- const token = await auth.getAuthToken(account);
467
475
  const options = {
468
476
  method: "GET",
469
- headers: {
470
- Authorization: token,
471
- Accept: "application/vnd.pagerduty+json;version=2",
472
- "Content-Type": "application/json"
473
- }
477
+ headers: await getDefaultHeaders(account)
474
478
  };
475
479
  const apiBaseUrl = getApiBaseUrl(account);
476
480
  const baseUrl = `${apiBaseUrl}/services`;
@@ -527,14 +531,9 @@ async function getAllServices() {
527
531
  Object.entries(EndpointConfig).map(async ([account, _]) => {
528
532
  let response;
529
533
  const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies&include[]=teams&total=true`;
530
- const token = await auth.getAuthToken(account);
531
534
  const options = {
532
535
  method: "GET",
533
- headers: {
534
- Authorization: token,
535
- Accept: "application/vnd.pagerduty+json;version=2",
536
- "Content-Type": "application/json"
537
- }
536
+ headers: await getDefaultHeaders(account)
538
537
  };
539
538
  const apiBaseUrl = getApiBaseUrl(account);
540
539
  const baseUrl = `${apiBaseUrl}/services`;
@@ -589,11 +588,7 @@ async function getChangeEvents(serviceId, account) {
589
588
  const params = `limit=5&time_zone=UTC&sort_by=timestamp`;
590
589
  const options = {
591
590
  method: "GET",
592
- headers: {
593
- Authorization: await auth.getAuthToken(account),
594
- Accept: "application/vnd.pagerduty+json;version=2",
595
- "Content-Type": "application/json"
596
- }
591
+ headers: await getDefaultHeaders(account)
597
592
  };
598
593
  const apiBaseUrl = getApiBaseUrl(account);
599
594
  const baseUrl = `${apiBaseUrl}/services`;
@@ -649,11 +644,7 @@ async function getIncidents(serviceId, account) {
649
644
  const params = `time_zone=UTC&sort_by=created_at&statuses[]=triggered&statuses[]=acknowledged&service_ids[]=${serviceId}`;
650
645
  const options = {
651
646
  method: "GET",
652
- headers: {
653
- Authorization: await auth.getAuthToken(account),
654
- Accept: "application/vnd.pagerduty+json;version=2",
655
- "Content-Type": "application/json"
656
- }
647
+ headers: await getDefaultHeaders(account)
657
648
  };
658
649
  const apiBaseUrl = getApiBaseUrl(account);
659
650
  const baseUrl = `${apiBaseUrl}/incidents`;
@@ -707,11 +698,7 @@ async function getServiceStandards(serviceId, account) {
707
698
  let response;
708
699
  const options = {
709
700
  method: "GET",
710
- headers: {
711
- Authorization: await auth.getAuthToken(account),
712
- Accept: "application/vnd.pagerduty+json;version=2",
713
- "Content-Type": "application/json"
714
- }
701
+ headers: await getDefaultHeaders(account)
715
702
  };
716
703
  const apiBaseUrl = getApiBaseUrl(account);
717
704
  const baseUrl = `${apiBaseUrl}/standards/scores/technical_services/${serviceId}`;
@@ -768,11 +755,7 @@ async function getServiceMetrics(serviceId, account) {
768
755
  });
769
756
  const options = {
770
757
  method: "POST",
771
- headers: {
772
- Authorization: await auth.getAuthToken(account),
773
- Accept: "application/vnd.pagerduty+json;version=2",
774
- "Content-Type": "application/json"
775
- },
758
+ headers: await getDefaultHeaders(account),
776
759
  body
777
760
  };
778
761
  const apiBaseUrl = getApiBaseUrl(account);
@@ -818,7 +801,6 @@ async function createServiceIntegration({
818
801
  let response;
819
802
  const apiBaseUrl = getApiBaseUrl(account);
820
803
  const baseUrl = `${apiBaseUrl}/services`;
821
- const token = await auth.getAuthToken(account);
822
804
  const options = {
823
805
  method: "POST",
824
806
  body: JSON.stringify({
@@ -834,11 +816,7 @@ async function createServiceIntegration({
834
816
  }
835
817
  }
836
818
  }),
837
- headers: {
838
- Authorization: token,
839
- Accept: "application/vnd.pagerduty+json;version=2",
840
- "Content-Type": "application/json"
841
- }
819
+ headers: await getDefaultHeaders(account)
842
820
  };
843
821
  try {
844
822
  response = await fetchWithRetries(
@@ -914,8 +892,8 @@ exports.getServiceByIntegrationKey = getServiceByIntegrationKey;
914
892
  exports.getServiceMetrics = getServiceMetrics;
915
893
  exports.getServiceRelationshipsById = getServiceRelationshipsById;
916
894
  exports.getServiceStandards = getServiceStandards;
917
- exports.insertEndpointConfig = insertEndpointConfig;
895
+ exports.insertAccountConfig = insertAccountConfig;
918
896
  exports.loadPagerDutyEndpointsFromConfig = loadPagerDutyEndpointsFromConfig;
919
897
  exports.removeServiceRelationsFromService = removeServiceRelationsFromService;
920
- exports.setFallbackEndpointConfig = setFallbackEndpointConfig;
898
+ exports.setFallbackAccountConfig = setFallbackAccountConfig;
921
899
  //# sourceMappingURL=pagerduty.cjs.js.map
@@ -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 '@pagerduty/backstage-plugin-common';\n\nimport { DateTime } from 'luxon';\nimport {\n LoggerService,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\n\nexport type PagerDutyEndpointConfig = {\n eventsBaseUrl: string;\n apiBaseUrl: string;\n};\n\nconst EndpointConfig: Record<string, PagerDutyEndpointConfig> = {};\nlet fallbackEndpointConfig: PagerDutyEndpointConfig;\nlet isLegacyConfig = false;\n\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(\n config: RootConfigService,\n logger: LoggerService,\n) {\n if (config.getOptional('pagerDuty.accounts')) {\n logger.debug(\n `New accounts configuration detected. Loading PagerDuty endpoints from config.`,\n );\n isLegacyConfig = false;\n\n const accounts =\n config.getOptional<PagerDutyAccountConfig[]>('pagerDuty.accounts');\n\n if (accounts?.length === 1) {\n logger.debug(\n `Single account configuration detected. Loading PagerDuty endpoints from config to 'default'.`,\n );\n EndpointConfig.default = {\n eventsBaseUrl:\n accounts[0].eventsBaseUrl !== undefined\n ? accounts[0].eventsBaseUrl\n : 'https://events.pagerduty.com/v2',\n apiBaseUrl:\n accounts[0].apiBaseUrl !== undefined\n ? accounts[0].apiBaseUrl\n : 'https://api.pagerduty.com',\n };\n } else {\n logger.debug(\n `Multiple account configuration detected. Loading PagerDuty endpoints from config.`,\n );\n accounts?.forEach(account => {\n if (account.isDefault) {\n setFallbackEndpointConfig(account);\n }\n\n insertEndpointConfig(account);\n });\n }\n } else {\n logger.debug(`Loading legacy PagerDuty endpoints from config.`);\n isLegacyConfig = true;\n\n EndpointConfig.default = {\n eventsBaseUrl:\n config.getOptionalString('pagerDuty.eventsBaseUrl') !== undefined\n ? config.getString('pagerDuty.eventsBaseUrl')\n : 'https://events.pagerduty.com/v2',\n apiBaseUrl:\n config.getOptionalString('pagerDuty.apiBaseUrl') !== undefined\n ? config.getString('pagerDuty.apiBaseUrl')\n : 'https://api.pagerduty.com',\n };\n }\n}\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(\n serviceRelations: PagerDutyServiceDependency[],\n account?: string,\n): 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(\n `Failed to add service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to add service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to add service dependencies. Caller did not supply credentials or did not provide the correct credentials. If you are using an API key, it may be invalid or your Authorization header may be malformed.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to add service dependencies. Caller is not authorized to view the requested resource. While your authentication is valid, the authenticated user or token does not have permission to perform this action.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to add service dependencies. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n } catch (error) {\n throw new HttpError(\n `Failed to parse service dependency information: ${error}`,\n 500,\n );\n }\n}\n\nexport async function removeServiceRelationsFromService(\n serviceRelations: PagerDutyServiceDependency[],\n account?: string,\n): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: {\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(\n `Failed to remove service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to remove service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to remove service dependencies. Caller did not supply credentials or did not provide the correct credentials. If you are using an API key, it may be invalid or your Authorization header may be malformed.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to remove service dependencies. Caller is not authorized to view the requested resource. While your authentication is valid, the authenticated user or token does not have permission to perform this action.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to remove service dependencies. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n } catch (error) {\n throw new HttpError(\n `Failed to parse service dependency information: ${error}`,\n 500,\n );\n }\n}\n\nexport async function getServiceRelationshipsById(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'GET',\n headers: {\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(\n `Failed to list service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to list service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to list service dependencies. Caller did not supply credentials or did not provide the correct credentials. If you are using an API key, it may be invalid or your Authorization header may be malformed.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to list service dependencies. Caller is not authorized to view the requested resource. While your authentication is valid, the authenticated user or token does not have permission to perform this action.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to list service dependencies. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n } catch (error) {\n throw new HttpError(\n `Failed to parse service dependency information: ${error}`,\n 500,\n );\n }\n}\n\nasync function getEscalationPolicies(\n offset: number,\n limit: number,\n account?: string,\n): Promise<[boolean, PagerDutyEscalationPolicy[]]> {\n let response: Response;\n const params = `total=true&sort_by=name&offset=${offset}&limit=${limit}`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\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(\n `Failed to list escalation policies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to list escalation policies. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to list escalation policies. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to list escalation policies. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 429:\n throw new HttpError(\n 'Failed to list escalation policies. Rate limit exceeded.',\n 429,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyEscalationPoliciesResponse;\n try {\n result = (await response.json()) as PagerDutyEscalationPoliciesResponse;\n\n return [result.more ?? false, result.escalation_policies];\n } catch (error) {\n throw new HttpError(\n `Failed to parse escalation policy information: ${error}`,\n 500,\n );\n }\n}\n\nexport async function getAllEscalationPolicies(): Promise<\n PagerDutyEscalationPolicy[]\n> {\n const limit = 50;\n let offset = 0;\n let moreResults = false;\n let results: PagerDutyEscalationPolicy[] = [];\n\n await Promise.all(\n Object.keys(EndpointConfig).map(async account => {\n try {\n // reset offset value\n offset = 0;\n\n do {\n const res = await getEscalationPolicies(offset, limit, account);\n\n // set account for each escalation policy\n res[1].forEach(policy => {\n policy.account = account;\n });\n\n // update results\n results = results.concat(res[1]);\n\n // if more results exist\n if (res[0] === true) {\n moreResults = true;\n offset += limit;\n } else {\n moreResults = false;\n }\n } while (moreResults === true);\n } catch (error) {\n if (error instanceof HttpError) {\n throw error;\n } else {\n throw new HttpError(`${error}`, 500);\n }\n }\n }),\n );\n\n return results;\n}\n\nexport async function isEventNoiseReductionEnabled(\n account?: string,\n): Promise<boolean> {\n let response: Response;\n const baseUrl = 'https://api.pagerduty.com';\n const options: RequestInit = {\n method: 'GET',\n headers: {\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(\n `Failed to read abilities. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 401:\n throw new Error(\n `Failed to read abilities. Caller did not supply credentials or did not provide the correct credentials.`,\n );\n case 403:\n throw new Error(\n `Failed to read abilities. Caller is not authorized to view the requested resource.`,\n );\n case 429:\n throw new Error(`Failed to read abilities. Rate limit exceeded.`);\n default: // 200\n break;\n }\n\n let result: PagerDutyAbilitiesResponse;\n try {\n result = (await response.json()) as PagerDutyAbilitiesResponse;\n\n if (\n result.abilities.includes('preview_intelligent_alert_grouping') &&\n result.abilities.includes('time_based_alert_grouping')\n ) {\n return true;\n }\n\n return false;\n } catch (error) {\n throw new Error(`Failed to parse abilities information: ${error}`);\n }\n}\n\nexport async function getOncallUsers(\n escalationPolicy: string,\n account?: string,\n): Promise<PagerDutyUser[]> {\n let response: Response;\n const params = `time_zone=UTC&include[]=users&escalation_policy_ids[]=${escalationPolicy}`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\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(\n `Failed to list oncalls. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to list oncalls. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to list oncalls. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to list oncalls. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 429:\n throw new HttpError('Failed to list oncalls. Rate limit exceeded.', 429);\n default: // 200\n break;\n }\n\n let result: PagerDutyOnCallsResponse;\n let usersItem: PagerDutyUser[];\n try {\n result = (await response.json()) as PagerDutyOnCallsResponse;\n\n if (result.oncalls.length !== 0) {\n const oncallsSorted = [...result.oncalls].sort((a, b) => {\n return a.escalation_level - b.escalation_level;\n });\n\n const oncallsFiltered = oncallsSorted.filter(oncall => {\n return oncall.escalation_level === oncallsSorted[0].escalation_level;\n });\n\n usersItem = [...oncallsFiltered]\n .sort((a, b) => (a.user.name > b.user.name ? 1 : -1))\n .map(oncall => oncall.user);\n\n // remove duplicates from usersItem\n const uniqueUsers = new Map();\n usersItem.forEach(user => {\n uniqueUsers.set(user.id, user);\n });\n\n usersItem.length = 0;\n uniqueUsers.forEach(user => {\n usersItem.push(user);\n });\n\n return usersItem;\n }\n\n return [];\n } catch (error) {\n throw new HttpError(`Failed to parse oncall information: ${error}`, 500);\n }\n}\n\nexport async function getServiceById(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyService> {\n let response: Response;\n const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies`;\n const token = await getAuthToken(account);\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\n Authorization: token,\n Accept: 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetchWithRetries(\n `${baseUrl}/${serviceId}?${params}`,\n options,\n );\n } catch (error) {\n throw new Error(`Failed to retrieve service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get service. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to get service. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceResponse;\n try {\n result = (await response.json()) as PagerDutyServiceResponse;\n\n return result.service;\n } catch (error) {\n throw new HttpError(`Failed to parse service information: ${error}`, 500);\n }\n}\n\nexport async function getServiceByIntegrationKey(\n integrationKey: string,\n account?: string,\n): Promise<PagerDutyService> {\n let response: Response;\n const params = `query=${integrationKey}&time_zone=UTC&include[]=integrations&include[]=escalation_policies`;\n 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(\n `Failed to get service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get service. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to get service. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServicesResponse;\n try {\n result = (await response.json()) as PagerDutyServicesResponse;\n } catch (error) {\n throw new HttpError(`Failed to parse service information: ${error}`, 500);\n }\n\n if (result.services.length === 0) {\n throw new HttpError(\n `Failed to get service. The requested resource was not found.`,\n 404,\n );\n }\n\n return result.services[0];\n}\n\nexport async function 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(\n `Failed to get services. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get services. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get services. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get services. Caller is not authorized to view the requested resource.',\n 403,\n );\n default: // 200\n break;\n }\n\n result = (await response.json()) as PagerDutyServicesAPIResponse;\n\n // 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(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyChangeEvent[]> {\n let response: Response;\n const params = `limit=5&time_zone=UTC&sort_by=timestamp`;\n const options: RequestInit = {\n method: 'GET',\n headers: {\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(\n `${baseUrl}/${serviceId}/change_events?${params}`,\n options,\n );\n } catch (error) {\n throw new Error(`Failed to retrieve change events for service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get change events for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get change events for service. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get change events for service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get change events for service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to get change events for service. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyChangeEventsResponse;\n try {\n result = (await response.json()) as PagerDutyChangeEventsResponse;\n\n return result.change_events;\n } catch (error) {\n throw new HttpError(\n `Failed to parse change events information: ${error}`,\n 500,\n );\n }\n}\n\nexport async function getIncidents(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyIncident[]> {\n let response: Response;\n const params = `time_zone=UTC&sort_by=created_at&statuses[]=triggered&statuses[]=acknowledged&service_ids[]=${serviceId}`;\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\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(\n `Failed to get incidents for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get incidents for service. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get incidents for service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 402:\n throw new HttpError(\n 'Failed to get incidents for service. Account does not have the abilities to perform the action. Please review the response for the required abilities.',\n 402,\n );\n case 403:\n throw new HttpError(\n 'Failed to get incidents for service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 429:\n throw new HttpError(\n 'Failed to get incidents for service. Too many requests have been made, the rate limit has been reached.',\n 429,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyIncidentsResponse;\n try {\n result = (await response.json()) as PagerDutyIncidentsResponse;\n\n return result.incidents;\n } catch (error) {\n throw new HttpError(`Failed to parse incidents information: ${error}`, 500);\n }\n}\n\nexport async function getServiceStandards(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyServiceStandards> {\n let response: Response;\n\n const options: RequestInit = {\n method: 'GET',\n headers: {\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(\n `Failed to retrieve service standards for service: ${error}`,\n );\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get service standards for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 401:\n throw new HttpError(\n 'Failed to get service standards for service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get service standards for service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 429:\n throw new HttpError(\n 'Failed to get service standards for service. Too many requests have been made, the rate limit has been reached.',\n 429,\n );\n default: // 200\n break;\n }\n\n try {\n const result = await response.json();\n return result;\n } catch (error) {\n throw new HttpError(\n `Failed to parse service standards information: ${error}`,\n 500,\n );\n }\n}\n\nexport async function getServiceMetrics(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyServiceMetrics[]> {\n let response: Response;\n\n const endDate = DateTime.now();\n const startDate = endDate.minus({ days: 30 });\n const body = JSON.stringify({\n filters: {\n created_at_start: startDate.toISO(),\n created_at_end: endDate.toISO(),\n service_ids: [serviceId],\n },\n });\n\n const options: RequestInit = {\n method: 'POST',\n headers: {\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(\n `Failed to get service metrics for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get service metrics for service. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.',\n 400,\n );\n case 429:\n throw new HttpError(\n 'Failed to get service metrics for service. Too many requests have been made, the rate limit has been reached.',\n 429,\n );\n default: // 200\n break;\n }\n\n try {\n const result = await response.json();\n\n return result.data;\n } catch (error) {\n throw new HttpError(\n `Failed to parse service metrics information: ${error}`,\n 500,\n );\n }\n}\n\nexport type CreateServiceIntegrationProps = {\n serviceId: string;\n vendorId: string;\n account?: string;\n};\n\nexport async function createServiceIntegration({\n serviceId,\n vendorId,\n account,\n}: CreateServiceIntegrationProps): Promise<string> {\n let response: Response;\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n 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(\n `${baseUrl}/${serviceId}/integrations`,\n options,\n );\n } catch (error) {\n throw new Error(`Failed to create service integration: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new Error(\n `Failed to create service integration. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new Error(\n `Failed to create service integration. Caller provided invalid arguments.`,\n );\n case 401:\n throw new Error(\n `Failed to create service integration. Caller did not supply credentials or did not provide the correct credentials.`,\n );\n case 403:\n throw new Error(\n `Failed to create service integration. Caller is not authorized to view the requested resource.`,\n );\n case 429:\n throw new Error(\n `Failed to create service integration. Rate limit exceeded.`,\n );\n default: // 201\n break;\n }\n\n let result: PagerDutyIntegrationResponse;\n try {\n result = (await response.json()) as PagerDutyIntegrationResponse;\n\n return result.integration.integration_key ?? '';\n } catch (error) {\n throw new Error(`Failed to parse service information: ${error}`);\n }\n}\n\nexport async function fetchWithRetries(\n url: string,\n options: RequestInit,\n): Promise<Response> {\n let response: Response;\n let error: Error = new Error();\n\n // set retry parameters\n const maxRetries = 5;\n const delay = 1000;\n let factor = 2;\n\n for (let i = 0; i < maxRetries; i++) {\n try {\n response = await fetch(url, options);\n return response;\n } catch (e) {\n error = e as Error;\n }\n\n const timeout = delay * factor;\n await new Promise(resolve => setTimeout(resolve, timeout));\n factor *= 2;\n }\n\n throw new Error(\n `Failed to fetch data after ${maxRetries} retries. Last error: ${error}`,\n );\n}\n"],"names":["getAuthToken","HttpError","DateTime","fetch"],"mappings":"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"}
1
+ {"version":3,"file":"pagerduty.cjs.js","sources":["../../src/apis/pagerduty.ts"],"sourcesContent":["import fetch from 'node-fetch';\nimport type { RequestInit, Response } from 'node-fetch';\n\nimport { getAuthToken } from '../auth/auth';\n\nimport {\n PagerDutyServiceResponse,\n PagerDutyServicesResponse,\n PagerDutyEscalationPolicy,\n PagerDutyEscalationPoliciesResponse,\n PagerDutyAbilitiesResponse,\n PagerDutyOnCallsResponse,\n PagerDutyUser,\n PagerDutyService,\n PagerDutyChangeEventsResponse,\n PagerDutyChangeEvent,\n PagerDutyIncident,\n PagerDutyIncidentsResponse,\n PagerDutyServiceStandards,\n PagerDutyServiceMetrics,\n HttpError,\n PagerDutyServicesAPIResponse,\n PagerDutyAccountConfig,\n PagerDutyIntegrationResponse,\n PagerDutyServiceDependency,\n PagerDutyServiceDependencyResponse,\n} from '@pagerduty/backstage-plugin-common';\n\nimport { DateTime } from 'luxon';\nimport {\n LoggerService,\n RootConfigService,\n} from '@backstage/backend-plugin-api';\n\nexport type PagerDutyEndpointConfig = {\n eventsBaseUrl: string;\n apiBaseUrl: string;\n};\n\nconst EndpointConfig: Record<string, PagerDutyEndpointConfig> = {};\nlet fallbackEndpointConfig: PagerDutyEndpointConfig;\nlet isLegacyConfig = false;\n\nconst SubdomainConfig: Record<string, string> = {};\nlet fallbackSubdomain: string | undefined;\n\nexport function setFallbackAccountConfig(account: PagerDutyAccountConfig) {\n fallbackEndpointConfig = {\n eventsBaseUrl: account.eventsBaseUrl ?? 'https://events.pagerduty.com/v2',\n apiBaseUrl: account.apiBaseUrl ?? 'https://api.pagerduty.com',\n };\n\n if (account.oauth?.subDomain) {\n fallbackSubdomain = account.oauth.subDomain;\n }\n}\n\nexport function insertAccountConfig(account: PagerDutyAccountConfig) {\n EndpointConfig[account.id] = {\n eventsBaseUrl: account.eventsBaseUrl ?? 'https://events.pagerduty.com/v2',\n apiBaseUrl: account.apiBaseUrl ?? 'https://api.pagerduty.com',\n };\n\n if (account.oauth?.subDomain) {\n SubdomainConfig[account.id] = account.oauth.subDomain;\n }\n}\n\nexport function loadPagerDutyEndpointsFromConfig(\n config: RootConfigService,\n logger: LoggerService,\n) {\n const accounts = config.getOptional<PagerDutyAccountConfig[]>('pagerDuty.accounts');\n\n if (accounts) {\n logger.debug(\n `New accounts configuration detected. Loading PagerDuty endpoints from config.`,\n );\n isLegacyConfig = false;\n\n if (accounts?.length === 1) {\n logger.debug(\n `Single account configuration detected. Loading PagerDuty endpoints from config to 'default'.`,\n );\n EndpointConfig.default = {\n eventsBaseUrl:\n accounts[0].eventsBaseUrl !== undefined\n ? accounts[0].eventsBaseUrl\n : 'https://events.pagerduty.com/v2',\n apiBaseUrl:\n accounts[0].apiBaseUrl !== undefined\n ? accounts[0].apiBaseUrl\n : 'https://api.pagerduty.com',\n };\n\n if (accounts[0].oauth?.subDomain) {\n SubdomainConfig.default = accounts[0].oauth.subDomain;\n }\n } else {\n logger.debug(\n `Multiple account configuration detected. Loading PagerDuty endpoints from config.`,\n );\n accounts?.forEach(account => {\n if (account.isDefault) {\n setFallbackAccountConfig(account);\n }\n\n insertAccountConfig(account);\n });\n }\n } else {\n logger.debug(`Loading legacy PagerDuty endpoints from config.`);\n isLegacyConfig = true;\n\n EndpointConfig.default = {\n eventsBaseUrl:\n config.getOptionalString('pagerDuty.eventsBaseUrl') !== undefined\n ? config.getString('pagerDuty.eventsBaseUrl')\n : 'https://events.pagerduty.com/v2',\n apiBaseUrl:\n config.getOptionalString('pagerDuty.apiBaseUrl') !== undefined\n ? config.getString('pagerDuty.apiBaseUrl')\n : 'https://api.pagerduty.com',\n };\n\n const legacySubdomain = config.getOptionalString('pagerDuty.oauth.subDomain');\n\n if (legacySubdomain) {\n SubdomainConfig.default = legacySubdomain;\n }\n }\n}\n\nfunction getApiBaseUrl(account?: string): string {\n if (isLegacyConfig === true) {\n return EndpointConfig.default.apiBaseUrl;\n }\n\n if (account) {\n return EndpointConfig[account].apiBaseUrl;\n }\n\n return fallbackEndpointConfig.apiBaseUrl;\n}\n\nfunction getSubdomain(account?: string): string {\n if (isLegacyConfig === true) {\n return SubdomainConfig.default;\n }\n\n if (account && account !== 'default') {\n return SubdomainConfig[account] ?? fallbackSubdomain ?? SubdomainConfig.default;\n }\n\n return fallbackSubdomain ?? SubdomainConfig.default;\n}\n\nasync function getDefaultHeaders(account?: string): Promise<Record<string, string>> {\n const subdomain = getSubdomain(account);\n const clientHeader = `\"Backstage\" <https://${subdomain}.backstage.com>`;\n\n return {\n Authorization: await getAuthToken(account),\n Accept: 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n 'X-PagerDuty-Client': clientHeader,\n };\n}\n\n// Supporting router\nexport async function addServiceRelationsToService(\n serviceRelations: PagerDutyServiceDependency[],\n account?: string,\n): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: await getDefaultHeaders(account),\n body: JSON.stringify({\n relationships: serviceRelations,\n }),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/service_dependencies/associate`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service dependencies: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to add service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to add service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to add service dependencies. Caller did not supply credentials or did not provide the correct credentials. If you are using an API key, it may be invalid or your Authorization header may be malformed.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to add service dependencies. Caller is not authorized to view the requested resource. While your authentication is valid, the authenticated user or token does not have permission to perform this action.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to add service dependencies. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n } catch (error) {\n throw new HttpError(\n `Failed to parse service dependency information: ${error}`,\n 500,\n );\n }\n}\n\nexport async function removeServiceRelationsFromService(\n serviceRelations: PagerDutyServiceDependency[],\n account?: string,\n): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'POST',\n headers: await getDefaultHeaders(account),\n body: JSON.stringify({\n relationships: serviceRelations,\n }),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/service_dependencies/disassociate`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service dependencies: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to remove service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to remove service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to remove service dependencies. Caller did not supply credentials or did not provide the correct credentials. If you are using an API key, it may be invalid or your Authorization header may be malformed.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to remove service dependencies. Caller is not authorized to view the requested resource. While your authentication is valid, the authenticated user or token does not have permission to perform this action.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to remove service dependencies. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n } catch (error) {\n throw new HttpError(\n `Failed to parse service dependency information: ${error}`,\n 500,\n );\n }\n}\n\nexport async function getServiceRelationshipsById(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyServiceDependency[]> {\n let response: Response;\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/service_dependencies/technical_services/${serviceId}`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service dependencies: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to list service dependencies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to list service dependencies. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to list service dependencies. Caller did not supply credentials or did not provide the correct credentials. If you are using an API key, it may be invalid or your Authorization header may be malformed.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to list service dependencies. Caller is not authorized to view the requested resource. While your authentication is valid, the authenticated user or token does not have permission to perform this action.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to list service dependencies. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceDependencyResponse;\n try {\n result = await response.json();\n\n return result.relationships;\n } catch (error) {\n throw new HttpError(\n `Failed to parse service dependency information: ${error}`,\n 500,\n );\n }\n}\n\nasync function getEscalationPolicies(\n offset: number,\n limit: number,\n account?: string,\n): Promise<[boolean, PagerDutyEscalationPolicy[]]> {\n let response: Response;\n const params = `total=true&sort_by=name&offset=${offset}&limit=${limit}`;\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/escalation_policies`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve escalation policies: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to list escalation policies. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to list escalation policies. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to list escalation policies. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to list escalation policies. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 429:\n throw new HttpError(\n 'Failed to list escalation policies. Rate limit exceeded.',\n 429,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyEscalationPoliciesResponse;\n try {\n result = (await response.json()) as PagerDutyEscalationPoliciesResponse;\n\n return [result.more ?? false, result.escalation_policies];\n } catch (error) {\n throw new HttpError(\n `Failed to parse escalation policy information: ${error}`,\n 500,\n );\n }\n}\n\nexport async function getAllEscalationPolicies(): Promise<\n PagerDutyEscalationPolicy[]\n> {\n const limit = 50;\n let offset = 0;\n let moreResults = false;\n let results: PagerDutyEscalationPolicy[] = [];\n\n await Promise.all(\n Object.keys(EndpointConfig).map(async account => {\n try {\n // reset offset value\n offset = 0;\n\n do {\n const res = await getEscalationPolicies(offset, limit, account);\n\n // set account for each escalation policy\n res[1].forEach(policy => {\n policy.account = account;\n });\n\n // update results\n results = results.concat(res[1]);\n\n // if more results exist\n if (res[0] === true) {\n moreResults = true;\n offset += limit;\n } else {\n moreResults = false;\n }\n } while (moreResults === true);\n } catch (error) {\n if (error instanceof HttpError) {\n throw error;\n } else {\n throw new HttpError(`${error}`, 500);\n }\n }\n }),\n );\n\n return results;\n}\n\nexport async function isEventNoiseReductionEnabled(\n account?: string,\n): Promise<boolean> {\n let response: Response;\n const baseUrl = 'https://api.pagerduty.com';\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n try {\n response = await fetchWithRetries(`${baseUrl}/abilities`, options);\n } catch (error) {\n throw new Error(`Failed to read abilities: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to read abilities. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 401:\n throw new Error(\n `Failed to read abilities. Caller did not supply credentials or did not provide the correct credentials.`,\n );\n case 403:\n throw new Error(\n `Failed to read abilities. Caller is not authorized to view the requested resource.`,\n );\n case 429:\n throw new Error(`Failed to read abilities. Rate limit exceeded.`);\n default: // 200\n break;\n }\n\n let result: PagerDutyAbilitiesResponse;\n try {\n result = (await response.json()) as PagerDutyAbilitiesResponse;\n\n if (\n result.abilities.includes('preview_intelligent_alert_grouping') &&\n result.abilities.includes('time_based_alert_grouping')\n ) {\n return true;\n }\n\n return false;\n } catch (error) {\n throw new Error(`Failed to parse abilities information: ${error}`);\n }\n}\n\nexport async function getOncallUsers(\n escalationPolicy: string,\n account?: string,\n): Promise<PagerDutyUser[]> {\n let response: Response;\n const params = `time_zone=UTC&include[]=users&escalation_policy_ids[]=${escalationPolicy}`;\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/oncalls`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve oncalls: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to list oncalls. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to list oncalls. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to list oncalls. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to list oncalls. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 429:\n throw new HttpError('Failed to list oncalls. Rate limit exceeded.', 429);\n default: // 200\n break;\n }\n\n let result: PagerDutyOnCallsResponse;\n let usersItem: PagerDutyUser[];\n try {\n result = (await response.json()) as PagerDutyOnCallsResponse;\n\n if (result.oncalls.length !== 0) {\n const oncallsSorted = [...result.oncalls].sort((a, b) => {\n return a.escalation_level - b.escalation_level;\n });\n\n const oncallsFiltered = oncallsSorted.filter(oncall => {\n return oncall.escalation_level === oncallsSorted[0].escalation_level;\n });\n\n usersItem = [...oncallsFiltered]\n .sort((a, b) => (a.user.name > b.user.name ? 1 : -1))\n .map(oncall => oncall.user);\n\n // remove duplicates from usersItem\n const uniqueUsers = new Map();\n usersItem.forEach(user => {\n uniqueUsers.set(user.id, user);\n });\n\n usersItem.length = 0;\n uniqueUsers.forEach(user => {\n usersItem.push(user);\n });\n\n return usersItem;\n }\n\n return [];\n } catch (error) {\n throw new HttpError(`Failed to parse oncall information: ${error}`, 500);\n }\n}\n\nexport async function getServiceById(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyService> {\n let response: Response;\n const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies`;\n\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetchWithRetries(\n `${baseUrl}/${serviceId}?${params}`,\n options,\n );\n } catch (error) {\n throw new Error(`Failed to retrieve service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get service. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to get service. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServiceResponse;\n try {\n result = (await response.json()) as PagerDutyServiceResponse;\n\n return result.service;\n } catch (error) {\n throw new HttpError(`Failed to parse service information: ${error}`, 500);\n }\n}\n\nexport async function getServiceByIntegrationKey(\n integrationKey: string,\n account?: string,\n): Promise<PagerDutyService> {\n let response: Response;\n const params = `query=${integrationKey}&time_zone=UTC&include[]=integrations&include[]=escalation_policies`;\n\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get service. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to get service. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyServicesResponse;\n try {\n result = (await response.json()) as PagerDutyServicesResponse;\n } catch (error) {\n throw new HttpError(`Failed to parse service information: ${error}`, 500);\n }\n\n if (result.services.length === 0) {\n throw new HttpError(\n `Failed to get service. The requested resource was not found.`,\n 404,\n );\n }\n\n return result.services[0];\n}\n\nexport async function getAllServices(): Promise<PagerDutyService[]> {\n const allServices: PagerDutyService[] = [];\n\n await Promise.all(\n Object.entries(EndpointConfig).map(async ([account, _]) => {\n let response: Response;\n const params = `time_zone=UTC&include[]=integrations&include[]=escalation_policies&include[]=teams&total=true`;\n\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n let offset = 0;\n const limit = 50;\n let result: PagerDutyServicesAPIResponse;\n\n try {\n do {\n const paginatedUrl = `${baseUrl}?${params}&offset=${offset}&limit=${limit}`;\n\n response = await fetchWithRetries(paginatedUrl, options);\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get services. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get services. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get services. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get services. Caller is not authorized to view the requested resource.',\n 403,\n );\n default: // 200\n break;\n }\n\n result = (await response.json()) as PagerDutyServicesAPIResponse;\n\n // 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(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyChangeEvent[]> {\n let response: Response;\n const params = `limit=5&time_zone=UTC&sort_by=timestamp`;\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n try {\n response = await fetchWithRetries(\n `${baseUrl}/${serviceId}/change_events?${params}`,\n options,\n );\n } catch (error) {\n throw new Error(`Failed to retrieve change events for service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get change events for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get change events for service. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get change events for service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get change events for service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 404:\n throw new HttpError(\n 'Failed to get change events for service. The requested resource was not found.',\n 404,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyChangeEventsResponse;\n try {\n result = (await response.json()) as PagerDutyChangeEventsResponse;\n\n return result.change_events;\n } catch (error) {\n throw new HttpError(\n `Failed to parse change events information: ${error}`,\n 500,\n );\n }\n}\n\nexport async function getIncidents(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyIncident[]> {\n let response: Response;\n const params = `time_zone=UTC&sort_by=created_at&statuses[]=triggered&statuses[]=acknowledged&service_ids[]=${serviceId}`;\n\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/incidents`;\n\n try {\n response = await fetchWithRetries(`${baseUrl}?${params}`, options);\n } catch (error) {\n throw new Error(`Failed to retrieve incidents for service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get incidents for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get incidents for service. Caller provided invalid arguments.',\n 400,\n );\n case 401:\n throw new HttpError(\n 'Failed to get incidents for service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 402:\n throw new HttpError(\n 'Failed to get incidents for service. Account does not have the abilities to perform the action. Please review the response for the required abilities.',\n 402,\n );\n case 403:\n throw new HttpError(\n 'Failed to get incidents for service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 429:\n throw new HttpError(\n 'Failed to get incidents for service. Too many requests have been made, the rate limit has been reached.',\n 429,\n );\n default: // 200\n break;\n }\n\n let result: PagerDutyIncidentsResponse;\n try {\n result = (await response.json()) as PagerDutyIncidentsResponse;\n\n return result.incidents;\n } catch (error) {\n throw new HttpError(`Failed to parse incidents information: ${error}`, 500);\n }\n}\n\nexport async function getServiceStandards(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyServiceStandards> {\n let response: Response;\n\n const options: RequestInit = {\n method: 'GET',\n headers: await getDefaultHeaders(account),\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/standards/scores/technical_services/${serviceId}`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(\n `Failed to retrieve service standards for service: ${error}`,\n );\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get service standards for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 401:\n throw new HttpError(\n 'Failed to get service standards for service. Caller did not supply credentials or did not provide the correct credentials.',\n 401,\n );\n case 403:\n throw new HttpError(\n 'Failed to get service standards for service. Caller is not authorized to view the requested resource.',\n 403,\n );\n case 429:\n throw new HttpError(\n 'Failed to get service standards for service. Too many requests have been made, the rate limit has been reached.',\n 429,\n );\n default: // 200\n break;\n }\n\n try {\n const result = await response.json();\n return result;\n } catch (error) {\n throw new HttpError(\n `Failed to parse service standards information: ${error}`,\n 500,\n );\n }\n}\n\nexport async function getServiceMetrics(\n serviceId: string,\n account?: string,\n): Promise<PagerDutyServiceMetrics[]> {\n let response: Response;\n\n const endDate = DateTime.now();\n const startDate = endDate.minus({ days: 30 });\n const body = JSON.stringify({\n filters: {\n created_at_start: startDate.toISO(),\n created_at_end: endDate.toISO(),\n service_ids: [serviceId],\n },\n });\n\n const options: RequestInit = {\n method: 'POST',\n headers: await getDefaultHeaders(account),\n body: body,\n };\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/analytics/metrics/incidents/services`;\n\n try {\n response = await fetchWithRetries(baseUrl, options);\n } catch (error) {\n throw new Error(`Failed to retrieve service metrics for service: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new HttpError(\n `Failed to get service metrics for service. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n response.status,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new HttpError(\n 'Failed to get service metrics for service. Caller provided invalid arguments. Please review the response for error details. Retrying with the same arguments will not work.',\n 400,\n );\n case 429:\n throw new HttpError(\n 'Failed to get service metrics for service. Too many requests have been made, the rate limit has been reached.',\n 429,\n );\n default: // 200\n break;\n }\n\n try {\n const result = await response.json();\n\n return result.data;\n } catch (error) {\n throw new HttpError(\n `Failed to parse service metrics information: ${error}`,\n 500,\n );\n }\n}\n\nexport type CreateServiceIntegrationProps = {\n serviceId: string;\n vendorId: string;\n account?: string;\n};\n\nexport async function createServiceIntegration({\n serviceId,\n vendorId,\n account,\n}: CreateServiceIntegrationProps): Promise<string> {\n let response: Response;\n\n const apiBaseUrl = getApiBaseUrl(account);\n const baseUrl = `${apiBaseUrl}/services`;\n\n const options: RequestInit = {\n method: 'POST',\n body: JSON.stringify({\n integration: {\n name: 'Backstage',\n service: {\n id: serviceId,\n type: 'service_reference',\n },\n vendor: {\n id: vendorId,\n type: 'vendor_reference',\n },\n },\n }),\n headers: await getDefaultHeaders(account),\n };\n\n try {\n response = await fetchWithRetries(\n `${baseUrl}/${serviceId}/integrations`,\n options,\n );\n } catch (error) {\n throw new Error(`Failed to create service integration: ${error}`);\n }\n\n if (response.status >= 500) {\n throw new Error(\n `Failed to create service integration. PagerDuty API returned a server error. Retrying with the same arguments will not work.`,\n );\n }\n\n switch (response.status) {\n case 400:\n throw new Error(\n `Failed to create service integration. Caller provided invalid arguments.`,\n );\n case 401:\n throw new Error(\n `Failed to create service integration. Caller did not supply credentials or did not provide the correct credentials.`,\n );\n case 403:\n throw new Error(\n `Failed to create service integration. Caller is not authorized to view the requested resource.`,\n );\n case 429:\n throw new Error(\n `Failed to create service integration. Rate limit exceeded.`,\n );\n default: // 201\n break;\n }\n\n let result: PagerDutyIntegrationResponse;\n try {\n result = (await response.json()) as PagerDutyIntegrationResponse;\n\n return result.integration.integration_key ?? '';\n } catch (error) {\n throw new Error(`Failed to parse service information: ${error}`);\n }\n}\n\nexport async function fetchWithRetries(\n url: string,\n options: RequestInit,\n): Promise<Response> {\n let response: Response;\n let error: Error = new Error();\n\n // set retry parameters\n const maxRetries = 5;\n const delay = 1000;\n let factor = 2;\n\n for (let i = 0; i < maxRetries; i++) {\n try {\n response = await fetch(url, options);\n return response;\n } catch (e) {\n error = e as Error;\n }\n\n const timeout = delay * factor;\n await new Promise(resolve => setTimeout(resolve, timeout));\n factor *= 2;\n }\n\n throw new Error(\n `Failed to fetch data after ${maxRetries} retries. Last error: ${error}`,\n );\n}\n"],"names":["getAuthToken","HttpError","DateTime","fetch"],"mappings":"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"}