@camunda/ccma-api 0.5.0 → 0.5.2
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/dist/index.d.ts +11 -3
- package/dist/index.js +14 -0
- package/dist/index.js.map +2 -2
- package/dist/services/accounts/hdp.service.d.ts +14 -1
- package/dist/services/accounts/hdp.service.js +41 -0
- package/dist/services/accounts/hdp.service.js.map +2 -2
- package/dist/services/accounts/orgs.service.d.ts +28 -0
- package/dist/services/accounts/orgs.service.js +41 -1
- package/dist/services/accounts/orgs.service.js.map +2 -2
- package/dist/services/accounts/orgs.service.spec.d.ts +1 -0
- package/dist/services/accounts/queued-operations.service.d.ts +59 -0
- package/dist/services/accounts/queued-operations.service.js +49 -0
- package/dist/services/accounts/queued-operations.service.js.map +7 -0
- package/dist/services/accounts/telemetry-ingest.service.d.ts +32 -0
- package/dist/services/accounts/telemetry-ingest.service.js +41 -0
- package/dist/services/accounts/telemetry-ingest.service.js.map +7 -0
- package/dist/services/accounts/trial-management.service.d.ts +27 -0
- package/dist/services/accounts/trial-management.service.js +101 -0
- package/dist/services/accounts/trial-management.service.js.map +7 -0
- package/dist/services/audit-logger/audit-logger.service.js +10 -1
- package/dist/services/audit-logger/audit-logger.service.js.map +2 -2
- package/dist/services/audit-logger/audit-logger.service.spec.d.ts +1 -0
- package/dist/services/auth0/auth0.service.d.ts +7 -0
- package/dist/services/auth0/auth0.service.js +2 -1
- package/dist/services/auth0/auth0.service.js.map +2 -2
- package/dist/services/auth0/auth0.service.spec.d.ts +1 -0
- package/dist/services/console/console.admin.service.js +13 -2
- package/dist/services/console/console.admin.service.js.map +2 -2
- package/dist/services/console/console.admin.service.spec.d.ts +1 -0
- package/dist/services/console/console.cluster.service.d.ts +9 -0
- package/dist/services/console/console.cluster.service.js +7 -0
- package/dist/services/console/console.cluster.service.js.map +2 -2
- package/dist/services/console/generation.service.d.ts +21 -1
- package/dist/services/console/generation.service.js +9 -0
- package/dist/services/console/generation.service.js.map +2 -2
- package/dist/services/github/github.service.d.ts +1 -0
- package/dist/services/github/github.service.js +32 -22
- package/dist/services/github/github.service.js.map +2 -2
- package/dist/services/github/github.service.spec.d.ts +1 -0
- package/dist/services/thanos/thanos.service.d.ts +49 -0
- package/dist/services/thanos/thanos.service.js +60 -0
- package/dist/services/thanos/thanos.service.js.map +7 -0
- package/dist/services/thanos/thanos.service.spec.d.ts +1 -0
- package/dist/services/token-issuer/token-issuer.jwks.service.js +5 -1
- package/dist/services/token-issuer/token-issuer.jwks.service.js.map +2 -2
- package/dist/services/token-issuer/token-issuer.jwks.service.spec.d.ts +1 -0
- package/dist/utils/api.js +8 -0
- package/dist/utils/api.js.map +2 -2
- package/dist/utils/cache.d.ts +24 -0
- package/dist/utils/cache.js +41 -0
- package/dist/utils/cache.js.map +2 -2
- package/dist/utils/cache.spec.d.ts +1 -0
- package/dist/utils/traceparent.d.ts +21 -1
- package/dist/utils/traceparent.js +14 -0
- package/dist/utils/traceparent.js.map +2 -2
- package/package.json +2 -2
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { request } from "../../utils/api.js";
|
|
2
|
+
import { HttpError } from "../../utils/errors.js";
|
|
3
|
+
class TrialManagementService {
|
|
4
|
+
static async get(params) {
|
|
5
|
+
const url = params.params.refresh ? `api/admin/trial-management?refresh=true` : `api/admin/trial-management`;
|
|
6
|
+
const serviceContext = {
|
|
7
|
+
method: {
|
|
8
|
+
name: `TrialManagementService.get`,
|
|
9
|
+
url,
|
|
10
|
+
normalizedUrl: `api/admin/trial-management`,
|
|
11
|
+
type: "get"
|
|
12
|
+
},
|
|
13
|
+
source: params.config.metrics?.source || "unset",
|
|
14
|
+
target: { name: "accounts", type: "internal" }
|
|
15
|
+
};
|
|
16
|
+
const response = await request({
|
|
17
|
+
...params,
|
|
18
|
+
base: { id: "accounts" },
|
|
19
|
+
url: serviceContext.method.url,
|
|
20
|
+
method: serviceContext.method.type,
|
|
21
|
+
metricsDetails: serviceContext
|
|
22
|
+
});
|
|
23
|
+
if (!response.ok) {
|
|
24
|
+
throw new HttpError(
|
|
25
|
+
`${serviceContext.method.name}: ${response.status} ${response.statusText}`,
|
|
26
|
+
response.status,
|
|
27
|
+
response.statusText
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
return response.body;
|
|
31
|
+
}
|
|
32
|
+
static async getOrgDetail(params) {
|
|
33
|
+
const serviceContext = {
|
|
34
|
+
method: {
|
|
35
|
+
name: `TrialManagementService.getOrgDetail`,
|
|
36
|
+
url: `api/admin/trial-management/orgs/${encodeURIComponent(params.params.orgId)}`,
|
|
37
|
+
normalizedUrl: `api/admin/trial-management/orgs/:orgId`,
|
|
38
|
+
type: "get"
|
|
39
|
+
},
|
|
40
|
+
source: params.config.metrics?.source || "unset",
|
|
41
|
+
target: { name: "accounts", type: "internal" }
|
|
42
|
+
};
|
|
43
|
+
const response = await request({
|
|
44
|
+
...params,
|
|
45
|
+
base: { id: "accounts" },
|
|
46
|
+
url: serviceContext.method.url,
|
|
47
|
+
method: serviceContext.method.type,
|
|
48
|
+
metricsDetails: serviceContext
|
|
49
|
+
});
|
|
50
|
+
if (!response.ok) {
|
|
51
|
+
throw new HttpError(
|
|
52
|
+
`${serviceContext.method.name}: ${response.status} ${response.statusText}`,
|
|
53
|
+
response.status,
|
|
54
|
+
response.statusText
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
return response.body;
|
|
58
|
+
}
|
|
59
|
+
static async getOrgs(params) {
|
|
60
|
+
const queryParams = new URLSearchParams({
|
|
61
|
+
page: String(params.params.page),
|
|
62
|
+
pageSize: String(params.params.pageSize)
|
|
63
|
+
});
|
|
64
|
+
for (const filter of params.params.surveyAnswers ?? []) {
|
|
65
|
+
queryParams.append(
|
|
66
|
+
"surveyAnswers",
|
|
67
|
+
`${filter.questionId}:${filter.value}`
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
const url = `api/admin/trial-management/orgs?${queryParams.toString()}`;
|
|
71
|
+
const serviceContext = {
|
|
72
|
+
method: {
|
|
73
|
+
name: `TrialManagementService.getOrgs`,
|
|
74
|
+
url,
|
|
75
|
+
normalizedUrl: `api/admin/trial-management/orgs`,
|
|
76
|
+
type: "get"
|
|
77
|
+
},
|
|
78
|
+
source: params.config.metrics?.source || "unset",
|
|
79
|
+
target: { name: "accounts", type: "internal" }
|
|
80
|
+
};
|
|
81
|
+
const response = await request({
|
|
82
|
+
...params,
|
|
83
|
+
base: { id: "accounts" },
|
|
84
|
+
url: serviceContext.method.url,
|
|
85
|
+
method: serviceContext.method.type,
|
|
86
|
+
metricsDetails: serviceContext
|
|
87
|
+
});
|
|
88
|
+
if (!response.ok) {
|
|
89
|
+
throw new HttpError(
|
|
90
|
+
`${serviceContext.method.name}: ${response.status} ${response.statusText}`,
|
|
91
|
+
response.status,
|
|
92
|
+
response.statusText
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
return response.body;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
export {
|
|
99
|
+
TrialManagementService
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=trial-management.service.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/services/accounts/trial-management.service.ts"],
|
|
4
|
+
"sourcesContent": ["/*\n * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH\n * under one or more contributor license agreements. Licensed under a commercial license.\n * You may not use this file except in compliance with the commercial license.\n */\n\nimport type {\n ExtensionListResponse,\n OrgTrialDetail,\n TrialManagementStats,\n} from '@camunda/ccma-shared-types'\nimport type {\n RequestBaseParams,\n RequestBaseServiceContext,\n} from '../../types/general.types.js'\nimport { request } from '../../utils/api.js'\nimport { HttpError } from '../../utils/errors.js'\n\nexport interface GetTrialManagementParams extends RequestBaseParams {\n params: {\n refresh?: boolean\n }\n}\n\nexport interface GetOrgTrialDetailParams extends RequestBaseParams {\n params: {\n orgId: string\n }\n}\n\nexport interface GetTrialManagementOrgsParams extends RequestBaseParams {\n params: {\n page: number\n pageSize: number\n surveyAnswers?: Array<{ questionId: string; value: string }>\n }\n}\n\nexport class TrialManagementService {\n public static async get(\n params: GetTrialManagementParams,\n ): Promise<TrialManagementStats> {\n const url = params.params.refresh\n ? `api/admin/trial-management?refresh=true`\n : `api/admin/trial-management`\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `TrialManagementService.get`,\n url,\n normalizedUrl: `api/admin/trial-management`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'accounts', type: 'internal' },\n }\n const response = await request<TrialManagementStats>({\n ...params,\n base: { id: 'accounts' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n\n public static async getOrgDetail(\n params: GetOrgTrialDetailParams,\n ): Promise<OrgTrialDetail> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `TrialManagementService.getOrgDetail`,\n url: `api/admin/trial-management/orgs/${encodeURIComponent(params.params.orgId)}`,\n normalizedUrl: `api/admin/trial-management/orgs/:orgId`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'accounts', type: 'internal' },\n }\n const response = await request<OrgTrialDetail>({\n ...params,\n base: { id: 'accounts' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n\n public static async getOrgs(\n params: GetTrialManagementOrgsParams,\n ): Promise<ExtensionListResponse> {\n const queryParams = new URLSearchParams({\n page: String(params.params.page),\n pageSize: String(params.params.pageSize),\n })\n for (const filter of params.params.surveyAnswers ?? []) {\n queryParams.append(\n 'surveyAnswers',\n `${filter.questionId}:${filter.value}`,\n )\n }\n const url = `api/admin/trial-management/orgs?${queryParams.toString()}`\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `TrialManagementService.getOrgs`,\n url,\n normalizedUrl: `api/admin/trial-management/orgs`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'accounts', type: 'internal' },\n }\n const response = await request<ExtensionListResponse>({\n ...params,\n base: { id: 'accounts' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n}\n"],
|
|
5
|
+
"mappings": "AAeA,SAAS,eAAe;AACxB,SAAS,iBAAiB;AAsBnB,MAAM,uBAAuB;AAAA,EAClC,aAAoB,IAClB,QAC+B;AAC/B,UAAM,MAAM,OAAO,OAAO,UACtB,4CACA;AACJ,UAAM,iBAA4C;AAAA,MAChD,QAAQ;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA,eAAe;AAAA,QACf,MAAM;AAAA,MACR;AAAA,MACA,QAAQ,OAAO,OAAO,SAAS,UAAU;AAAA,MACzC,QAAQ,EAAE,MAAM,YAAY,MAAM,WAAW;AAAA,IAC/C;AACA,UAAM,WAAW,MAAM,QAA8B;AAAA,MACnD,GAAG;AAAA,MACH,MAAM,EAAE,IAAI,WAAW;AAAA,MACvB,KAAK,eAAe,OAAO;AAAA,MAC3B,QAAQ,eAAe,OAAO;AAAA,MAC9B,gBAAgB;AAAA,IAClB,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,GAAG,eAAe,OAAO,IAAI,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,QACxE,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AACA,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,aAAoB,aAClB,QACyB;AACzB,UAAM,iBAA4C;AAAA,MAChD,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,KAAK,mCAAmC,mBAAmB,OAAO,OAAO,KAAK,CAAC;AAAA,QAC/E,eAAe;AAAA,QACf,MAAM;AAAA,MACR;AAAA,MACA,QAAQ,OAAO,OAAO,SAAS,UAAU;AAAA,MACzC,QAAQ,EAAE,MAAM,YAAY,MAAM,WAAW;AAAA,IAC/C;AACA,UAAM,WAAW,MAAM,QAAwB;AAAA,MAC7C,GAAG;AAAA,MACH,MAAM,EAAE,IAAI,WAAW;AAAA,MACvB,KAAK,eAAe,OAAO;AAAA,MAC3B,QAAQ,eAAe,OAAO;AAAA,MAC9B,gBAAgB;AAAA,IAClB,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,GAAG,eAAe,OAAO,IAAI,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,QACxE,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AACA,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,aAAoB,QAClB,QACgC;AAChC,UAAM,cAAc,IAAI,gBAAgB;AAAA,MACtC,MAAM,OAAO,OAAO,OAAO,IAAI;AAAA,MAC/B,UAAU,OAAO,OAAO,OAAO,QAAQ;AAAA,IACzC,CAAC;AACD,eAAW,UAAU,OAAO,OAAO,iBAAiB,CAAC,GAAG;AACtD,kBAAY;AAAA,QACV;AAAA,QACA,GAAG,OAAO,UAAU,IAAI,OAAO,KAAK;AAAA,MACtC;AAAA,IACF;AACA,UAAM,MAAM,mCAAmC,YAAY,SAAS,CAAC;AACrE,UAAM,iBAA4C;AAAA,MAChD,QAAQ;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA,eAAe;AAAA,QACf,MAAM;AAAA,MACR;AAAA,MACA,QAAQ,OAAO,OAAO,SAAS,UAAU;AAAA,MACzC,QAAQ,EAAE,MAAM,YAAY,MAAM,WAAW;AAAA,IAC/C;AACA,UAAM,WAAW,MAAM,QAA+B;AAAA,MACpD,GAAG;AAAA,MACH,MAAM,EAAE,IAAI,WAAW;AAAA,MACvB,KAAK,eAAe,OAAO;AAAA,MAC3B,QAAQ,eAAe,OAAO;AAAA,MAC9B,gBAAgB;AAAA,IAClB,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,GAAG,eAAe,OAAO,IAAI,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,QACxE,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AACA,WAAO,SAAS;AAAA,EAClB;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -22,7 +22,16 @@ class AuditLoggerService {
|
|
|
22
22
|
method: serviceContext.method.type,
|
|
23
23
|
metricsDetails: serviceContext,
|
|
24
24
|
body: params.params,
|
|
25
|
-
responseType: "none"
|
|
25
|
+
responseType: "none",
|
|
26
|
+
// AuditController.add is fire-and-forget: it logs the failure and
|
|
27
|
+
// returns, so a dropped connection silently loses a long-retention
|
|
28
|
+
// record. The observed loss was 11 audits inside 19ms — one
|
|
29
|
+
// connection-pool/envoy hangup during a pod restart, not an outage —
|
|
30
|
+
// which this retry absorbs entirely. Safe enough to retry deliberately:
|
|
31
|
+
// `Audit` has no idempotency key, so a request that landed but whose
|
|
32
|
+
// response was lost can produce a duplicate row. A duplicate audit entry
|
|
33
|
+
// is visible and harmless; a missing one is a gap in the trail.
|
|
34
|
+
retryTransientErrors: true
|
|
26
35
|
});
|
|
27
36
|
if (!response.ok) {
|
|
28
37
|
throw new HttpError(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/services/audit-logger/audit-logger.service.ts"],
|
|
4
|
-
"sourcesContent": ["/*\n * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH\n * under one or more contributor license agreements. Licensed under a commercial license.\n * You may not use this file except in compliance with the commercial license.\n */\n\nimport type { AuditDto } from '@camunda/ccma-shared-types'\nimport type {\n RequestBaseParams,\n RequestBaseServiceContext,\n} from '../../types/general.types.js'\nimport { request } from '../../utils/api.js'\nimport { HttpError } from '../../utils/errors.js'\n\nexport interface AddAuditRequest extends RequestBaseParams {\n params: {\n audit: AuditDto\n }\n}\n\nexport interface GetAuditRequest extends RequestBaseParams {\n params: {\n orgId: string\n pagination?: {\n page: number\n perPage: number\n }\n publicOnly?: boolean\n }\n}\n\nexport interface GetClusterAuditRequest extends RequestBaseParams {\n params: {\n orgId: string\n clusterId: string\n }\n}\n\nexport class AuditLoggerService {\n public static async addAudit(params: AddAuditRequest): Promise<boolean> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `AuditLoggerService.addAudit`,\n url: `api/audit/orgs`,\n normalizedUrl: `api/audit/orgs`,\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'audit-logger',\n type: 'internal',\n },\n }\n const response = await request({\n config: params.config,\n base: { id: 'audit-logger' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params,\n responseType: 'none',\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.status === 200\n }\n\n public static async getAudit(params: GetAuditRequest): Promise<AuditDto[]> {\n let url = `api/audit/orgs/${params.params.orgId}`\n const queryParams: string[] = []\n if (params.params.pagination) {\n queryParams.push(\n `per_page=${params.params.pagination.perPage}&page=${params.params.pagination.page}`,\n )\n }\n if (params.params.publicOnly) {\n queryParams.push(`public_only=true`)\n }\n if (queryParams.length > 0) {\n url = url.concat(`?${queryParams.join('&')}`)\n }\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `AuditLoggerService.getAudit`,\n url,\n normalizedUrl: url,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'audit-logger',\n type: 'internal',\n },\n }\n const response = await request({\n ...params,\n base: { id: 'audit-logger' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n responseType: 'json',\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body as AuditDto[]\n }\n\n public static async getClusterAudit(\n params: GetClusterAuditRequest,\n ): Promise<AuditDto[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `AuditLoggerService.getClusterAudit`,\n url: `api/audit/orgs/${params.params.orgId}/cluster/${params.params.clusterId}`,\n normalizedUrl: `api/audit/orgs/:orgId/cluster/:clusterId`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'audit-logger',\n type: 'internal',\n },\n }\n\n const response = await request<AuditDto[]>({\n ...params,\n base: { id: 'audit-logger' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n responseType: 'json',\n })\n\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n\n return response.body ?? []\n }\n}\n"],
|
|
5
|
-
"mappings": "AAWA,SAAS,eAAe;AACxB,SAAS,iBAAiB;AA0BnB,MAAM,mBAAmB;AAAA,EAC9B,aAAoB,SAAS,QAA2C;AACtE,UAAM,iBAA4C;AAAA,MAChD,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,KAAK;AAAA,QACL,eAAe;AAAA,QACf,MAAM;AAAA,MACR;AAAA,MACA,QAAQ,OAAO,OAAO,SAAS,UAAU;AAAA,MACzC,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AACA,UAAM,WAAW,MAAM,QAAQ;AAAA,MAC7B,QAAQ,OAAO;AAAA,MACf,MAAM,EAAE,IAAI,eAAe;AAAA,MAC3B,KAAK,eAAe,OAAO;AAAA,MAC3B,QAAQ,eAAe,OAAO;AAAA,MAC9B,gBAAgB;AAAA,MAChB,MAAM,OAAO;AAAA,MACb,cAAc;AAAA,
|
|
4
|
+
"sourcesContent": ["/*\n * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH\n * under one or more contributor license agreements. Licensed under a commercial license.\n * You may not use this file except in compliance with the commercial license.\n */\n\nimport type { AuditDto } from '@camunda/ccma-shared-types'\nimport type {\n RequestBaseParams,\n RequestBaseServiceContext,\n} from '../../types/general.types.js'\nimport { request } from '../../utils/api.js'\nimport { HttpError } from '../../utils/errors.js'\n\nexport interface AddAuditRequest extends RequestBaseParams {\n params: {\n audit: AuditDto\n }\n}\n\nexport interface GetAuditRequest extends RequestBaseParams {\n params: {\n orgId: string\n pagination?: {\n page: number\n perPage: number\n }\n publicOnly?: boolean\n }\n}\n\nexport interface GetClusterAuditRequest extends RequestBaseParams {\n params: {\n orgId: string\n clusterId: string\n }\n}\n\nexport class AuditLoggerService {\n public static async addAudit(params: AddAuditRequest): Promise<boolean> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `AuditLoggerService.addAudit`,\n url: `api/audit/orgs`,\n normalizedUrl: `api/audit/orgs`,\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'audit-logger',\n type: 'internal',\n },\n }\n const response = await request({\n config: params.config,\n base: { id: 'audit-logger' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params,\n responseType: 'none',\n // AuditController.add is fire-and-forget: it logs the failure and\n // returns, so a dropped connection silently loses a long-retention\n // record. The observed loss was 11 audits inside 19ms \u2014 one\n // connection-pool/envoy hangup during a pod restart, not an outage \u2014\n // which this retry absorbs entirely. Safe enough to retry deliberately:\n // `Audit` has no idempotency key, so a request that landed but whose\n // response was lost can produce a duplicate row. A duplicate audit entry\n // is visible and harmless; a missing one is a gap in the trail.\n retryTransientErrors: true,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.status === 200\n }\n\n public static async getAudit(params: GetAuditRequest): Promise<AuditDto[]> {\n let url = `api/audit/orgs/${params.params.orgId}`\n const queryParams: string[] = []\n if (params.params.pagination) {\n queryParams.push(\n `per_page=${params.params.pagination.perPage}&page=${params.params.pagination.page}`,\n )\n }\n if (params.params.publicOnly) {\n queryParams.push(`public_only=true`)\n }\n if (queryParams.length > 0) {\n url = url.concat(`?${queryParams.join('&')}`)\n }\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `AuditLoggerService.getAudit`,\n url,\n normalizedUrl: url,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'audit-logger',\n type: 'internal',\n },\n }\n const response = await request({\n ...params,\n base: { id: 'audit-logger' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n responseType: 'json',\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body as AuditDto[]\n }\n\n public static async getClusterAudit(\n params: GetClusterAuditRequest,\n ): Promise<AuditDto[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `AuditLoggerService.getClusterAudit`,\n url: `api/audit/orgs/${params.params.orgId}/cluster/${params.params.clusterId}`,\n normalizedUrl: `api/audit/orgs/:orgId/cluster/:clusterId`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'audit-logger',\n type: 'internal',\n },\n }\n\n const response = await request<AuditDto[]>({\n ...params,\n base: { id: 'audit-logger' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n responseType: 'json',\n })\n\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n\n return response.body ?? []\n }\n}\n"],
|
|
5
|
+
"mappings": "AAWA,SAAS,eAAe;AACxB,SAAS,iBAAiB;AA0BnB,MAAM,mBAAmB;AAAA,EAC9B,aAAoB,SAAS,QAA2C;AACtE,UAAM,iBAA4C;AAAA,MAChD,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,KAAK;AAAA,QACL,eAAe;AAAA,QACf,MAAM;AAAA,MACR;AAAA,MACA,QAAQ,OAAO,OAAO,SAAS,UAAU;AAAA,MACzC,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AACA,UAAM,WAAW,MAAM,QAAQ;AAAA,MAC7B,QAAQ,OAAO;AAAA,MACf,MAAM,EAAE,IAAI,eAAe;AAAA,MAC3B,KAAK,eAAe,OAAO;AAAA,MAC3B,QAAQ,eAAe,OAAO;AAAA,MAC9B,gBAAgB;AAAA,MAChB,MAAM,OAAO;AAAA,MACb,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASd,sBAAsB;AAAA,IACxB,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,GAAG,eAAe,OAAO,IAAI,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,QACxE,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AACA,WAAO,SAAS,WAAW;AAAA,EAC7B;AAAA,EAEA,aAAoB,SAAS,QAA8C;AACzE,QAAI,MAAM,kBAAkB,OAAO,OAAO,KAAK;AAC/C,UAAM,cAAwB,CAAC;AAC/B,QAAI,OAAO,OAAO,YAAY;AAC5B,kBAAY;AAAA,QACV,YAAY,OAAO,OAAO,WAAW,OAAO,SAAS,OAAO,OAAO,WAAW,IAAI;AAAA,MACpF;AAAA,IACF;AACA,QAAI,OAAO,OAAO,YAAY;AAC5B,kBAAY,KAAK,kBAAkB;AAAA,IACrC;AACA,QAAI,YAAY,SAAS,GAAG;AAC1B,YAAM,IAAI,OAAO,IAAI,YAAY,KAAK,GAAG,CAAC,EAAE;AAAA,IAC9C;AACA,UAAM,iBAA4C;AAAA,MAChD,QAAQ;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA,eAAe;AAAA,QACf,MAAM;AAAA,MACR;AAAA,MACA,QAAQ,OAAO,OAAO,SAAS,UAAU;AAAA,MACzC,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AACA,UAAM,WAAW,MAAM,QAAQ;AAAA,MAC7B,GAAG;AAAA,MACH,MAAM,EAAE,IAAI,eAAe;AAAA,MAC3B,KAAK,eAAe,OAAO;AAAA,MAC3B,QAAQ,eAAe,OAAO;AAAA,MAC9B,gBAAgB;AAAA,MAChB,cAAc;AAAA,IAChB,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,GAAG,eAAe,OAAO,IAAI,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,QACxE,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AACA,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,aAAoB,gBAClB,QACqB;AACrB,UAAM,iBAA4C;AAAA,MAChD,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,KAAK,kBAAkB,OAAO,OAAO,KAAK,YAAY,OAAO,OAAO,SAAS;AAAA,QAC7E,eAAe;AAAA,QACf,MAAM;AAAA,MACR;AAAA,MACA,QAAQ,OAAO,OAAO,SAAS,UAAU;AAAA,MACzC,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,QAAoB;AAAA,MACzC,GAAG;AAAA,MACH,MAAM,EAAE,IAAI,eAAe;AAAA,MAC3B,KAAK,eAAe,OAAO;AAAA,MAC3B,QAAQ,eAAe,OAAO;AAAA,MAC9B,gBAAgB;AAAA,MAChB,cAAc;AAAA,IAChB,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,GAAG,eAAe,OAAO,IAAI,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,QACxE,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO,SAAS,QAAQ,CAAC;AAAA,EAC3B;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -9,6 +9,13 @@ export interface Auth0Request extends RequestBaseParams {
|
|
|
9
9
|
};
|
|
10
10
|
body?: any;
|
|
11
11
|
};
|
|
12
|
+
/**
|
|
13
|
+
* Opt-in transient retry (see `request()`). Auth0 is `external`, so it never
|
|
14
|
+
* receives our correlation headers, but a rejected fetch to it is still just
|
|
15
|
+
* a network blip — and an unretried one costs a user-visible 500. Only set it
|
|
16
|
+
* for idempotent calls; a retried POST may create twice.
|
|
17
|
+
*/
|
|
18
|
+
retryTransientErrors?: boolean;
|
|
12
19
|
}
|
|
13
20
|
export declare class Auth0Service {
|
|
14
21
|
static request(params: Auth0Request): Promise<any>;
|
|
@@ -22,7 +22,8 @@ class Auth0Service {
|
|
|
22
22
|
metricsDetails: serviceContext,
|
|
23
23
|
headers: params.options.headers,
|
|
24
24
|
body: params.options.body,
|
|
25
|
-
type: "json"
|
|
25
|
+
type: "json",
|
|
26
|
+
retryTransientErrors: params.retryTransientErrors
|
|
26
27
|
});
|
|
27
28
|
if (!response.ok) {
|
|
28
29
|
throw new HttpError(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/services/auth0/auth0.service.ts"],
|
|
4
|
-
"sourcesContent": ["/*\n * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH\n * under one or more contributor license agreements. Licensed under a commercial license.\n * You may not use this file except in compliance with the commercial license.\n */\n\nimport type {\n RequestBaseMethodType,\n RequestBaseParams,\n RequestBaseServiceContext,\n} from '../../types/general.types.js'\nimport { request } from '../../utils/api.js'\nimport { HttpError } from '../../utils/errors.js'\n\nexport interface Auth0Request extends RequestBaseParams {\n options: {\n url: string\n normalizedUrl: string\n method: RequestBaseMethodType\n headers: { [key: string]: string }\n body?: any\n }\n}\n\nexport class Auth0Service {\n public static async request(params: Auth0Request): Promise<any> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `Auth0Service.request`,\n url: params.options.url,\n normalizedUrl: params.options.normalizedUrl,\n type: params.options.method,\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'auth0',\n type: 'external',\n },\n }\n\n const response = await request<any[]>({\n config: params.config,\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n headers: params.options.headers,\n body: params.options.body,\n type: 'json',\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body\n }\n}\n"],
|
|
5
|
-
"mappings": "AAWA,SAAS,eAAe;AACxB,SAAS,iBAAiB;
|
|
4
|
+
"sourcesContent": ["/*\n * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH\n * under one or more contributor license agreements. Licensed under a commercial license.\n * You may not use this file except in compliance with the commercial license.\n */\n\nimport type {\n RequestBaseMethodType,\n RequestBaseParams,\n RequestBaseServiceContext,\n} from '../../types/general.types.js'\nimport { request } from '../../utils/api.js'\nimport { HttpError } from '../../utils/errors.js'\n\nexport interface Auth0Request extends RequestBaseParams {\n options: {\n url: string\n normalizedUrl: string\n method: RequestBaseMethodType\n headers: { [key: string]: string }\n body?: any\n }\n /**\n * Opt-in transient retry (see `request()`). Auth0 is `external`, so it never\n * receives our correlation headers, but a rejected fetch to it is still just\n * a network blip \u2014 and an unretried one costs a user-visible 500. Only set it\n * for idempotent calls; a retried POST may create twice.\n */\n retryTransientErrors?: boolean\n}\n\nexport class Auth0Service {\n public static async request(params: Auth0Request): Promise<any> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `Auth0Service.request`,\n url: params.options.url,\n normalizedUrl: params.options.normalizedUrl,\n type: params.options.method,\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'auth0',\n type: 'external',\n },\n }\n\n const response = await request<any[]>({\n config: params.config,\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n headers: params.options.headers,\n body: params.options.body,\n type: 'json',\n retryTransientErrors: params.retryTransientErrors,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body\n }\n}\n"],
|
|
5
|
+
"mappings": "AAWA,SAAS,eAAe;AACxB,SAAS,iBAAiB;AAmBnB,MAAM,aAAa;AAAA,EACxB,aAAoB,QAAQ,QAAoC;AAC9D,UAAM,iBAA4C;AAAA,MAChD,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,KAAK,OAAO,QAAQ;AAAA,QACpB,eAAe,OAAO,QAAQ;AAAA,QAC9B,MAAM,OAAO,QAAQ;AAAA,MACvB;AAAA,MACA,QAAQ,OAAO,OAAO,SAAS,UAAU;AAAA,MACzC,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,QAAe;AAAA,MACpC,QAAQ,OAAO;AAAA,MACf,KAAK,eAAe,OAAO;AAAA,MAC3B,QAAQ,eAAe,OAAO;AAAA,MAC9B,gBAAgB;AAAA,MAChB,SAAS,OAAO,QAAQ;AAAA,MACxB,MAAM,OAAO,QAAQ;AAAA,MACrB,MAAM;AAAA,MACN,sBAAsB,OAAO;AAAA,IAC/B,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,GAAG,eAAe,OAAO,IAAI,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,QACxE,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AACA,WAAO,SAAS;AAAA,EAClB;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -285,7 +285,13 @@ class ConsoleAdminService {
|
|
|
285
285
|
headers: params.params.headers,
|
|
286
286
|
url: serviceContext.method.url,
|
|
287
287
|
method: serviceContext.method.type,
|
|
288
|
-
metricsDetails: serviceContext
|
|
288
|
+
metricsDetails: serviceContext,
|
|
289
|
+
// Read-only GET against console, so a replay has no side effects. Console
|
|
290
|
+
// rolling a pod answers with envoy's "upstream connect error or
|
|
291
|
+
// disconnect/reset before headers" 503, and without this opt-in that blip
|
|
292
|
+
// is reported as our failure — the same reason `OrgsService` and
|
|
293
|
+
// `NotificationsService` opt in.
|
|
294
|
+
retryTransientErrors: true
|
|
289
295
|
});
|
|
290
296
|
if (!response.ok) {
|
|
291
297
|
throw new HttpError(
|
|
@@ -318,7 +324,12 @@ class ConsoleAdminService {
|
|
|
318
324
|
headers: params.params.headers,
|
|
319
325
|
url: serviceContext.method.url,
|
|
320
326
|
method: serviceContext.method.type,
|
|
321
|
-
metricsDetails: serviceContext
|
|
327
|
+
metricsDetails: serviceContext,
|
|
328
|
+
// Same reasoning as `getClustersOfOrg` above, and it matters more here:
|
|
329
|
+
// `cron.cluster-plan-cache-refresh` is the main caller, so one envoy 503
|
|
330
|
+
// during a console rollout left the plan cache unrefreshed for a whole
|
|
331
|
+
// interval.
|
|
332
|
+
retryTransientErrors: true
|
|
322
333
|
});
|
|
323
334
|
if (!response.ok) {
|
|
324
335
|
throw new HttpError(
|