@camunda/ccma-api 3.1.0 → 4.0.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.
Files changed (44) hide show
  1. package/dist/index.d.ts +11 -7
  2. package/dist/index.js +4 -0
  3. package/dist/index.js.map +2 -2
  4. package/dist/services/accounts/approvals.m2m.service.d.ts +157 -0
  5. package/dist/services/accounts/approvals.m2m.service.js +226 -0
  6. package/dist/services/accounts/approvals.m2m.service.js.map +2 -2
  7. package/dist/services/accounts/hdp.service.d.ts +16 -3
  8. package/dist/services/accounts/hdp.service.js +45 -2
  9. package/dist/services/accounts/hdp.service.js.map +2 -2
  10. package/dist/services/console/console.approvals.m2m.service.d.ts +12 -1
  11. package/dist/services/console/console.approvals.m2m.service.js +31 -0
  12. package/dist/services/console/console.approvals.m2m.service.js.map +2 -2
  13. package/dist/services/control/control.approvals.service.d.ts +276 -0
  14. package/dist/services/control/control.approvals.service.js +155 -0
  15. package/dist/services/control/control.approvals.service.js.map +2 -2
  16. package/dist/services/control/control.dashboards.service.d.ts +76 -0
  17. package/dist/services/control/control.dashboards.service.js +180 -0
  18. package/dist/services/control/control.dashboards.service.js.map +7 -0
  19. package/dist/services/control/control.dashboards.service.spec.d.ts +1 -0
  20. package/dist/services/control/control.feature-flags.service.d.ts +53 -0
  21. package/dist/services/control/control.feature-flags.service.js +123 -0
  22. package/dist/services/control/control.feature-flags.service.js.map +7 -0
  23. package/dist/services/control/control.feature-flags.service.spec.d.ts +1 -0
  24. package/dist/services/control/control.platform.service.d.ts +14 -0
  25. package/dist/services/control/control.platform.service.js +27 -0
  26. package/dist/services/control/control.platform.service.js.map +2 -2
  27. package/dist/services/control/control.platform.service.spec.d.ts +1 -0
  28. package/dist/services/external/external.accounts.service.d.ts +2 -2
  29. package/dist/services/external/external.accounts.service.js.map +2 -2
  30. package/dist/services/github/github.service.d.ts +20 -0
  31. package/dist/services/github/github.service.js +50 -1
  32. package/dist/services/github/github.service.js.map +2 -2
  33. package/dist/services/openrouter/openrouter.service.d.ts +35 -0
  34. package/dist/services/openrouter/openrouter.service.js +45 -0
  35. package/dist/services/openrouter/openrouter.service.js.map +2 -2
  36. package/dist/services/slack/slack-blockkit.service.d.ts +7 -0
  37. package/dist/services/slack/slack-blockkit.service.js +1 -0
  38. package/dist/services/slack/slack-blockkit.service.js.map +2 -2
  39. package/dist/utils/environments.js +3 -4
  40. package/dist/utils/environments.js.map +2 -2
  41. package/dist/utils/sse.d.ts +1 -0
  42. package/dist/utils/sse.js +7 -0
  43. package/dist/utils/sse.js.map +2 -2
  44. package/package.json +2 -2
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/services/accounts/approvals.m2m.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 { ApprovalM2mActor } 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\n/**\n * The routes of `api/admin/approvals` in accounts-backend.\n *\n * control-backend calls these when a four-eyes request holds the approvals\n * that it needs. They are separate from `OrgsService`, because they are a\n * separate surface: each one carries its own m2m permission, and each one\n * takes the actor envelope that names the Camundis. The routes that a browser\n * calls today go away, and this service does not go with them.\n */\n\nexport interface ExtendTrialThroughApprovalRequest extends RequestBaseParams {\n params: { orgId: string }\n body: {\n actor: ApprovalM2mActor\n /** An ISO timestamp, between 14 and 62 days from when the call ARRIVES. */\n newExpireDate: string\n }\n}\n\nexport interface SendToExpiredTrialThroughApprovalRequest\n extends RequestBaseParams {\n params: { orgId: string }\n body: { actor: ApprovalM2mActor }\n}\n\nexport class AccountsApprovalsM2MService {\n public static async extendTrial(\n params: ExtendTrialThroughApprovalRequest,\n ): Promise<void> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'AccountsApprovalsM2MService.extendTrial',\n url: `api/admin/approvals/organizations/${params.params.orgId}/extend-trial`,\n normalizedUrl: 'api/admin/approvals/organizations/:orgId/extend-trial',\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'accounts', type: 'internal' },\n }\n\n const response = await request<void>({\n config: params.config,\n base: { id: 'accounts' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.body,\n responseType: 'none',\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\n public static async sendToExpiredTrial(\n params: SendToExpiredTrialThroughApprovalRequest,\n ): Promise<void> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'AccountsApprovalsM2MService.sendToExpiredTrial',\n url: `api/admin/approvals/organizations/${params.params.orgId}/expire-trial`,\n normalizedUrl: 'api/admin/approvals/organizations/:orgId/expire-trial',\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'accounts', type: 'internal' },\n }\n\n const response = await request<void>({\n config: params.config,\n base: { id: 'accounts' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.body,\n responseType: 'none',\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}\n"],
5
- "mappings": "AAWA,SAAS,eAAe;AACxB,SAAS,iBAAiB;AA2BnB,MAAM,4BAA4B;AAAA,EACvC,aAAoB,YAClB,QACe;AACf,UAAM,iBAA4C;AAAA,MAChD,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,KAAK,qCAAqC,OAAO,OAAO,KAAK;AAAA,QAC7D,eAAe;AAAA,QACf,MAAM;AAAA,MACR;AAAA,MACA,QAAQ,OAAO,OAAO,SAAS,UAAU;AAAA,MACzC,QAAQ,EAAE,MAAM,YAAY,MAAM,WAAW;AAAA,IAC/C;AAEA,UAAM,WAAW,MAAM,QAAc;AAAA,MACnC,QAAQ,OAAO;AAAA,MACf,MAAM,EAAE,IAAI,WAAW;AAAA,MACvB,KAAK,eAAe,OAAO;AAAA,MAC3B,QAAQ,eAAe,OAAO;AAAA,MAC9B,gBAAgB;AAAA,MAChB,MAAM,OAAO;AAAA,MACb,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;AAAA,EACF;AAAA,EAEA,aAAoB,mBAClB,QACe;AACf,UAAM,iBAA4C;AAAA,MAChD,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,KAAK,qCAAqC,OAAO,OAAO,KAAK;AAAA,QAC7D,eAAe;AAAA,QACf,MAAM;AAAA,MACR;AAAA,MACA,QAAQ,OAAO,OAAO,SAAS,UAAU;AAAA,MACzC,QAAQ,EAAE,MAAM,YAAY,MAAM,WAAW;AAAA,IAC/C;AAEA,UAAM,WAAW,MAAM,QAAc;AAAA,MACnC,QAAQ,OAAO;AAAA,MACf,MAAM,EAAE,IAAI,WAAW;AAAA,MACvB,KAAK,eAAe,OAAO;AAAA,MAC3B,QAAQ,eAAe,OAAO;AAAA,MAC9B,gBAAgB;AAAA,MAChB,MAAM,OAAO;AAAA,MACb,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;AAAA,EACF;AACF;",
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 { ApprovalM2mActor } 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\n/**\n * The routes of `api/admin/approvals` in accounts-backend.\n *\n * control-backend calls these when a four-eyes request holds the approvals\n * that it needs. They are separate from `OrgsService`, because they are a\n * separate surface: each one carries its own m2m permission, and each one\n * takes the actor envelope that names the Camundis. The routes that a browser\n * calls today go away, and this service does not go with them.\n */\n\nexport interface ExtendTrialThroughApprovalRequest extends RequestBaseParams {\n params: { orgId: string }\n body: {\n actor: ApprovalM2mActor\n /** An ISO timestamp, between 14 and 62 days from when the call ARRIVES. */\n newExpireDate: string\n }\n}\n\nexport interface SendToExpiredTrialThroughApprovalRequest\n extends RequestBaseParams {\n params: { orgId: string }\n body: { actor: ApprovalM2mActor }\n}\n\nexport interface ChangePlatformRolesThroughApprovalRequest\n extends RequestBaseParams {\n params: { userId: string }\n body: {\n actor: ApprovalM2mActor\n /** A CHANGE over the roles that the user holds when the call arrives. */\n rolesToAdd: string[]\n rolesToRemove: string[]\n }\n}\n\n/** What accounts answers for a role change: the roles after it. */\nexport interface ChangePlatformRolesThroughApprovalResult {\n userId: string\n roles: string[]\n rolesAdded: string[]\n rolesRemoved: string[]\n}\n\n/** A value of an org limit. `null` clears the override. */\nexport type OrgLimitValue = string | number | boolean | null\n\nexport interface ChangeOrgLimitThroughApprovalRequest\n extends RequestBaseParams {\n params: { orgId: string; limitKey: string }\n body: {\n actor: ApprovalM2mActor\n /**\n * The override that the person who asked read. Absent for \"not set\".\n * Accounts answers 409 and writes nothing when the override moved since.\n */\n expected?: OrgLimitValue\n value: OrgLimitValue\n }\n}\n\nexport interface DeleteSsoConnectionThroughApprovalRequest\n extends RequestBaseParams {\n params: { strategy: 'waad' | 'samlp'; connectionId: string }\n body: {\n actor: ApprovalM2mActor\n /**\n * The name of the connection that the approvers read. Accounts refuses\n * the deletion when the connection has another name.\n */\n connectionName?: string\n }\n}\n\n/** What accounts answers for a deleted connection. */\nexport interface DeleteSsoConnectionThroughApprovalResult {\n connectionId: string\n connectionName: string\n /** The users who signed in with the connection. Accounts deleted them too. */\n deletedUsers: number\n}\n\nexport interface ChangeSalesPlanThroughApprovalRequest\n extends RequestBaseParams {\n params: { orgId: string }\n body: {\n actor: ApprovalM2mActor\n salesPlanId: string\n /**\n * The plan that the person who asked read. Absent for \"no plan\". Accounts\n * answers 409 and switches nothing when the plan moved since.\n */\n expectedSalesPlanId?: string\n /**\n * The names of the two plans that the approvers read. Accounts refuses\n * the switch when a plan has another name.\n */\n salesPlanName?: string\n expectedSalesPlanName?: string\n force: boolean\n }\n}\n\nexport interface DeleteOrganizationThroughApprovalRequest\n extends RequestBaseParams {\n params: { orgId: string }\n body: {\n actor: ApprovalM2mActor\n /**\n * The name that the approvers read. Accounts refuses the deletion when\n * the organization has another name.\n */\n orgName: string\n }\n}\n\n/** What accounts answers for a deleted organization. */\nexport interface DeleteOrganizationThroughApprovalResult {\n orgId: string\n /** The members that accounts removed before it deleted the organization. */\n removedMembers: number\n}\n\nexport interface DeleteUserThroughApprovalRequest extends RequestBaseParams {\n params: { userId: string }\n body: {\n actor: ApprovalM2mActor\n /**\n * The address that the approvers read. When given, accounts refuses the\n * deletion of a user with another address.\n */\n expectedEmail?: string\n /**\n * Accounts answers `deleted: false` for a user that Auth0 does not have,\n * and not 404. A purge sets it.\n */\n skipMissing?: boolean\n }\n}\n\n/** What accounts answers for a user deletion. */\nexport interface DeleteUserThroughApprovalResult {\n userId: string\n /** `false` when Auth0 had no such user, which only `skipMissing` answers. */\n deleted: boolean\n}\n\nexport interface ChangeUserEmailThroughApprovalRequest\n extends RequestBaseParams {\n params: { userId: string }\n body: {\n actor: ApprovalM2mActor\n /**\n * The address that the person who asked read. Accounts answers 409 and\n * changes nothing when the address moved since.\n */\n expectedEmail: string\n newEmail: string\n }\n}\n\nexport interface UpdateUserMetadataThroughApprovalRequest\n extends RequestBaseParams {\n params: { userId: string; kind: 'app' | 'user' }\n body: {\n actor: ApprovalM2mActor\n /**\n * The metadata that the person who asked read. Absent for \"not set\".\n * Accounts answers 409 and writes nothing when it moved since.\n */\n expected?: Record<string, unknown>\n metadata: Record<string, unknown>\n }\n}\n\nexport class AccountsApprovalsM2MService {\n public static async extendTrial(\n params: ExtendTrialThroughApprovalRequest,\n ): Promise<void> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'AccountsApprovalsM2MService.extendTrial',\n url: `api/admin/approvals/organizations/${params.params.orgId}/extend-trial`,\n normalizedUrl: 'api/admin/approvals/organizations/:orgId/extend-trial',\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'accounts', type: 'internal' },\n }\n\n const response = await request<void>({\n config: params.config,\n base: { id: 'accounts' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.body,\n responseType: 'none',\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\n public static async sendToExpiredTrial(\n params: SendToExpiredTrialThroughApprovalRequest,\n ): Promise<void> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'AccountsApprovalsM2MService.sendToExpiredTrial',\n url: `api/admin/approvals/organizations/${params.params.orgId}/expire-trial`,\n normalizedUrl: 'api/admin/approvals/organizations/:orgId/expire-trial',\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'accounts', type: 'internal' },\n }\n\n const response = await request<void>({\n config: params.config,\n base: { id: 'accounts' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.body,\n responseType: 'none',\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\n public static async changePlatformRoles(\n params: ChangePlatformRolesThroughApprovalRequest,\n ): Promise<ChangePlatformRolesThroughApprovalResult> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'AccountsApprovalsM2MService.changePlatformRoles',\n url: `api/admin/approvals/users/${encodeURIComponent(params.params.userId)}/roles`,\n normalizedUrl: 'api/admin/approvals/users/:userId/roles',\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'accounts', type: 'internal' },\n }\n\n const response = await request<ChangePlatformRolesThroughApprovalResult>({\n config: params.config,\n base: { id: 'accounts' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.body,\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 return response.body!\n }\n\n public static async changeOrgLimit(\n params: ChangeOrgLimitThroughApprovalRequest,\n ): Promise<void> {\n const { orgId, limitKey } = params.params\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'AccountsApprovalsM2MService.changeOrgLimit',\n url: `api/admin/approvals/organizations/${orgId}/limits/${encodeURIComponent(limitKey)}`,\n normalizedUrl:\n 'api/admin/approvals/organizations/:orgId/limits/:limitKey',\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'accounts', type: 'internal' },\n }\n\n const response = await request<void>({\n config: params.config,\n base: { id: 'accounts' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.body,\n responseType: 'none',\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\n public static async deleteSsoConnection(\n params: DeleteSsoConnectionThroughApprovalRequest,\n ): Promise<DeleteSsoConnectionThroughApprovalResult> {\n const { strategy, connectionId } = params.params\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'AccountsApprovalsM2MService.deleteSsoConnection',\n url: `api/admin/approvals/connections/${strategy}/${encodeURIComponent(connectionId)}`,\n normalizedUrl:\n 'api/admin/approvals/connections/:strategy/:connectionId',\n type: 'delete',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'accounts', type: 'internal' },\n }\n\n const response = await request<DeleteSsoConnectionThroughApprovalResult>({\n config: params.config,\n base: { id: 'accounts' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.body,\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 return response.body!\n }\n\n public static async changeSalesPlan(\n params: ChangeSalesPlanThroughApprovalRequest,\n ): Promise<void> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'AccountsApprovalsM2MService.changeSalesPlan',\n url: `api/admin/approvals/organizations/${params.params.orgId}/sales-plan`,\n normalizedUrl: 'api/admin/approvals/organizations/:orgId/sales-plan',\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'accounts', type: 'internal' },\n }\n\n const response = await request<void>({\n config: params.config,\n base: { id: 'accounts' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.body,\n responseType: 'none',\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\n public static async deleteOrganization(\n params: DeleteOrganizationThroughApprovalRequest,\n ): Promise<DeleteOrganizationThroughApprovalResult> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'AccountsApprovalsM2MService.deleteOrganization',\n url: `api/admin/approvals/organizations/${params.params.orgId}`,\n normalizedUrl: 'api/admin/approvals/organizations/:orgId',\n type: 'delete',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'accounts', type: 'internal' },\n }\n\n const response = await request<DeleteOrganizationThroughApprovalResult>({\n config: params.config,\n base: { id: 'accounts' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.body,\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 return response.body!\n }\n\n public static async deleteUser(\n params: DeleteUserThroughApprovalRequest,\n ): Promise<DeleteUserThroughApprovalResult> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'AccountsApprovalsM2MService.deleteUser',\n url: `api/admin/approvals/users/${encodeURIComponent(params.params.userId)}`,\n normalizedUrl: 'api/admin/approvals/users/:userId',\n type: 'delete',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'accounts', type: 'internal' },\n }\n\n const response = await request<DeleteUserThroughApprovalResult>({\n config: params.config,\n base: { id: 'accounts' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.body,\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 return response.body!\n }\n\n public static async changeUserEmail(\n params: ChangeUserEmailThroughApprovalRequest,\n ): Promise<void> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'AccountsApprovalsM2MService.changeUserEmail',\n url: `api/admin/approvals/users/${encodeURIComponent(params.params.userId)}/email`,\n normalizedUrl: 'api/admin/approvals/users/:userId/email',\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'accounts', type: 'internal' },\n }\n\n const response = await request<void>({\n config: params.config,\n base: { id: 'accounts' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.body,\n responseType: 'none',\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\n public static async updateUserMetadata(\n params: UpdateUserMetadataThroughApprovalRequest,\n ): Promise<void> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'AccountsApprovalsM2MService.updateUserMetadata',\n url: `api/admin/approvals/users/${encodeURIComponent(params.params.userId)}/metadata/${params.params.kind}`,\n normalizedUrl: 'api/admin/approvals/users/:userId/metadata/:kind',\n type: 'put',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'accounts', type: 'internal' },\n }\n\n const response = await request<void>({\n config: params.config,\n base: { id: 'accounts' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.body,\n responseType: 'none',\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}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,10 @@
1
- import type { Hdp, HdpBackendChangeEvent, HdpDisk, HdpPrometheusDataCapacityDataPoint, HdpTenantUsageBreakdown, HdpTenantUsagePoint } from '@camunda/ccma-shared-types';
1
+ import type { ChartResult, ChartSpec, Hdp, HdpBackendChangeEvent, HdpDisk, HdpPrometheusDataCapacityDataPoint, HdpTenantUsageBreakdown, HdpTenantUsagePoint } from '@camunda/ccma-shared-types';
2
2
  import type { RequestBaseParams } from '../../types/general.types.js';
3
+ export interface QueryChartRequest extends RequestBaseParams {
4
+ params: {
5
+ spec: ChartSpec;
6
+ };
7
+ }
3
8
  export interface GetClusterCapacityRequest extends RequestBaseParams {
4
9
  params: {
5
10
  orgId: string;
@@ -139,10 +144,18 @@ export declare class HdpService {
139
144
  * the answer for one hour, thus a page can call this on load. HDP keeps the
140
145
  * rows of deleted clusters, thus the caller matches `rows` against its own
141
146
  * cluster list. A cluster with no row has no cost data. That is not a cost
142
- * of 0. While `control.fleetHostingCost` is off on the stage, `rows` is
143
- * empty.
147
+ * of 0.
144
148
  */
145
149
  static getFleetHostingCost(params: RequestBaseParams): Promise<Hdp.FleetHostingCost>;
150
+ /**
151
+ * One chart of a Control dashboard: a query on one metric of HDP. Admin
152
+ * only, and only while `control.dashboardCharts` is on (404 otherwise). The
153
+ * backend checks the spec against `CHART_METRICS` and answers 400 for a spec
154
+ * it refuses, 422 when the query reads too many bytes, and 429 when the user
155
+ * runs too many queries. The message of the thrown {@link HttpError} is the
156
+ * reason that the backend gives.
157
+ */
158
+ static queryChart(params: QueryChartRequest): Promise<ChartResult>;
146
159
  static getActiveOrgs(params: GetActiveOrgsRequest): Promise<GetActiveOrgsResponse>;
147
160
  static getLlmUsage(params: GetLlmUsageRequest): Promise<LlmUsageEntry[]>;
148
161
  }
@@ -313,8 +313,7 @@ class HdpService {
313
313
  * the answer for one hour, thus a page can call this on load. HDP keeps the
314
314
  * rows of deleted clusters, thus the caller matches `rows` against its own
315
315
  * cluster list. A cluster with no row has no cost data. That is not a cost
316
- * of 0. While `control.fleetHostingCost` is off on the stage, `rows` is
317
- * empty.
316
+ * of 0.
318
317
  */
319
318
  static async getFleetHostingCost(params) {
320
319
  const serviceContext = {
@@ -348,6 +347,50 @@ class HdpService {
348
347
  }
349
348
  return response.body;
350
349
  }
350
+ /**
351
+ * One chart of a Control dashboard: a query on one metric of HDP. Admin
352
+ * only, and only while `control.dashboardCharts` is on (404 otherwise). The
353
+ * backend checks the spec against `CHART_METRICS` and answers 400 for a spec
354
+ * it refuses, 422 when the query reads too many bytes, and 429 when the user
355
+ * runs too many queries. The message of the thrown {@link HttpError} is the
356
+ * reason that the backend gives.
357
+ */
358
+ static async queryChart(params) {
359
+ const serviceContext = {
360
+ method: {
361
+ name: `HdpService.queryChart`,
362
+ url: "api/hdp/charts/query",
363
+ normalizedUrl: "api/hdp/charts/query",
364
+ type: "post"
365
+ },
366
+ source: params.config.metrics?.source || "unset",
367
+ target: {
368
+ name: "accounts",
369
+ type: "internal"
370
+ }
371
+ };
372
+ const response = await request({
373
+ ...params,
374
+ base: {
375
+ id: "accounts"
376
+ },
377
+ url: serviceContext.method.url,
378
+ method: serviceContext.method.type,
379
+ metricsDetails: serviceContext,
380
+ body: params.params.spec,
381
+ // No retry on a 429: a retry after the backoff starts a BigQuery job
382
+ // that nobody asked for. The chart shows the limit at once.
383
+ retry: { attempts: 1, remaining: 0 }
384
+ });
385
+ if (!response.ok || !response.body) {
386
+ throw new HttpError(
387
+ `${serviceContext.method.name}: ${response.status} ${response.statusText}`,
388
+ response.status,
389
+ response.statusText
390
+ );
391
+ }
392
+ return response.body;
393
+ }
351
394
  static async getActiveOrgs(params) {
352
395
  const serviceContext = {
353
396
  method: {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/services/accounts/hdp.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 Hdp,\n HdpBackendChangeEvent,\n HdpDisk,\n HdpPrometheusDataCapacityDataPoint,\n HdpTenantUsageBreakdown,\n HdpTenantUsagePoint,\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 GetClusterCapacityRequest extends RequestBaseParams {\n params: {\n orgId: string\n clusterId?: string\n clusterIds?: string[]\n operation: 'per-day' | 'latest' | '24h'\n }\n}\n\n/**\n * `per-day`/`24h` read one cluster and `latest` reads a set \u2014 the identifiers\n * are not interchangeable, so the discriminant carries only the one its\n * operation needs. A flat `{clusterId?, clusterIds?, operation}` shape let a\n * caller send `{operation: '24h', clusterIds: [...]}`, which reached the\n * accounts-backend route with an undefined `clusterId` and returned 200 with\n * `[]` instead of a 400.\n */\nexport type GetClusterDiskUsageParams = {\n /** The disk to read. Without it, the route reads Elasticsearch. */\n disk?: HdpDisk\n} & (\n | { orgId: string; operation: 'per-day' | '24h'; clusterId: string }\n | { orgId: string; operation: 'latest'; clusterIds: string[] }\n)\n\nexport type GetClusterDiskUsageRequest = RequestBaseParams & {\n params: GetClusterDiskUsageParams\n}\n\nexport interface GetTenantUsageRequest extends RequestBaseParams {\n params: {\n orgId: string\n /** Relative window, in days back from today. Ignored when `startDate` is set. */\n days?: number\n /** Inclusive `YYYY-MM-DD` lower bound. */\n startDate?: string\n /** Inclusive `YYYY-MM-DD` upper bound. Defaults to today. */\n endDate?: string\n }\n}\n\nexport interface GetBackendChangeEventsRequest extends RequestBaseParams {\n params: {\n entityId: string\n }\n}\n\nexport interface GetUsageMetricsRequest extends RequestBaseParams {\n params: {\n orgId: string\n queryRange?: string\n queryStartDate?: string\n /** Inclusive upper bound; without it the range is open-ended. */\n queryEndDate?: string\n queryLimit?: number\n }\n}\n\nexport interface GetUsageMetricsResponse {\n valueMetrics: Hdp.ValueMetrics\n}\n\nexport interface GetLlmUsageRequest extends RequestBaseParams {\n params: Record<string, never>\n}\n\nexport interface LlmUsageEntry {\n ts: number\n orgId: string\n orgName: string\n salesPlan: string\n spend: number\n maxBudget: number\n}\n\nexport interface GetActiveOrgsRequest extends RequestBaseParams {\n params: {\n metric: 'ProcessInstances' | 'DecisionInstances' | 'TaskUsers'\n }\n}\n\nexport interface GetActiveOrgsResponse {\n activeOrgs: Hdp.ActiveOrgByUsageMetric[]\n}\n\nexport interface GetClusterActivityRequest extends RequestBaseParams {\n params?: {\n /** The window to read, in days. accounts-backend bounds this value. */\n windowDays?: number\n }\n}\n\nexport interface GetClusterHostingCostRequest extends RequestBaseParams {\n params: {\n clusterId: string\n }\n}\n\nexport interface GetClusterHostingCostResponse {\n /** Absent when the cluster has no rows in the window. */\n hostingCost?: Hdp.ClusterHostingCost\n}\n\nexport class HdpService {\n public static async getClusterCapacity(\n params: GetClusterCapacityRequest,\n ): Promise<HdpPrometheusDataCapacityDataPoint[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getClusterCapacity`,\n url: `api/hdp/${params.params.orgId}/clusters/capacity`,\n normalizedUrl: `api/hdp/:orgId/clusters/capacity`,\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<HdpPrometheusDataCapacityDataPoint[]>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params,\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 /**\n * Used bytes of one cluster disk (Elasticsearch or Zeebe), as avg/min/max,\n * with the same shape and operations as `getClusterCapacity`. The value is\n * the total over all nodes of the disk. See\n * camunda/Holistic-Data-Platform#1923 for the ingestion side.\n */\n public static async getClusterDiskUsage(\n params: GetClusterDiskUsageRequest,\n ): Promise<HdpPrometheusDataCapacityDataPoint[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getClusterDiskUsage`,\n url: `api/hdp/${params.params.orgId}/clusters/disk-usage`,\n normalizedUrl: `api/hdp/:orgId/clusters/disk-usage`,\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<HdpPrometheusDataCapacityDataPoint[]>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params,\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 getTenantUsage(\n params: GetTenantUsageRequest,\n ): Promise<HdpTenantUsagePoint[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getTenantUsage`,\n url: `api/hdp/${params.params.orgId}/tenants`,\n normalizedUrl: `api/hdp/:orgId/tenants`,\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<HdpTenantUsagePoint[]>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params,\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 /**\n * Tenant usage broken down by cluster, plus the org roll-up of the same rows.\n * Use when a caller needs the per-cluster detail; `getTenantUsage` returns\n * just the org totals, which is all a billing figure needs.\n */\n public static async getTenantUsagePerCluster(\n params: GetTenantUsageRequest,\n ): Promise<HdpTenantUsageBreakdown> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getTenantUsagePerCluster`,\n url: `api/hdp/${params.params.orgId}/tenants/per-cluster`,\n normalizedUrl: `api/hdp/:orgId/tenants/per-cluster`,\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<HdpTenantUsageBreakdown>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params,\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 getBackendChangeEvents(\n params: GetBackendChangeEventsRequest,\n ): Promise<HdpBackendChangeEvent[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getClusterCapacity`,\n url: `api/hdp/backend-events/${params.params.entityId}`,\n normalizedUrl: `api/hdp/backend-events/:entityId`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<HdpBackendChangeEvent[]>({\n ...params,\n base: {\n id: 'accounts',\n },\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 getUsageMetrics(\n params: GetUsageMetricsRequest,\n ): Promise<GetUsageMetricsResponse> {\n const queryParams = new URLSearchParams()\n if (params.params.queryRange) {\n queryParams.append('range', params.params.queryRange)\n }\n if (params.params.queryStartDate) {\n queryParams.append('startDate', params.params.queryStartDate)\n }\n if (params.params.queryEndDate) {\n queryParams.append('endDate', params.params.queryEndDate)\n }\n if (params.params.queryLimit) {\n queryParams.append('limit', params.params.queryLimit.toString())\n }\n const queryString = queryParams.size > 0 ? `?${queryParams.toString()}` : ''\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getUsageMetrics`,\n url: `api/usage-metrics/${params.params.orgId}${queryString}`,\n normalizedUrl: `api/hdp/usage-metrics/:orgId`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<GetUsageMetricsResponse>({\n ...params,\n base: {\n id: 'accounts',\n },\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 /**\n * The work of every cluster that HDP holds inside the window, for the whole\n * fleet (`GET /api/usage-metrics/cluster-activity`).\n *\n * Only accounts-backend can query HDP, thus console-backend reads the rows\n * from here. Call this with a service token: the response covers the whole\n * fleet, and the caller caches it for every user.\n */\n public static async getClusterActivity(\n params: GetClusterActivityRequest,\n ): Promise<Hdp.ClusterActivity> {\n const windowDays = params.params?.windowDays\n const queryString =\n windowDays === undefined ? '' : `?windowDays=${windowDays}`\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getClusterActivity`,\n url: `api/usage-metrics/cluster-activity${queryString}`,\n normalizedUrl: `api/hdp/usage-metrics/cluster-activity`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<Hdp.ClusterActivity>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok || !response.body) {\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 /**\n * One cluster's trailing 30-day loaded hosting cost\n * (`GET /api/hdp/hosting-cost/:clusterId`).\n *\n * Only accounts-backend can query HDP, thus console-backend and\n * control-frontend both read it from here. The response's `hostingCost` is\n * absent when the cluster has no rows in the window, so the caller can show\n * \"no data\" rather than a false $0.\n */\n public static async getClusterHostingCost(\n params: GetClusterHostingCostRequest,\n ): Promise<GetClusterHostingCostResponse> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getClusterHostingCost`,\n url: `api/hdp/hosting-cost/${encodeURIComponent(params.params.clusterId)}`,\n normalizedUrl: `api/hdp/hosting-cost/:clusterId`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<GetClusterHostingCostResponse>({\n ...params,\n base: {\n id: 'accounts',\n },\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 /**\n * The trailing 30-day loaded hosting cost of every cluster HDP holds, for\n * the whole fleet (`GET /api/hdp/hosting-cost`).\n *\n * accounts-backend answers only a caller with `admin.readAll`, and caches\n * the answer for one hour, thus a page can call this on load. HDP keeps the\n * rows of deleted clusters, thus the caller matches `rows` against its own\n * cluster list. A cluster with no row has no cost data. That is not a cost\n * of 0. While `control.fleetHostingCost` is off on the stage, `rows` is\n * empty.\n */\n public static async getFleetHostingCost(\n params: RequestBaseParams,\n ): Promise<Hdp.FleetHostingCost> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getFleetHostingCost`,\n url: 'api/hdp/hosting-cost',\n normalizedUrl: 'api/hdp/hosting-cost',\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<Hdp.FleetHostingCost>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok || !response.body) {\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 getActiveOrgs(\n params: GetActiveOrgsRequest,\n ): Promise<GetActiveOrgsResponse> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getActiveOrgs`,\n url: `api/usage-metrics/active/${params.params.metric}`,\n normalizedUrl: `api/hdp/usage-metrics/active/:metric`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<GetActiveOrgsResponse>({\n ...params,\n base: {\n id: 'accounts',\n },\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 getLlmUsage(\n params: GetLlmUsageRequest,\n ): Promise<LlmUsageEntry[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getLlmUsage`,\n url: `api/hdp/llm-usage`,\n normalizedUrl: `api/hdp/llm-usage`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<LlmUsageEntry[]>({\n ...params,\n base: {\n id: 'accounts',\n },\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": "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",
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 ChartResult,\n ChartSpec,\n Hdp,\n HdpBackendChangeEvent,\n HdpDisk,\n HdpPrometheusDataCapacityDataPoint,\n HdpTenantUsageBreakdown,\n HdpTenantUsagePoint,\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 QueryChartRequest extends RequestBaseParams {\n params: {\n spec: ChartSpec\n }\n}\n\nexport interface GetClusterCapacityRequest extends RequestBaseParams {\n params: {\n orgId: string\n clusterId?: string\n clusterIds?: string[]\n operation: 'per-day' | 'latest' | '24h'\n }\n}\n\n/**\n * `per-day`/`24h` read one cluster and `latest` reads a set \u2014 the identifiers\n * are not interchangeable, so the discriminant carries only the one its\n * operation needs. A flat `{clusterId?, clusterIds?, operation}` shape let a\n * caller send `{operation: '24h', clusterIds: [...]}`, which reached the\n * accounts-backend route with an undefined `clusterId` and returned 200 with\n * `[]` instead of a 400.\n */\nexport type GetClusterDiskUsageParams = {\n /** The disk to read. Without it, the route reads Elasticsearch. */\n disk?: HdpDisk\n} & (\n | { orgId: string; operation: 'per-day' | '24h'; clusterId: string }\n | { orgId: string; operation: 'latest'; clusterIds: string[] }\n)\n\nexport type GetClusterDiskUsageRequest = RequestBaseParams & {\n params: GetClusterDiskUsageParams\n}\n\nexport interface GetTenantUsageRequest extends RequestBaseParams {\n params: {\n orgId: string\n /** Relative window, in days back from today. Ignored when `startDate` is set. */\n days?: number\n /** Inclusive `YYYY-MM-DD` lower bound. */\n startDate?: string\n /** Inclusive `YYYY-MM-DD` upper bound. Defaults to today. */\n endDate?: string\n }\n}\n\nexport interface GetBackendChangeEventsRequest extends RequestBaseParams {\n params: {\n entityId: string\n }\n}\n\nexport interface GetUsageMetricsRequest extends RequestBaseParams {\n params: {\n orgId: string\n queryRange?: string\n queryStartDate?: string\n /** Inclusive upper bound; without it the range is open-ended. */\n queryEndDate?: string\n queryLimit?: number\n }\n}\n\nexport interface GetUsageMetricsResponse {\n valueMetrics: Hdp.ValueMetrics\n}\n\nexport interface GetLlmUsageRequest extends RequestBaseParams {\n params: Record<string, never>\n}\n\nexport interface LlmUsageEntry {\n ts: number\n orgId: string\n orgName: string\n salesPlan: string\n spend: number\n maxBudget: number\n}\n\nexport interface GetActiveOrgsRequest extends RequestBaseParams {\n params: {\n metric: 'ProcessInstances' | 'DecisionInstances' | 'TaskUsers'\n }\n}\n\nexport interface GetActiveOrgsResponse {\n activeOrgs: Hdp.ActiveOrgByUsageMetric[]\n}\n\nexport interface GetClusterActivityRequest extends RequestBaseParams {\n params?: {\n /** The window to read, in days. accounts-backend bounds this value. */\n windowDays?: number\n }\n}\n\nexport interface GetClusterHostingCostRequest extends RequestBaseParams {\n params: {\n clusterId: string\n }\n}\n\nexport interface GetClusterHostingCostResponse {\n /** Absent when the cluster has no rows in the window. */\n hostingCost?: Hdp.ClusterHostingCost\n}\n\nexport class HdpService {\n public static async getClusterCapacity(\n params: GetClusterCapacityRequest,\n ): Promise<HdpPrometheusDataCapacityDataPoint[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getClusterCapacity`,\n url: `api/hdp/${params.params.orgId}/clusters/capacity`,\n normalizedUrl: `api/hdp/:orgId/clusters/capacity`,\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<HdpPrometheusDataCapacityDataPoint[]>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params,\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 /**\n * Used bytes of one cluster disk (Elasticsearch or Zeebe), as avg/min/max,\n * with the same shape and operations as `getClusterCapacity`. The value is\n * the total over all nodes of the disk. See\n * camunda/Holistic-Data-Platform#1923 for the ingestion side.\n */\n public static async getClusterDiskUsage(\n params: GetClusterDiskUsageRequest,\n ): Promise<HdpPrometheusDataCapacityDataPoint[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getClusterDiskUsage`,\n url: `api/hdp/${params.params.orgId}/clusters/disk-usage`,\n normalizedUrl: `api/hdp/:orgId/clusters/disk-usage`,\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<HdpPrometheusDataCapacityDataPoint[]>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params,\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 getTenantUsage(\n params: GetTenantUsageRequest,\n ): Promise<HdpTenantUsagePoint[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getTenantUsage`,\n url: `api/hdp/${params.params.orgId}/tenants`,\n normalizedUrl: `api/hdp/:orgId/tenants`,\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<HdpTenantUsagePoint[]>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params,\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 /**\n * Tenant usage broken down by cluster, plus the org roll-up of the same rows.\n * Use when a caller needs the per-cluster detail; `getTenantUsage` returns\n * just the org totals, which is all a billing figure needs.\n */\n public static async getTenantUsagePerCluster(\n params: GetTenantUsageRequest,\n ): Promise<HdpTenantUsageBreakdown> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getTenantUsagePerCluster`,\n url: `api/hdp/${params.params.orgId}/tenants/per-cluster`,\n normalizedUrl: `api/hdp/:orgId/tenants/per-cluster`,\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<HdpTenantUsageBreakdown>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params,\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 getBackendChangeEvents(\n params: GetBackendChangeEventsRequest,\n ): Promise<HdpBackendChangeEvent[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getClusterCapacity`,\n url: `api/hdp/backend-events/${params.params.entityId}`,\n normalizedUrl: `api/hdp/backend-events/:entityId`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<HdpBackendChangeEvent[]>({\n ...params,\n base: {\n id: 'accounts',\n },\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 getUsageMetrics(\n params: GetUsageMetricsRequest,\n ): Promise<GetUsageMetricsResponse> {\n const queryParams = new URLSearchParams()\n if (params.params.queryRange) {\n queryParams.append('range', params.params.queryRange)\n }\n if (params.params.queryStartDate) {\n queryParams.append('startDate', params.params.queryStartDate)\n }\n if (params.params.queryEndDate) {\n queryParams.append('endDate', params.params.queryEndDate)\n }\n if (params.params.queryLimit) {\n queryParams.append('limit', params.params.queryLimit.toString())\n }\n const queryString = queryParams.size > 0 ? `?${queryParams.toString()}` : ''\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getUsageMetrics`,\n url: `api/usage-metrics/${params.params.orgId}${queryString}`,\n normalizedUrl: `api/hdp/usage-metrics/:orgId`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<GetUsageMetricsResponse>({\n ...params,\n base: {\n id: 'accounts',\n },\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 /**\n * The work of every cluster that HDP holds inside the window, for the whole\n * fleet (`GET /api/usage-metrics/cluster-activity`).\n *\n * Only accounts-backend can query HDP, thus console-backend reads the rows\n * from here. Call this with a service token: the response covers the whole\n * fleet, and the caller caches it for every user.\n */\n public static async getClusterActivity(\n params: GetClusterActivityRequest,\n ): Promise<Hdp.ClusterActivity> {\n const windowDays = params.params?.windowDays\n const queryString =\n windowDays === undefined ? '' : `?windowDays=${windowDays}`\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getClusterActivity`,\n url: `api/usage-metrics/cluster-activity${queryString}`,\n normalizedUrl: `api/hdp/usage-metrics/cluster-activity`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<Hdp.ClusterActivity>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok || !response.body) {\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 /**\n * One cluster's trailing 30-day loaded hosting cost\n * (`GET /api/hdp/hosting-cost/:clusterId`).\n *\n * Only accounts-backend can query HDP, thus console-backend and\n * control-frontend both read it from here. The response's `hostingCost` is\n * absent when the cluster has no rows in the window, so the caller can show\n * \"no data\" rather than a false $0.\n */\n public static async getClusterHostingCost(\n params: GetClusterHostingCostRequest,\n ): Promise<GetClusterHostingCostResponse> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getClusterHostingCost`,\n url: `api/hdp/hosting-cost/${encodeURIComponent(params.params.clusterId)}`,\n normalizedUrl: `api/hdp/hosting-cost/:clusterId`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<GetClusterHostingCostResponse>({\n ...params,\n base: {\n id: 'accounts',\n },\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 /**\n * The trailing 30-day loaded hosting cost of every cluster HDP holds, for\n * the whole fleet (`GET /api/hdp/hosting-cost`).\n *\n * accounts-backend answers only a caller with `admin.readAll`, and caches\n * the answer for one hour, thus a page can call this on load. HDP keeps the\n * rows of deleted clusters, thus the caller matches `rows` against its own\n * cluster list. A cluster with no row has no cost data. That is not a cost\n * of 0.\n */\n public static async getFleetHostingCost(\n params: RequestBaseParams,\n ): Promise<Hdp.FleetHostingCost> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getFleetHostingCost`,\n url: 'api/hdp/hosting-cost',\n normalizedUrl: 'api/hdp/hosting-cost',\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<Hdp.FleetHostingCost>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok || !response.body) {\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 /**\n * One chart of a Control dashboard: a query on one metric of HDP. Admin\n * only, and only while `control.dashboardCharts` is on (404 otherwise). The\n * backend checks the spec against `CHART_METRICS` and answers 400 for a spec\n * it refuses, 422 when the query reads too many bytes, and 429 when the user\n * runs too many queries. The message of the thrown {@link HttpError} is the\n * reason that the backend gives.\n */\n public static async queryChart(\n params: QueryChartRequest,\n ): Promise<ChartResult> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.queryChart`,\n url: 'api/hdp/charts/query',\n normalizedUrl: 'api/hdp/charts/query',\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<ChartResult>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params.spec,\n // No retry on a 429: a retry after the backoff starts a BigQuery job\n // that nobody asked for. The chart shows the limit at once.\n retry: { attempts: 1, remaining: 0 },\n })\n if (!response.ok || !response.body) {\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 getActiveOrgs(\n params: GetActiveOrgsRequest,\n ): Promise<GetActiveOrgsResponse> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getActiveOrgs`,\n url: `api/usage-metrics/active/${params.params.metric}`,\n normalizedUrl: `api/hdp/usage-metrics/active/:metric`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<GetActiveOrgsResponse>({\n ...params,\n base: {\n id: 'accounts',\n },\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 getLlmUsage(\n params: GetLlmUsageRequest,\n ): Promise<LlmUsageEntry[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getLlmUsage`,\n url: `api/hdp/llm-usage`,\n normalizedUrl: `api/hdp/llm-usage`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<LlmUsageEntry[]>({\n ...params,\n base: {\n id: 'accounts',\n },\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": "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",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,4 @@
1
- import type { ApprovalM2mActor, ClusterBulkStepRequestDto, ClusterBulkStepResultDto, MoveClusterOwnerResult } from '@camunda/ccma-shared-types';
1
+ import type { ApprovalM2mActor, BackupDto, ClusterBulkStepRequestDto, ClusterBulkStepResultDto, MoveClusterOwnerResult } from '@camunda/ccma-shared-types';
2
2
  import type { RequestBaseParams } from '../../types/general.types.js';
3
3
  /**
4
4
  * The route of `api/admin/approvals` in console-backend.
@@ -29,6 +29,15 @@ export interface AnnounceClusterBulkPlanUpdateRequest extends RequestBaseParams
29
29
  doneCount: number;
30
30
  };
31
31
  }
32
+ export interface DeleteInternalBackupThroughApprovalRequest extends RequestBaseParams {
33
+ params: {
34
+ clusterId: string;
35
+ backupName: string;
36
+ };
37
+ body: {
38
+ actor: ApprovalM2mActor;
39
+ };
40
+ }
32
41
  export declare class ConsoleApprovalsM2MService {
33
42
  static moveClusterOwner(params: MoveClusterOwnerThroughApprovalRequest): Promise<MoveClusterOwnerResult>;
34
43
  /**
@@ -44,4 +53,6 @@ export declare class ConsoleApprovalsM2MService {
44
53
  * operation of console-backend posts the same message after its run.
45
54
  */
46
55
  static announceClusterBulkPlanUpdate(params: AnnounceClusterBulkPlanUpdateRequest): Promise<void>;
56
+ /** Deletes an internal (incident) backup of a cluster. It cannot be undone. */
57
+ static deleteInternalBackup(params: DeleteInternalBackupThroughApprovalRequest): Promise<BackupDto>;
47
58
  }
@@ -98,6 +98,37 @@ class ConsoleApprovalsM2MService {
98
98
  );
99
99
  }
100
100
  }
101
+ /** Deletes an internal (incident) backup of a cluster. It cannot be undone. */
102
+ static async deleteInternalBackup(params) {
103
+ const { clusterId, backupName } = params.params;
104
+ const serviceContext = {
105
+ method: {
106
+ name: "ConsoleApprovalsM2MService.deleteInternalBackup",
107
+ url: `api/admin/approvals/clusters/${clusterId}/internal-backups/${encodeURIComponent(backupName)}`,
108
+ normalizedUrl: "api/admin/approvals/clusters/:clusterId/internal-backups/:backupName",
109
+ type: "delete"
110
+ },
111
+ source: params.config.metrics?.source || "unset",
112
+ target: { name: "console", type: "internal" }
113
+ };
114
+ const response = await request({
115
+ config: params.config,
116
+ base: { id: "console" },
117
+ url: serviceContext.method.url,
118
+ method: serviceContext.method.type,
119
+ metricsDetails: serviceContext,
120
+ responseType: "json",
121
+ body: params.body
122
+ });
123
+ if (!response.ok) {
124
+ throw new HttpError(
125
+ `${serviceContext.method.name}: ${response.status} ${response.statusText}`,
126
+ response.status,
127
+ response.statusText
128
+ );
129
+ }
130
+ return response.body;
131
+ }
101
132
  }
102
133
  export {
103
134
  ConsoleApprovalsM2MService
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/services/console/console.approvals.m2m.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 ApprovalM2mActor,\n ClusterBulkStepRequestDto,\n ClusterBulkStepResultDto,\n MoveClusterOwnerResult,\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\n/**\n * The route of `api/admin/approvals` in console-backend.\n *\n * The twin of `AccountsApprovalsM2MService`. Read the note there.\n */\n\nexport interface MoveClusterOwnerThroughApprovalRequest\n extends RequestBaseParams {\n params: { clusterId: string }\n body: {\n actor: ApprovalM2mActor\n ownerId: string\n }\n}\n\nexport interface RunClusterBulkStepThroughApprovalRequest\n extends RequestBaseParams {\n params: { clusterId: string }\n body: ClusterBulkStepRequestDto & { actor: ApprovalM2mActor }\n}\n\nexport interface AnnounceClusterBulkPlanUpdateRequest\n extends RequestBaseParams {\n body: {\n actor: ApprovalM2mActor\n toPlanUuid: string\n doneCount: number\n }\n}\n\nexport class ConsoleApprovalsM2MService {\n public static async moveClusterOwner(\n params: MoveClusterOwnerThroughApprovalRequest,\n ): Promise<MoveClusterOwnerResult> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'ConsoleApprovalsM2MService.moveClusterOwner',\n url: `api/admin/approvals/clusters/${params.params.clusterId}/owner`,\n normalizedUrl: 'api/admin/approvals/clusters/:clusterId/owner',\n type: 'put',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'console', type: 'internal' },\n }\n\n const response = await request<MoveClusterOwnerResult>({\n config: params.config,\n base: { id: 'console' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n responseType: 'json',\n body: params.body,\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 // This route is new, so there is no older backend that answers 204 with no\n // body for the same-owner case. `ConsoleClusterService.moveClusterOwner`\n // carries that case, and this one does not need it.\n return response.body!\n }\n\n /**\n * Runs one step of a cluster bulk operation on one cluster.\n *\n * Every outcome of the STEP answers 200, including a cluster that refused.\n * A thrown `HttpError` says that the CALL failed, and the caller then\n * leaves the cluster to run again.\n */\n public static async runClusterBulkStep(\n params: RunClusterBulkStepThroughApprovalRequest,\n ): Promise<ClusterBulkStepResultDto> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'ConsoleApprovalsM2MService.runClusterBulkStep',\n url: `api/admin/approvals/clusters/${params.params.clusterId}/bulk-step`,\n normalizedUrl: 'api/admin/approvals/clusters/:clusterId/bulk-step',\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'console', type: 'internal' },\n }\n\n const response = await request<ClusterBulkStepResultDto>({\n config: params.config,\n base: { id: 'console' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n responseType: 'json',\n body: params.body,\n })\n\n if (!response.ok || !response.body) {\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 /**\n * Posts the Slack message that ends an approved bulk plan update. The bulk\n * operation of console-backend posts the same message after its run.\n */\n public static async announceClusterBulkPlanUpdate(\n params: AnnounceClusterBulkPlanUpdateRequest,\n ): Promise<void> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'ConsoleApprovalsM2MService.announceClusterBulkPlanUpdate',\n url: 'api/admin/approvals/cluster-bulk/plan-update-announcement',\n normalizedUrl:\n 'api/admin/approvals/cluster-bulk/plan-update-announcement',\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'console', type: 'internal' },\n }\n\n const response = await request<void>({\n config: params.config,\n base: { id: 'console' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n responseType: 'none',\n body: params.body,\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}\n"],
5
- "mappings": "AAgBA,SAAS,eAAe;AACxB,SAAS,iBAAiB;AAgCnB,MAAM,2BAA2B;AAAA,EACtC,aAAoB,iBAClB,QACiC;AACjC,UAAM,iBAA4C;AAAA,MAChD,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,KAAK,gCAAgC,OAAO,OAAO,SAAS;AAAA,QAC5D,eAAe;AAAA,QACf,MAAM;AAAA,MACR;AAAA,MACA,QAAQ,OAAO,OAAO,SAAS,UAAU;AAAA,MACzC,QAAQ,EAAE,MAAM,WAAW,MAAM,WAAW;AAAA,IAC9C;AAEA,UAAM,WAAW,MAAM,QAAgC;AAAA,MACrD,QAAQ,OAAO;AAAA,MACf,MAAM,EAAE,IAAI,UAAU;AAAA,MACtB,KAAK,eAAe,OAAO;AAAA,MAC3B,QAAQ,eAAe,OAAO;AAAA,MAC9B,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd,MAAM,OAAO;AAAA,IACf,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;AAKA,WAAO,SAAS;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAoB,mBAClB,QACmC;AACnC,UAAM,iBAA4C;AAAA,MAChD,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,KAAK,gCAAgC,OAAO,OAAO,SAAS;AAAA,QAC5D,eAAe;AAAA,QACf,MAAM;AAAA,MACR;AAAA,MACA,QAAQ,OAAO,OAAO,SAAS,UAAU;AAAA,MACzC,QAAQ,EAAE,MAAM,WAAW,MAAM,WAAW;AAAA,IAC9C;AAEA,UAAM,WAAW,MAAM,QAAkC;AAAA,MACvD,QAAQ,OAAO;AAAA,MACf,MAAM,EAAE,IAAI,UAAU;AAAA,MACtB,KAAK,eAAe,OAAO;AAAA,MAC3B,QAAQ,eAAe,OAAO;AAAA,MAC9B,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd,MAAM,OAAO;AAAA,IACf,CAAC;AAED,QAAI,CAAC,SAAS,MAAM,CAAC,SAAS,MAAM;AAClC,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;AAAA;AAAA;AAAA;AAAA,EAMA,aAAoB,8BAClB,QACe;AACf,UAAM,iBAA4C;AAAA,MAChD,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,KAAK;AAAA,QACL,eACE;AAAA,QACF,MAAM;AAAA,MACR;AAAA,MACA,QAAQ,OAAO,OAAO,SAAS,UAAU;AAAA,MACzC,QAAQ,EAAE,MAAM,WAAW,MAAM,WAAW;AAAA,IAC9C;AAEA,UAAM,WAAW,MAAM,QAAc;AAAA,MACnC,QAAQ,OAAO;AAAA,MACf,MAAM,EAAE,IAAI,UAAU;AAAA,MACtB,KAAK,eAAe,OAAO;AAAA,MAC3B,QAAQ,eAAe,OAAO;AAAA,MAC9B,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd,MAAM,OAAO;AAAA,IACf,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;AAAA,EACF;AACF;",
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 ApprovalM2mActor,\n BackupDto,\n ClusterBulkStepRequestDto,\n ClusterBulkStepResultDto,\n MoveClusterOwnerResult,\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\n/**\n * The route of `api/admin/approvals` in console-backend.\n *\n * The twin of `AccountsApprovalsM2MService`. Read the note there.\n */\n\nexport interface MoveClusterOwnerThroughApprovalRequest\n extends RequestBaseParams {\n params: { clusterId: string }\n body: {\n actor: ApprovalM2mActor\n ownerId: string\n }\n}\n\nexport interface RunClusterBulkStepThroughApprovalRequest\n extends RequestBaseParams {\n params: { clusterId: string }\n body: ClusterBulkStepRequestDto & { actor: ApprovalM2mActor }\n}\n\nexport interface AnnounceClusterBulkPlanUpdateRequest\n extends RequestBaseParams {\n body: {\n actor: ApprovalM2mActor\n toPlanUuid: string\n doneCount: number\n }\n}\n\nexport interface DeleteInternalBackupThroughApprovalRequest\n extends RequestBaseParams {\n params: { clusterId: string; backupName: string }\n body: { actor: ApprovalM2mActor }\n}\n\nexport class ConsoleApprovalsM2MService {\n public static async moveClusterOwner(\n params: MoveClusterOwnerThroughApprovalRequest,\n ): Promise<MoveClusterOwnerResult> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'ConsoleApprovalsM2MService.moveClusterOwner',\n url: `api/admin/approvals/clusters/${params.params.clusterId}/owner`,\n normalizedUrl: 'api/admin/approvals/clusters/:clusterId/owner',\n type: 'put',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'console', type: 'internal' },\n }\n\n const response = await request<MoveClusterOwnerResult>({\n config: params.config,\n base: { id: 'console' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n responseType: 'json',\n body: params.body,\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 // This route is new, so there is no older backend that answers 204 with no\n // body for the same-owner case. `ConsoleClusterService.moveClusterOwner`\n // carries that case, and this one does not need it.\n return response.body!\n }\n\n /**\n * Runs one step of a cluster bulk operation on one cluster.\n *\n * Every outcome of the STEP answers 200, including a cluster that refused.\n * A thrown `HttpError` says that the CALL failed, and the caller then\n * leaves the cluster to run again.\n */\n public static async runClusterBulkStep(\n params: RunClusterBulkStepThroughApprovalRequest,\n ): Promise<ClusterBulkStepResultDto> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'ConsoleApprovalsM2MService.runClusterBulkStep',\n url: `api/admin/approvals/clusters/${params.params.clusterId}/bulk-step`,\n normalizedUrl: 'api/admin/approvals/clusters/:clusterId/bulk-step',\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'console', type: 'internal' },\n }\n\n const response = await request<ClusterBulkStepResultDto>({\n config: params.config,\n base: { id: 'console' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n responseType: 'json',\n body: params.body,\n })\n\n if (!response.ok || !response.body) {\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 /**\n * Posts the Slack message that ends an approved bulk plan update. The bulk\n * operation of console-backend posts the same message after its run.\n */\n public static async announceClusterBulkPlanUpdate(\n params: AnnounceClusterBulkPlanUpdateRequest,\n ): Promise<void> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'ConsoleApprovalsM2MService.announceClusterBulkPlanUpdate',\n url: 'api/admin/approvals/cluster-bulk/plan-update-announcement',\n normalizedUrl:\n 'api/admin/approvals/cluster-bulk/plan-update-announcement',\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'console', type: 'internal' },\n }\n\n const response = await request<void>({\n config: params.config,\n base: { id: 'console' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n responseType: 'none',\n body: params.body,\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\n /** Deletes an internal (incident) backup of a cluster. It cannot be undone. */\n public static async deleteInternalBackup(\n params: DeleteInternalBackupThroughApprovalRequest,\n ): Promise<BackupDto> {\n const { clusterId, backupName } = params.params\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'ConsoleApprovalsM2MService.deleteInternalBackup',\n url: `api/admin/approvals/clusters/${clusterId}/internal-backups/${encodeURIComponent(backupName)}`,\n normalizedUrl:\n 'api/admin/approvals/clusters/:clusterId/internal-backups/:backupName',\n type: 'delete',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'console', type: 'internal' },\n }\n\n const response = await request<BackupDto>({\n config: params.config,\n base: { id: 'console' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n responseType: 'json',\n body: params.body,\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 return response.body!\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }