gdc-sdk-node-ts 0.9.0 → 0.12.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.
@@ -5,11 +5,13 @@ import path from 'node:path';
5
5
  import { buildAppHeaders, createBootstrapFacade, resolveAppInfo, } from 'gdc-sdk-core-ts';
6
6
  import { buildConsentClaimsSimpleWithCid } from 'gdc-common-utils-ts/utils/consent';
7
7
  import { pollUntilCompleteWithMethod } from './async-polling.js';
8
- import { confirmLegalOrganizationOrderWithDeps } from './host-onboarding.js';
8
+ import { confirmLegalOrganizationOrderWithDeps, HostLifecycleRequestType, HostedTenantLifecycleRequestType, submitHostedTenantLifecycleWithDeps, } from './host-onboarding.js';
9
9
  import { confirmIndividualOrganizationOrderWithDeps, } from './individual-onboarding.js';
10
10
  import { requestSmartTokenWithDeps } from './smart-token.js';
11
+ import { extractOfferIdFromResponseBody, extractOfferPreviewFromResponseBody, } from './order-offer-summary.js';
12
+ import { confirmOrganizationLicenseOrderWithDeps } from './organization-license-order.js';
11
13
  import { startIndividualOrganizationWithDeps } from './individual-start.js';
12
- import { createOrganizationEmployeeWithDeps, disableIndividualOrganizationWithDeps, disableOrganizationEmployeeWithDeps, grantProfessionalAccessWithDeps, ingestCommunicationAndUpdateIndexWithDeps, purgeIndividualOrganizationWithDeps, purgeOrganizationEmployeeWithDeps, searchOrganizationEmployeesWithDeps, searchClinicalBundleWithDeps, searchLatestIpsWithDeps, upsertRelatedPersonAndPollWithDeps, } from './resource-operations.js';
14
+ import { createOrganizationEmployeeWithDeps, disableIndividualMemberWithDeps, disableIndividualOrganizationWithDeps, disableOrganizationEmployeeWithDeps, listIndividualLicenseOffersWithDeps, listIndividualLicenseOrdersWithDeps, listIndividualLicensesWithDeps, listOrganizationLicenseOffersWithDeps, listOrganizationLicenseOrdersWithDeps, listOrganizationLicensesWithDeps, grantProfessionalAccessWithDeps, ingestCommunicationAndUpdateIndexWithDeps, purgeIndividualMemberWithDeps, purgeIndividualOrganizationWithDeps, purgeOrganizationEmployeeWithDeps, searchIndividualLicensesWithDeps, searchIndividualLicenseOffersWithDeps, searchIndividualLicenseOrdersWithDeps, searchOrganizationLicensesWithDeps, searchOrganizationLicenseOffersWithDeps, searchOrganizationLicenseOrdersWithDeps, searchOrganizationEmployeesWithDeps, searchClinicalBundleWithDeps, searchLatestIpsWithDeps, upsertRelatedPersonAndPollWithDeps, } from './resource-operations.js';
13
15
  import { submitAndPollWithMethods } from './orchestration/client-port.js';
14
16
  import { GwCoreLifecycleAction } from './constants/lifecycle.js';
15
17
  const bootstrapFacade = createBootstrapFacade();
@@ -152,6 +154,73 @@ export class HttpRuntimeClient {
152
154
  defaultIntervalMs: pollOptions?.intervalMs,
153
155
  });
154
156
  }
157
+ /**
158
+ * Disables the host registration itself after every hosted tenant has
159
+ * already been purged from the host registry.
160
+ */
161
+ async disableHost(hostCtx, input, pollOptions) {
162
+ return submitHostedTenantLifecycleWithDeps({
163
+ hostCtx,
164
+ input,
165
+ requestType: HostLifecycleRequestType.Disable,
166
+ submitPath: this.hostRegistryOrganizationDisablePath.bind(this),
167
+ pollPath: this.hostRegistryOrganizationDisablePollPath.bind(this),
168
+ thidPrefix: 'host-disable',
169
+ submitAndPoll: this.submitAndPoll.bind(this),
170
+ defaultTimeoutMs: pollOptions?.timeoutMs,
171
+ defaultIntervalMs: pollOptions?.intervalMs,
172
+ });
173
+ }
174
+ /**
175
+ * Purges the disabled host registration after the hosted tenant registry has
176
+ * become empty.
177
+ */
178
+ async purgeHost(hostCtx, input, pollOptions) {
179
+ return submitHostedTenantLifecycleWithDeps({
180
+ hostCtx,
181
+ input,
182
+ requestType: HostLifecycleRequestType.Purge,
183
+ submitPath: this.hostRegistryOrganizationPurgePath.bind(this),
184
+ pollPath: this.hostRegistryOrganizationPurgePollPath.bind(this),
185
+ thidPrefix: 'host-purge',
186
+ submitAndPoll: this.submitAndPoll.bind(this),
187
+ defaultTimeoutMs: pollOptions?.timeoutMs,
188
+ defaultIntervalMs: pollOptions?.intervalMs,
189
+ });
190
+ }
191
+ /**
192
+ * Disables one hosted tenant through the host registry after its descendants
193
+ * have already been disabled/purged.
194
+ */
195
+ async disableTenant(hostCtx, input, pollOptions) {
196
+ return submitHostedTenantLifecycleWithDeps({
197
+ hostCtx,
198
+ input,
199
+ requestType: HostedTenantLifecycleRequestType.Disable,
200
+ submitPath: this.hostRegistryOrganizationDisablePath.bind(this),
201
+ pollPath: this.hostRegistryOrganizationDisablePollPath.bind(this),
202
+ thidPrefix: 'tenant-disable',
203
+ submitAndPoll: this.submitAndPoll.bind(this),
204
+ defaultTimeoutMs: pollOptions?.timeoutMs,
205
+ defaultIntervalMs: pollOptions?.intervalMs,
206
+ });
207
+ }
208
+ /**
209
+ * Purges one already-disabled hosted tenant through the host registry.
210
+ */
211
+ async purgeTenant(hostCtx, input, pollOptions) {
212
+ return submitHostedTenantLifecycleWithDeps({
213
+ hostCtx,
214
+ input,
215
+ requestType: HostedTenantLifecycleRequestType.Purge,
216
+ submitPath: this.hostRegistryOrganizationPurgePath.bind(this),
217
+ pollPath: this.hostRegistryOrganizationPurgePollPath.bind(this),
218
+ thidPrefix: 'tenant-purge',
219
+ submitAndPoll: this.submitAndPoll.bind(this),
220
+ defaultTimeoutMs: pollOptions?.timeoutMs,
221
+ defaultIntervalMs: pollOptions?.intervalMs,
222
+ });
223
+ }
155
224
  /**
156
225
  * Creates an employee or professional entry under an existing organization tenant.
157
226
  */
@@ -210,6 +279,77 @@ export class HttpRuntimeClient {
210
279
  submitAndPoll: this.submitAndPoll.bind(this),
211
280
  });
212
281
  }
282
+ /**
283
+ * Searches organization-owned license seats through the canonical
284
+ * `License/_search` route.
285
+ */
286
+ async searchOrganizationLicenses(ctx, input) {
287
+ return searchOrganizationLicensesWithDeps(ctx, input, {
288
+ organizationLicenseSearchPath: this.organizationLicenseSearchPath.bind(this),
289
+ organizationLicenseSearchPollPath: this.organizationLicenseSearchPollPath.bind(this),
290
+ submitAndPoll: this.submitAndPoll.bind(this),
291
+ });
292
+ }
293
+ /**
294
+ * Lists organization-owned license seats using the same `License/_search`
295
+ * route with optional filters.
296
+ */
297
+ async listOrganizationLicenses(ctx, input = {}) {
298
+ return listOrganizationLicensesWithDeps(ctx, input, {
299
+ organizationLicenseSearchPath: this.organizationLicenseSearchPath.bind(this),
300
+ organizationLicenseSearchPollPath: this.organizationLicenseSearchPollPath.bind(this),
301
+ submitAndPoll: this.submitAndPoll.bind(this),
302
+ });
303
+ }
304
+ async searchOrganizationLicenseOffers(ctx, input) {
305
+ return searchOrganizationLicenseOffersWithDeps(ctx, input, {
306
+ organizationLicenseOfferSearchPath: this.organizationLicenseOfferSearchPath.bind(this),
307
+ organizationLicenseOfferSearchPollPath: this.organizationLicenseOfferSearchPollPath.bind(this),
308
+ submitAndPoll: this.submitAndPoll.bind(this),
309
+ });
310
+ }
311
+ async listOrganizationLicenseOffers(ctx, input = {}) {
312
+ return listOrganizationLicenseOffersWithDeps(ctx, input, {
313
+ organizationLicenseOfferSearchPath: this.organizationLicenseOfferSearchPath.bind(this),
314
+ organizationLicenseOfferSearchPollPath: this.organizationLicenseOfferSearchPollPath.bind(this),
315
+ submitAndPoll: this.submitAndPoll.bind(this),
316
+ });
317
+ }
318
+ async searchOrganizationLicenseOrders(ctx, input) {
319
+ return searchOrganizationLicenseOrdersWithDeps(ctx, input, {
320
+ organizationLicenseOrderSearchPath: this.organizationLicenseOrderSearchPath.bind(this),
321
+ organizationLicenseOrderSearchPollPath: this.organizationLicenseOrderSearchPollPath.bind(this),
322
+ submitAndPoll: this.submitAndPoll.bind(this),
323
+ });
324
+ }
325
+ async listOrganizationLicenseOrders(ctx, input = {}) {
326
+ return listOrganizationLicenseOrdersWithDeps(ctx, input, {
327
+ organizationLicenseOrderSearchPath: this.organizationLicenseOrderSearchPath.bind(this),
328
+ organizationLicenseOrderSearchPollPath: this.organizationLicenseOrderSearchPollPath.bind(this),
329
+ submitAndPoll: this.submitAndPoll.bind(this),
330
+ });
331
+ }
332
+ /**
333
+ * Confirms an already paid organization-side license order so additional
334
+ * seats become usable once GW CORE exposes the public converged route.
335
+ *
336
+ * Current runtime note:
337
+ * - search/list for organization license offers and orders already works
338
+ * - the public/write post-payment seat activation route is not wired yet
339
+ * - this method therefore fails explicitly instead of guessing a transport
340
+ * contract that is not stable in GW CORE
341
+ */
342
+ async confirmOrganizationLicenseOrder(ctx, input, pollOptions) {
343
+ return confirmOrganizationLicenseOrderWithDeps({
344
+ routeCtx: ctx,
345
+ input,
346
+ defaultTimeoutMs: pollOptions?.timeoutMs,
347
+ defaultIntervalMs: pollOptions?.intervalMs,
348
+ hostRegistryOrderBatchPath: this.hostRegistryOrderBatchPath.bind(this),
349
+ hostRegistryOrderPollPath: this.hostRegistryOrderPollPath.bind(this),
350
+ submitAndPoll: this.submitAndPoll.bind(this),
351
+ });
352
+ }
213
353
  /**
214
354
  * Starts the onboarding flow for an individual-oriented tenant or index.
215
355
  */
@@ -221,8 +361,8 @@ export class HttpRuntimeClient {
221
361
  individualFamilyOrganizationBatchPath: this.individualFamilyOrganizationTransactionPath.bind(this),
222
362
  individualFamilyOrganizationPollPath: this.individualFamilyOrganizationTransactionPollPath.bind(this),
223
363
  submitAndPoll: this.submitAndPoll.bind(this),
224
- getOfferIdFromResponse: (result) => this.extractOfferId(result.poll.body),
225
- getOfferPreviewFromResponse: () => ({}),
364
+ getOfferIdFromResponse: (result) => extractOfferIdFromResponseBody(result.poll.body),
365
+ getOfferPreviewFromResponse: (result) => extractOfferPreviewFromResponseBody(result.poll.body),
226
366
  });
227
367
  }
228
368
  /**
@@ -277,13 +417,65 @@ export class HttpRuntimeClient {
277
417
  return this.purgeIndividualOrganization(ctx, input, pollOptions);
278
418
  }
279
419
  /**
280
- * Placeholder for a future GW CORE member/caregiver lifecycle contract.
281
- *
282
- * Current GW CORE does not yet expose a stable lifecycle route for
283
- * `RelatedPerson` / individual-member disable.
420
+ * Soft-disables a `RelatedPerson` membership/contact using the current
421
+ * public batch-update path and `RelatedPerson.active = false`.
284
422
  */
285
- async disableIndividualMember(_ctx, _input, _pollOptions) {
286
- throw new Error('disableIndividualMember is not supported by the current GW CORE contract. TODO(gw-core-lifecycle-target-member-disable).');
423
+ async disableIndividualMember(ctx, input, pollOptions) {
424
+ return disableIndividualMemberWithDeps(ctx, input, pollOptions, {
425
+ individualRelatedPersonBatchPath: this.individualRelatedPersonBatchPath.bind(this),
426
+ individualRelatedPersonPollPath: this.individualRelatedPersonPollPath.bind(this),
427
+ submitAndPoll: this.submitAndPoll.bind(this),
428
+ });
429
+ }
430
+ /**
431
+ * Searches individual/family-side license seats through the canonical
432
+ * `License/_search` route.
433
+ */
434
+ async searchIndividualLicenses(ctx, input) {
435
+ return searchIndividualLicensesWithDeps(ctx, input, {
436
+ individualLicenseSearchPath: this.individualLicenseSearchPath.bind(this),
437
+ individualLicenseSearchPollPath: this.individualLicenseSearchPollPath.bind(this),
438
+ submitAndPoll: this.submitAndPoll.bind(this),
439
+ });
440
+ }
441
+ /**
442
+ * Lists individual/family-side license seats using the same search route
443
+ * with optional filters.
444
+ */
445
+ async listIndividualLicenses(ctx, input = {}) {
446
+ return listIndividualLicensesWithDeps(ctx, input, {
447
+ individualLicenseSearchPath: this.individualLicenseSearchPath.bind(this),
448
+ individualLicenseSearchPollPath: this.individualLicenseSearchPollPath.bind(this),
449
+ submitAndPoll: this.submitAndPoll.bind(this),
450
+ });
451
+ }
452
+ async searchIndividualLicenseOffers(ctx, input) {
453
+ return searchIndividualLicenseOffersWithDeps(ctx, input, {
454
+ individualLicenseOfferSearchPath: this.individualLicenseOfferSearchPath.bind(this),
455
+ individualLicenseOfferSearchPollPath: this.individualLicenseOfferSearchPollPath.bind(this),
456
+ submitAndPoll: this.submitAndPoll.bind(this),
457
+ });
458
+ }
459
+ async listIndividualLicenseOffers(ctx, input = {}) {
460
+ return listIndividualLicenseOffersWithDeps(ctx, input, {
461
+ individualLicenseOfferSearchPath: this.individualLicenseOfferSearchPath.bind(this),
462
+ individualLicenseOfferSearchPollPath: this.individualLicenseOfferSearchPollPath.bind(this),
463
+ submitAndPoll: this.submitAndPoll.bind(this),
464
+ });
465
+ }
466
+ async searchIndividualLicenseOrders(ctx, input) {
467
+ return searchIndividualLicenseOrdersWithDeps(ctx, input, {
468
+ individualLicenseOrderSearchPath: this.individualLicenseOrderSearchPath.bind(this),
469
+ individualLicenseOrderSearchPollPath: this.individualLicenseOrderSearchPollPath.bind(this),
470
+ submitAndPoll: this.submitAndPoll.bind(this),
471
+ });
472
+ }
473
+ async listIndividualLicenseOrders(ctx, input = {}) {
474
+ return listIndividualLicenseOrdersWithDeps(ctx, input, {
475
+ individualLicenseOrderSearchPath: this.individualLicenseOrderSearchPath.bind(this),
476
+ individualLicenseOrderSearchPollPath: this.individualLicenseOrderSearchPollPath.bind(this),
477
+ submitAndPoll: this.submitAndPoll.bind(this),
478
+ });
287
479
  }
288
480
  /**
289
481
  * Placeholder for a future GW CORE member/caregiver lifecycle contract.
@@ -291,8 +483,12 @@ export class HttpRuntimeClient {
291
483
  * Current GW CORE does not yet expose a stable lifecycle route for
292
484
  * `RelatedPerson` / individual-member purge.
293
485
  */
294
- async purgeIndividualMember(_ctx, _input, _pollOptions) {
295
- throw new Error('purgeIndividualMember is not supported by the current GW CORE contract. TODO(gw-core-lifecycle-target-member-purge).');
486
+ async purgeIndividualMember(ctx, input, pollOptions) {
487
+ return purgeIndividualMemberWithDeps(ctx, input, pollOptions, {
488
+ individualRelatedPersonPurgePath: this.individualRelatedPersonPurgePath.bind(this),
489
+ individualRelatedPersonPurgePollPath: this.individualRelatedPersonPurgePollPath.bind(this),
490
+ submitAndPoll: this.submitAndPoll.bind(this),
491
+ });
296
492
  }
297
493
  /**
298
494
  * Creates and submits a consent-oriented access grant for a professional actor.
@@ -390,6 +586,12 @@ export class HttpRuntimeClient {
390
586
  searchClinicalBundle: this.searchClinicalBundle.bind(this),
391
587
  });
392
588
  }
589
+ /**
590
+ * Preferred runtime alias for latest-IPS retrieval used by shared facades.
591
+ */
592
+ async getLatestIps(ctx, input) {
593
+ return this.searchLatestIps(ctx, input);
594
+ }
393
595
  /**
394
596
  * Searches a communication/document thread using `thid` and returns the
395
597
  * indexed communication/document projections.
@@ -535,12 +737,22 @@ export class HttpRuntimeClient {
535
737
  }
536
738
  hostRegistryOrganizationActivatePath(ctx) { return this.hostRegistryPath(ctx, 'Organization', '_activate'); }
537
739
  hostRegistryOrganizationActivatePollPath(ctx) { return this.hostRegistryPath(ctx, 'Organization', '_activate-response'); }
740
+ hostRegistryOrganizationDisablePath(ctx) { return this.hostRegistryPath(ctx, 'Organization', GwCoreLifecycleAction.Disable); }
741
+ hostRegistryOrganizationDisablePollPath(ctx) { return this.hostRegistryPath(ctx, 'Organization', `${GwCoreLifecycleAction.Disable}-response`); }
742
+ hostRegistryOrganizationPurgePath(ctx) { return this.hostRegistryPath(ctx, 'Organization', GwCoreLifecycleAction.Purge); }
743
+ hostRegistryOrganizationPurgePollPath(ctx) { return this.hostRegistryPath(ctx, 'Organization', `${GwCoreLifecycleAction.Purge}-response`); }
538
744
  hostRegistryOrderBatchPath(ctx) { return this.hostRegistryPath(ctx, 'Order', '_batch'); }
539
745
  hostRegistryOrderPollPath(ctx) { return this.hostRegistryPath(ctx, 'Order', '_batch-response'); }
540
746
  employeeBatchPath(ctx) { return this.v1Path(ctx, 'entity', 'org.schema', 'Employee', GwCoreLifecycleAction.Batch); }
541
747
  employeePollPath(ctx) { return this.v1Path(ctx, 'entity', 'org.schema', 'Employee', GwCoreLifecycleAction.BatchResponse); }
542
748
  employeeSearchPath(ctx) { return this.v1Path(ctx, 'entity', 'org.schema', 'Employee', '_search'); }
543
749
  employeeSearchPollPath(ctx) { return this.v1Path(ctx, 'entity', 'org.schema', 'Employee', '_search-response'); }
750
+ organizationLicenseSearchPath(ctx) { return this.v1Path(ctx, 'entity', 'org.schema', 'License', '_search'); }
751
+ organizationLicenseSearchPollPath(ctx) { return this.v1Path(ctx, 'entity', 'org.schema', 'License', '_search-response'); }
752
+ organizationLicenseOfferSearchPath(ctx) { return this.v1Path(ctx, 'entity', 'org.schema', 'Offer', '_search'); }
753
+ organizationLicenseOfferSearchPollPath(ctx) { return this.v1Path(ctx, 'entity', 'org.schema', 'Offer', '_search-response'); }
754
+ organizationLicenseOrderSearchPath(ctx) { return this.v1Path(ctx, 'entity', 'org.schema', 'Order', '_search'); }
755
+ organizationLicenseOrderSearchPollPath(ctx) { return this.v1Path(ctx, 'entity', 'org.schema', 'Order', '_search-response'); }
544
756
  employeePurgePath(ctx) { return this.v1Path(ctx, 'entity', 'org.schema', 'Employee', GwCoreLifecycleAction.Purge); }
545
757
  employeePurgePollPath(ctx) { return this.v1Path(ctx, 'entity', 'org.schema', 'Employee', `${GwCoreLifecycleAction.Purge}-response`); }
546
758
  individualFamilyOrganizationBatchPath(ctx) { return this.v1Path(ctx, 'individual', 'org.schema', 'Organization', GwCoreLifecycleAction.Batch); }
@@ -551,10 +763,18 @@ export class HttpRuntimeClient {
551
763
  individualFamilyOrganizationDisablePollPath(ctx) { return this.v1Path(ctx, 'individual', 'org.schema', 'Organization', `${GwCoreLifecycleAction.Disable}-response`); }
552
764
  individualFamilyOrganizationPurgePath(ctx) { return this.v1Path(ctx, 'individual', 'org.schema', 'Organization', GwCoreLifecycleAction.Purge); }
553
765
  individualFamilyOrganizationPurgePollPath(ctx) { return this.v1Path(ctx, 'individual', 'org.schema', 'Organization', `${GwCoreLifecycleAction.Purge}-response`); }
766
+ individualLicenseSearchPath(ctx) { return this.v1Path(ctx, 'individual', 'org.schema', 'License', '_search'); }
767
+ individualLicenseSearchPollPath(ctx) { return this.v1Path(ctx, 'individual', 'org.schema', 'License', '_search-response'); }
768
+ individualLicenseOfferSearchPath(ctx) { return this.v1Path(ctx, 'individual', 'org.schema', 'Offer', '_search'); }
769
+ individualLicenseOfferSearchPollPath(ctx) { return this.v1Path(ctx, 'individual', 'org.schema', 'Offer', '_search-response'); }
770
+ individualLicenseOrderSearchPath(ctx) { return this.v1Path(ctx, 'individual', 'org.schema', 'Order', '_search'); }
771
+ individualLicenseOrderSearchPollPath(ctx) { return this.v1Path(ctx, 'individual', 'org.schema', 'Order', '_search-response'); }
554
772
  individualFamilyOrderBatchPath(ctx) { return this.v1Path(ctx, 'individual', 'org.schema', 'Order', '_batch'); }
555
773
  individualFamilyOrderPollPath(ctx) { return this.v1Path(ctx, 'individual', 'org.schema', 'Order', '_batch-response'); }
556
774
  individualRelatedPersonBatchPath(ctx) { return this.v1Path(ctx, 'individual', 'org.hl7.fhir.r4', 'RelatedPerson', '_batch'); }
557
775
  individualRelatedPersonPollPath(ctx) { return this.v1Path(ctx, 'individual', 'org.hl7.fhir.r4', 'RelatedPerson', '_batch-response'); }
776
+ individualRelatedPersonPurgePath(ctx) { return this.v1Path(ctx, 'individual', 'org.hl7.fhir.r4', 'RelatedPerson', '_purge'); }
777
+ individualRelatedPersonPurgePollPath(ctx) { return this.v1Path(ctx, 'individual', 'org.hl7.fhir.r4', 'RelatedPerson', '_purge-response'); }
558
778
  individualConsentR4BatchPath(ctx) { return this.v1Path(ctx, 'individual', 'org.hl7.fhir.r4', 'Consent', '_batch'); }
559
779
  individualConsentR4PollPath(ctx) { return this.v1Path(ctx, 'individual', 'org.hl7.fhir.r4', 'Consent', '_batch-response'); }
560
780
  individualCommunicationBatchPath(ctx, format) { return this.v1Path(ctx, 'individual', format, 'Communication', '_batch'); }
@@ -573,19 +793,6 @@ export class HttpRuntimeClient {
573
793
  identityOpenIdSmartTokenPollPath(ctx) {
574
794
  return `/${encodeURIComponent(ctx.tenantId)}/cds-${encodeURIComponent(ctx.jurisdiction)}/v1/${encodeURIComponent(ctx.sector)}/identity/openid/smart/_batch-response`;
575
795
  }
576
- extractOfferId(body) {
577
- const root = body || {};
578
- const bodyNode = root.body || root;
579
- const data = bodyNode.data || [];
580
- const first = data[0] || {};
581
- const firstMeta = first.meta || {};
582
- const resource = first.resource || {};
583
- const resourceMeta = resource.meta || {};
584
- const claims = firstMeta.claims
585
- || resourceMeta.claims
586
- || {};
587
- return String(claims['org.schema.Offer.identifier'] || '').trim() || undefined;
588
- }
589
796
  appendHttpTrace(entry) {
590
797
  if (!this.httpTraceFile)
591
798
  return;
@@ -1,10 +1,12 @@
1
1
  import type { ControllerBindingInput } from 'gdc-common-utils-ts/models';
2
+ import type { LicenseListRuntimeSearchInput, LicenseOfferRuntimeSearchInput, LicenseOrderRuntimeSearchInput } from '../resource-operations.js';
2
3
  import type { AsyncPollRequest, OrganizationActivationServiceOptions, PollOptions, PollResult, SubmitAndPollResult, SubmitPayload, SubmitResponse } from 'gdc-sdk-core-ts';
3
4
  export type { AsyncPollRequest, PollOptions, PollResult, SubmitAndPollResult, SubmitPayload, SubmitResponse, } from 'gdc-sdk-core-ts';
4
5
  import type { EmployeeDeviceActivationResult, EmployeeDeviceActivationRequestInput } from '../device-activation.js';
5
- import type { HostRouteContext, LegalOrganizationOrderInput } from '../host-onboarding.js';
6
+ import type { HostRouteContext, HostedTenantLifecycleInput, LegalOrganizationOrderInput } from '../host-onboarding.js';
6
7
  import type { IndividualOrganizationConfirmOrderInput, RouteContext } from '../individual-onboarding.js';
7
8
  import type { IndividualOrganizationBootstrapInput, IndividualOrganizationStartResult } from '../individual-start.js';
9
+ import type { OrganizationLicenseOrderConfirmInput } from '../organization-license-order.js';
8
10
  import type { SmartTokenExchangeResult, SmartTokenRequestInput } from '../smart-token.js';
9
11
  import type { CommunicationIngestionInput, ClinicalBundleSearchInput, DigitalTwinGenerationInput, GrantProfessionalAccessInput, GrantProfessionalAccessResult, IndividualMemberLifecycleInput, IndividualOrganizationLifecycleInput, IpsOrFhirImportInput, OrganizationEmployeeCreationInput, OrganizationEmployeeLifecycleInput, OrganizationEmployeeSearchInput, RelatedPersonUpsertInput } from '../resource-operations.js';
10
12
  /**
@@ -29,8 +31,19 @@ export type NodeOrganizationActivationInput = {
29
31
  export type RuntimeClient = {
30
32
  activateOrganizationInGatewayFromIcaProof?: (hostCtx: HostRouteContext, input: NodeOrganizationActivationInput, pollOptions?: PollOptions) => Promise<SubmitAndPollResult>;
31
33
  confirmLegalOrganizationOrder?: (hostCtx: HostRouteContext, input: LegalOrganizationOrderInput, pollOptions?: PollOptions) => Promise<SubmitAndPollResult>;
34
+ disableHost?: (hostCtx: HostRouteContext, input: HostedTenantLifecycleInput, pollOptions?: PollOptions) => Promise<SubmitAndPollResult>;
35
+ purgeHost?: (hostCtx: HostRouteContext, input: HostedTenantLifecycleInput, pollOptions?: PollOptions) => Promise<SubmitAndPollResult>;
36
+ disableTenant?: (hostCtx: HostRouteContext, input: HostedTenantLifecycleInput, pollOptions?: PollOptions) => Promise<SubmitAndPollResult>;
37
+ purgeTenant?: (hostCtx: HostRouteContext, input: HostedTenantLifecycleInput, pollOptions?: PollOptions) => Promise<SubmitAndPollResult>;
32
38
  createOrganizationEmployee?: (ctx: RouteContext, input: OrganizationEmployeeCreationInput, pollOptions?: PollOptions) => Promise<SubmitAndPollResult>;
33
39
  searchOrganizationEmployees?: (ctx: RouteContext, input: OrganizationEmployeeSearchInput) => Promise<SubmitAndPollResult>;
40
+ searchOrganizationLicenses?: (ctx: RouteContext, input: LicenseListRuntimeSearchInput) => Promise<SubmitAndPollResult>;
41
+ listOrganizationLicenses?: (ctx: RouteContext, input?: LicenseListRuntimeSearchInput) => Promise<SubmitAndPollResult>;
42
+ searchOrganizationLicenseOffers?: (ctx: RouteContext, input: LicenseOfferRuntimeSearchInput) => Promise<SubmitAndPollResult>;
43
+ listOrganizationLicenseOffers?: (ctx: RouteContext, input?: LicenseOfferRuntimeSearchInput) => Promise<SubmitAndPollResult>;
44
+ searchOrganizationLicenseOrders?: (ctx: RouteContext, input: LicenseOrderRuntimeSearchInput) => Promise<SubmitAndPollResult>;
45
+ listOrganizationLicenseOrders?: (ctx: RouteContext, input?: LicenseOrderRuntimeSearchInput) => Promise<SubmitAndPollResult>;
46
+ confirmOrganizationLicenseOrder?: (ctx: RouteContext, input: OrganizationLicenseOrderConfirmInput, pollOptions?: PollOptions) => Promise<SubmitAndPollResult>;
34
47
  disableEmployee?: (ctx: RouteContext, input: OrganizationEmployeeLifecycleInput, pollOptions?: PollOptions) => Promise<SubmitAndPollResult>;
35
48
  purgeEmployee?: (ctx: RouteContext, input: OrganizationEmployeeLifecycleInput, pollOptions?: PollOptions) => Promise<SubmitAndPollResult>;
36
49
  disableOrganizationEmployee?: (ctx: RouteContext, input: OrganizationEmployeeLifecycleInput, pollOptions?: PollOptions) => Promise<SubmitAndPollResult>;
@@ -47,11 +60,18 @@ export type RuntimeClient = {
47
60
  purgeIndividualOrganization?: (ctx: RouteContext, input: IndividualOrganizationLifecycleInput, pollOptions?: PollOptions) => Promise<SubmitAndPollResult>;
48
61
  ingestCommunicationAndUpdateIndex?: (ctx: RouteContext, input: CommunicationIngestionInput) => Promise<SubmitAndPollResult>;
49
62
  grantProfessionalAccess?: (ctx: RouteContext, input: GrantProfessionalAccessInput) => Promise<GrantProfessionalAccessResult>;
63
+ searchIndividualLicenses?: (ctx: RouteContext, input: LicenseListRuntimeSearchInput) => Promise<SubmitAndPollResult>;
64
+ listIndividualLicenses?: (ctx: RouteContext, input?: LicenseListRuntimeSearchInput) => Promise<SubmitAndPollResult>;
65
+ searchIndividualLicenseOffers?: (ctx: RouteContext, input: LicenseOfferRuntimeSearchInput) => Promise<SubmitAndPollResult>;
66
+ listIndividualLicenseOffers?: (ctx: RouteContext, input?: LicenseOfferRuntimeSearchInput) => Promise<SubmitAndPollResult>;
67
+ searchIndividualLicenseOrders?: (ctx: RouteContext, input: LicenseOrderRuntimeSearchInput) => Promise<SubmitAndPollResult>;
68
+ listIndividualLicenseOrders?: (ctx: RouteContext, input?: LicenseOrderRuntimeSearchInput) => Promise<SubmitAndPollResult>;
50
69
  bootstrapIndividualOrganization?: (input: IndividualOrganizationBootstrapInput) => Promise<IndividualOrganizationStartResult>;
51
70
  importIpsOrFhirAndUpdateIndex?: (ctx: RouteContext, input: IpsOrFhirImportInput) => Promise<SubmitAndPollResult>;
52
71
  upsertRelatedPersonAndPoll?: (ctx: RouteContext, input: RelatedPersonUpsertInput) => Promise<SubmitAndPollResult>;
53
72
  generateDigitalTwinFromSubjectData?: (ctx: RouteContext, input: DigitalTwinGenerationInput) => Promise<SubmitAndPollResult>;
54
73
  searchClinicalBundle?: (ctx: RouteContext, input: ClinicalBundleSearchInput) => Promise<SubmitAndPollResult>;
74
+ getLatestIps?: (ctx: RouteContext, input: Omit<ClinicalBundleSearchInput, 'includedTypes'>) => Promise<SubmitAndPollResult>;
55
75
  submitBatch?: (submitPath: string, payload: SubmitPayload) => Promise<SubmitResponse>;
56
76
  pollUntilComplete?: (pollPath: string, request: AsyncPollRequest, pollOptions?: PollOptions) => Promise<PollResult>;
57
77
  submitAndPoll?: (submitPath: string, pollPath: string, payload: SubmitPayload, pollOptions?: PollOptions) => Promise<SubmitAndPollResult>;
@@ -1,13 +1,25 @@
1
- import { type NodeOrganizationActivationInput, type NodeRuntimeClient, type PollOptions, type SubmitAndPollResult, type SubmitPayload } from './client-port.js';
2
- import type { HostRouteContext, LegalOrganizationOrderInput } from '../host-onboarding.js';
3
- export declare class HostOnboardingSdk {
1
+ import { type NodeRuntimeClient, type NodeOrganizationActivationInput, type PollOptions, type SubmitAndPollResult, type SubmitPayload } from './client-port.js';
2
+ import type { HostingControllerFacade, HostLifecycleInput, HostRouteContext, LegalOrganizationOrderInput } from '../host-onboarding.js';
3
+ import type { NodeCapability } from '../session.js';
4
+ export declare class HostOnboardingSdk implements HostingControllerFacade {
4
5
  private readonly client;
5
- constructor(client: NodeRuntimeClient);
6
+ private readonly capabilities;
7
+ constructor(client: NodeRuntimeClient, capabilities?: readonly NodeCapability[]);
6
8
  /**
7
9
  * Submits the legal organization activation proof and required declared
8
10
  * service capabilities to GW CORE.
9
11
  */
10
12
  activateOrganizationInGatewayFromIcaProof(hostCtx: HostRouteContext, input: NodeOrganizationActivationInput, pollOptions?: PollOptions): Promise<SubmitAndPollResult>;
11
13
  confirmLegalOrganizationOrder(hostCtx: HostRouteContext, input: LegalOrganizationOrderInput, pollOptions?: PollOptions): Promise<SubmitAndPollResult>;
14
+ /**
15
+ * Disables the host registration after all hosted tenants have already been
16
+ * purged and the hosting operator should stop publishing discovery services.
17
+ */
18
+ disableHost(hostCtx: HostRouteContext, input: HostLifecycleInput, pollOptions?: PollOptions): Promise<SubmitAndPollResult>;
19
+ /**
20
+ * Purges the already-disabled host registration once no hosted tenants
21
+ * remain in the registry.
22
+ */
23
+ purgeHost(hostCtx: HostRouteContext, input: HostLifecycleInput, pollOptions?: PollOptions): Promise<SubmitAndPollResult>;
12
24
  submitAndPoll(submitPath: string, pollPath: string, payload: SubmitPayload, pollOptions?: PollOptions): Promise<SubmitAndPollResult>;
13
25
  }
@@ -1,20 +1,41 @@
1
1
  // Copyright 2026 Antifraud Services Inc. under the Apache License, Version 2.0.
2
2
  // Always create JSDoc, do not use strings inline in keys nor values, use types instead, and reuse the data test examples.
3
3
  import { requireClientMethod, submitAndPollWithClient, } from './client-port.js';
4
+ import { ActorCapabilities, ActorKinds } from 'gdc-common-utils-ts/constants/actor-session';
5
+ import { assertFacadeCapability } from './capability-guard.js';
4
6
  export class HostOnboardingSdk {
5
- constructor(client) {
7
+ constructor(client, capabilities = []) {
6
8
  this.client = client;
9
+ this.capabilities = capabilities;
7
10
  }
8
11
  /**
9
12
  * Submits the legal organization activation proof and required declared
10
13
  * service capabilities to GW CORE.
11
14
  */
12
15
  activateOrganizationInGatewayFromIcaProof(hostCtx, input, pollOptions) {
16
+ assertFacadeCapability(this.capabilities, ActorCapabilities.HostingActivateOrganization, ActorKinds.HostOnboarding, 'activateOrganizationInGatewayFromIcaProof');
13
17
  return requireClientMethod(this.client, 'activateOrganizationInGatewayFromIcaProof')(hostCtx, input, pollOptions);
14
18
  }
15
19
  confirmLegalOrganizationOrder(hostCtx, input, pollOptions) {
20
+ assertFacadeCapability(this.capabilities, ActorCapabilities.HostingConfirmOrder, ActorKinds.HostOnboarding, 'confirmLegalOrganizationOrder');
16
21
  return requireClientMethod(this.client, 'confirmLegalOrganizationOrder')(hostCtx, input, pollOptions);
17
22
  }
23
+ /**
24
+ * Disables the host registration after all hosted tenants have already been
25
+ * purged and the hosting operator should stop publishing discovery services.
26
+ */
27
+ disableHost(hostCtx, input, pollOptions) {
28
+ assertFacadeCapability(this.capabilities, ActorCapabilities.HostingDisableHost, ActorKinds.HostOnboarding, 'disableHost');
29
+ return requireClientMethod(this.client, 'disableHost')(hostCtx, input, pollOptions);
30
+ }
31
+ /**
32
+ * Purges the already-disabled host registration once no hosted tenants
33
+ * remain in the registry.
34
+ */
35
+ purgeHost(hostCtx, input, pollOptions) {
36
+ assertFacadeCapability(this.capabilities, ActorCapabilities.HostingPurgeHost, ActorKinds.HostOnboarding, 'purgeHost');
37
+ return requireClientMethod(this.client, 'purgeHost')(hostCtx, input, pollOptions);
38
+ }
18
39
  submitAndPoll(submitPath, pollPath, payload, pollOptions) {
19
40
  return submitAndPollWithClient(this.client, submitPath, pollPath, payload, pollOptions);
20
41
  }
@@ -2,7 +2,7 @@ import { type NodeRuntimeClient, type PollOptions, type SubmitAndPollResult, typ
2
2
  import type { IndividualOrganizationConfirmOrderInput, RouteContext } from '../individual-onboarding.js';
3
3
  import type { IndividualOrganizationBootstrapInput, IndividualOrganizationStartResult } from '../individual-start.js';
4
4
  import type { NodeCapability } from '../session.js';
5
- import type { CommunicationIngestionInput, DigitalTwinGenerationInput, GrantProfessionalAccessInput, GrantProfessionalAccessResult, IndividualMemberLifecycleInput, IndividualOrganizationLifecycleInput, IpsOrFhirImportInput, RelatedPersonUpsertInput } from '../resource-operations.js';
5
+ import type { ClinicalBundleSearchInput, CommunicationIngestionInput, DigitalTwinGenerationInput, GrantProfessionalAccessInput, GrantProfessionalAccessResult, IndividualMemberLifecycleInput, IndividualOrganizationLifecycleInput, IpsOrFhirImportInput, LicenseListRuntimeSearchInput, LicenseOfferRuntimeSearchInput, LicenseOrderRuntimeSearchInput, RelatedPersonUpsertInput } from '../resource-operations.js';
6
6
  import type { SmartTokenExchangeResult, SmartTokenRequestInput } from '../smart-token.js';
7
7
  /**
8
8
  * Individual-controller oriented facade over a `NodeRuntimeClient`.
@@ -75,6 +75,41 @@ export declare class IndividualControllerSdk {
75
75
  * Generates a digital twin projection from subject data.
76
76
  */
77
77
  generateDigitalTwinFromSubjectData(ctx: RouteContext, input: DigitalTwinGenerationInput): Promise<SubmitAndPollResult>;
78
+ /**
79
+ * Searches indexed clinical bundles for the current subject/controller context.
80
+ */
81
+ searchClinicalBundle(ctx: RouteContext, input: ClinicalBundleSearchInput): Promise<SubmitAndPollResult>;
82
+ /**
83
+ * Returns the latest IPS-oriented bundle for one subject.
84
+ */
85
+ getLatestIps(ctx: RouteContext, input: Omit<ClinicalBundleSearchInput, 'includedTypes'>): Promise<SubmitAndPollResult>;
86
+ /**
87
+ * Searches subject/individual-side license seats using semantic filters.
88
+ */
89
+ searchLicenses(ctx: RouteContext, input: LicenseListRuntimeSearchInput): Promise<SubmitAndPollResult>;
90
+ /**
91
+ * Lists subject/individual-side license seats with optional filters.
92
+ */
93
+ listLicenses(ctx: RouteContext, input?: LicenseListRuntimeSearchInput): Promise<SubmitAndPollResult>;
94
+ /**
95
+ * Searches commercial license offers known for the individual/family
96
+ * context.
97
+ */
98
+ searchLicenseOffers(ctx: RouteContext, input: LicenseOfferRuntimeSearchInput): Promise<SubmitAndPollResult>;
99
+ /**
100
+ * Lists commercial license offers known for the individual/family context.
101
+ */
102
+ listLicenseOffers(ctx: RouteContext, input?: LicenseOfferRuntimeSearchInput): Promise<SubmitAndPollResult>;
103
+ /**
104
+ * Searches commercial license orders/payment projections for the
105
+ * individual/family context.
106
+ */
107
+ searchLicenseOrders(ctx: RouteContext, input: LicenseOrderRuntimeSearchInput): Promise<SubmitAndPollResult>;
108
+ /**
109
+ * Lists commercial license orders/payment projections for the
110
+ * individual/family context.
111
+ */
112
+ listLicenseOrders(ctx: RouteContext, input?: LicenseOrderRuntimeSearchInput): Promise<SubmitAndPollResult>;
78
113
  /**
79
114
  * Requests a SMART/OpenID token for subsequent data access flows.
80
115
  */
@@ -113,6 +113,57 @@ export class IndividualControllerSdk {
113
113
  assertFacadeCapability(this.capabilities, ActorCapabilities.IndividualGenerateDigitalTwin, ActorKinds.IndividualController, 'generateDigitalTwinFromSubjectData');
114
114
  return requireClientMethod(this.client, 'generateDigitalTwinFromSubjectData')(ctx, input);
115
115
  }
116
+ /**
117
+ * Searches indexed clinical bundles for the current subject/controller context.
118
+ */
119
+ searchClinicalBundle(ctx, input) {
120
+ return requireClientMethod(this.client, 'searchClinicalBundle')(ctx, input);
121
+ }
122
+ /**
123
+ * Returns the latest IPS-oriented bundle for one subject.
124
+ */
125
+ getLatestIps(ctx, input) {
126
+ return requireClientMethod(this.client, 'getLatestIps')(ctx, input);
127
+ }
128
+ /**
129
+ * Searches subject/individual-side license seats using semantic filters.
130
+ */
131
+ searchLicenses(ctx, input) {
132
+ return requireClientMethod(this.client, 'searchIndividualLicenses')(ctx, input);
133
+ }
134
+ /**
135
+ * Lists subject/individual-side license seats with optional filters.
136
+ */
137
+ listLicenses(ctx, input = {}) {
138
+ return requireClientMethod(this.client, 'listIndividualLicenses')(ctx, input);
139
+ }
140
+ /**
141
+ * Searches commercial license offers known for the individual/family
142
+ * context.
143
+ */
144
+ searchLicenseOffers(ctx, input) {
145
+ return requireClientMethod(this.client, 'searchIndividualLicenseOffers')(ctx, input);
146
+ }
147
+ /**
148
+ * Lists commercial license offers known for the individual/family context.
149
+ */
150
+ listLicenseOffers(ctx, input = {}) {
151
+ return requireClientMethod(this.client, 'listIndividualLicenseOffers')(ctx, input);
152
+ }
153
+ /**
154
+ * Searches commercial license orders/payment projections for the
155
+ * individual/family context.
156
+ */
157
+ searchLicenseOrders(ctx, input) {
158
+ return requireClientMethod(this.client, 'searchIndividualLicenseOrders')(ctx, input);
159
+ }
160
+ /**
161
+ * Lists commercial license orders/payment projections for the
162
+ * individual/family context.
163
+ */
164
+ listLicenseOrders(ctx, input = {}) {
165
+ return requireClientMethod(this.client, 'listIndividualLicenseOrders')(ctx, input);
166
+ }
116
167
  /**
117
168
  * Requests a SMART/OpenID token for subsequent data access flows.
118
169
  */