@openhi/constructs 0.0.126 → 0.0.128

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 (81) hide show
  1. package/lib/{chunk-ZHMHLK3S.mjs → chunk-7BQHLC7U.mjs} +3 -3
  2. package/lib/{chunk-7WDX6GPO.mjs → chunk-AWYZJFPL.mjs} +3 -3
  3. package/lib/{chunk-AHYQFT4N.mjs → chunk-E6MCKJVS.mjs} +3 -3
  4. package/lib/{chunk-W4KR4CSL.mjs → chunk-M7Y3BOQW.mjs} +2 -2
  5. package/lib/chunk-M7Y3BOQW.mjs.map +1 -0
  6. package/lib/{chunk-U7L7T4XU.mjs → chunk-MVQWAIMC.mjs} +2 -2
  7. package/lib/{chunk-U7L7T4XU.mjs.map → chunk-MVQWAIMC.mjs.map} +1 -1
  8. package/lib/{chunk-VXX4I3EF.mjs → chunk-SVXLZCF7.mjs} +1 -1
  9. package/lib/{chunk-VXX4I3EF.mjs.map → chunk-SVXLZCF7.mjs.map} +1 -1
  10. package/lib/{chunk-YYRWDEG4.mjs → chunk-UT7ADSEJ.mjs} +3 -3
  11. package/lib/{chunk-YYRWDEG4.mjs.map → chunk-UT7ADSEJ.mjs.map} +1 -1
  12. package/lib/{chunk-6NBGYGFL.mjs → chunk-VZCPGQXA.mjs} +13 -12
  13. package/lib/chunk-VZCPGQXA.mjs.map +1 -0
  14. package/lib/{chunk-WXS3PUHR.mjs → chunk-WGA43MMY.mjs} +4 -4
  15. package/lib/{chunk-WQWFVEVX.mjs → chunk-X5E4YJGZ.mjs} +2 -2
  16. package/lib/{chunk-KO64HPWQ.mjs → chunk-ZWSGM6PZ.mjs} +2 -2
  17. package/lib/delete-chunk.handler.d.mts +1 -1
  18. package/lib/delete-chunk.handler.d.ts +1 -1
  19. package/lib/delete-chunk.handler.js +12 -11
  20. package/lib/delete-chunk.handler.js.map +1 -1
  21. package/lib/delete-chunk.handler.mjs +2 -2
  22. package/lib/delete-chunk.handler.mjs.map +1 -1
  23. package/lib/{events-BfrkMoBD.d.mts → events-COI0BuMM.d.mts} +1 -1
  24. package/lib/{events-BfrkMoBD.d.ts → events-COI0BuMM.d.ts} +1 -1
  25. package/lib/index.d.mts +55 -12
  26. package/lib/index.d.ts +56 -13
  27. package/lib/index.js +127 -81
  28. package/lib/index.js.map +1 -1
  29. package/lib/index.mjs +118 -71
  30. package/lib/index.mjs.map +1 -1
  31. package/lib/list-chunks.handler.d.mts +1 -1
  32. package/lib/list-chunks.handler.d.ts +1 -1
  33. package/lib/list-chunks.handler.js +12 -11
  34. package/lib/list-chunks.handler.js.map +1 -1
  35. package/lib/list-chunks.handler.mjs +2 -2
  36. package/lib/list-chunks.handler.mjs.map +1 -1
  37. package/lib/platform-deploy-bridge.handler.d.mts +1 -1
  38. package/lib/platform-deploy-bridge.handler.d.ts +1 -1
  39. package/lib/platform-deploy-bridge.handler.js.map +1 -1
  40. package/lib/platform-deploy-bridge.handler.mjs +1 -1
  41. package/lib/pre-token-generation.handler.js +12 -11
  42. package/lib/pre-token-generation.handler.js.map +1 -1
  43. package/lib/pre-token-generation.handler.mjs +4 -4
  44. package/lib/provision-default-workspace.handler.js +12 -11
  45. package/lib/provision-default-workspace.handler.js.map +1 -1
  46. package/lib/provision-default-workspace.handler.mjs +4 -4
  47. package/lib/rename-list-targets.handler.d.mts +1 -1
  48. package/lib/rename-list-targets.handler.d.ts +1 -1
  49. package/lib/rename-list-targets.handler.js +12 -11
  50. package/lib/rename-list-targets.handler.js.map +1 -1
  51. package/lib/rename-list-targets.handler.mjs +2 -2
  52. package/lib/rename-list-targets.handler.mjs.map +1 -1
  53. package/lib/rename-rewrite-chunk.handler.d.mts +1 -1
  54. package/lib/rename-rewrite-chunk.handler.d.ts +1 -1
  55. package/lib/rename-rewrite-chunk.handler.js +12 -11
  56. package/lib/rename-rewrite-chunk.handler.js.map +1 -1
  57. package/lib/rename-rewrite-chunk.handler.mjs +2 -2
  58. package/lib/rename-rewrite-chunk.handler.mjs.map +1 -1
  59. package/lib/rest-api-lambda.handler.js +12 -11
  60. package/lib/rest-api-lambda.handler.js.map +1 -1
  61. package/lib/rest-api-lambda.handler.mjs +7 -7
  62. package/lib/rest-api-lambda.handler.mjs.map +1 -1
  63. package/lib/seed-demo-data.handler.js +12 -11
  64. package/lib/seed-demo-data.handler.js.map +1 -1
  65. package/lib/seed-demo-data.handler.mjs +5 -5
  66. package/lib/seed-system-data.handler.js +12 -11
  67. package/lib/seed-system-data.handler.js.map +1 -1
  68. package/lib/seed-system-data.handler.mjs +2 -2
  69. package/lib/static-hosting.viewer-request-handler.d.mts +1 -1
  70. package/lib/static-hosting.viewer-request-handler.d.ts +1 -1
  71. package/lib/static-hosting.viewer-request-handler.js.map +1 -1
  72. package/lib/static-hosting.viewer-request-handler.mjs.map +1 -1
  73. package/package.json +7 -7
  74. package/lib/chunk-6NBGYGFL.mjs.map +0 -1
  75. package/lib/chunk-W4KR4CSL.mjs.map +0 -1
  76. /package/lib/{chunk-ZHMHLK3S.mjs.map → chunk-7BQHLC7U.mjs.map} +0 -0
  77. /package/lib/{chunk-7WDX6GPO.mjs.map → chunk-AWYZJFPL.mjs.map} +0 -0
  78. /package/lib/{chunk-AHYQFT4N.mjs.map → chunk-E6MCKJVS.mjs.map} +0 -0
  79. /package/lib/{chunk-WXS3PUHR.mjs.map → chunk-WGA43MMY.mjs.map} +0 -0
  80. /package/lib/{chunk-WQWFVEVX.mjs.map → chunk-X5E4YJGZ.mjs.map} +0 -0
  81. /package/lib/{chunk-KO64HPWQ.mjs.map → chunk-ZWSGM6PZ.mjs.map} +0 -0
@@ -3,11 +3,11 @@ import {
3
3
  dispatchListMode,
4
4
  getDynamoDataService,
5
5
  listDataEntitiesByWorkspace
6
- } from "./chunk-U7L7T4XU.mjs";
6
+ } from "./chunk-MVQWAIMC.mjs";
7
7
  import {
8
8
  SHARD_COUNT,
9
9
  getDynamoControlService
10
- } from "./chunk-6NBGYGFL.mjs";
10
+ } from "./chunk-VZCPGQXA.mjs";
11
11
 
12
12
  // src/data/operations/data/practitionerrole/practitionerrole-list-operation.ts
13
13
  async function listPractitionerRolesOperation(params) {
@@ -93,4 +93,4 @@ export {
93
93
  listMembershipsOperation,
94
94
  listRoleAssignmentsOperation
95
95
  };
96
- //# sourceMappingURL=chunk-ZHMHLK3S.mjs.map
96
+ //# sourceMappingURL=chunk-7BQHLC7U.mjs.map
@@ -13,14 +13,14 @@ import {
13
13
  DATA_ENTITY_SK,
14
14
  createDataEntityRecord,
15
15
  getDynamoDataService
16
- } from "./chunk-U7L7T4XU.mjs";
16
+ } from "./chunk-MVQWAIMC.mjs";
17
17
  import {
18
18
  ConflictError,
19
19
  ValidationError
20
20
  } from "./chunk-FYHBHHWK.mjs";
21
21
  import {
22
22
  getDynamoControlService
23
- } from "./chunk-6NBGYGFL.mjs";
23
+ } from "./chunk-VZCPGQXA.mjs";
24
24
 
25
25
  // src/data/operations/control/membership/membership-create-operation.ts
26
26
  import {
@@ -386,4 +386,4 @@ export {
386
386
  createTenantOperation,
387
387
  createWorkspaceOperation
388
388
  };
389
- //# sourceMappingURL=chunk-7WDX6GPO.mjs.map
389
+ //# sourceMappingURL=chunk-AWYZJFPL.mjs.map
@@ -2,13 +2,13 @@ import {
2
2
  createDataEntityRecord,
3
3
  getDynamoDataService,
4
4
  mergeAuditIntoMeta
5
- } from "./chunk-U7L7T4XU.mjs";
5
+ } from "./chunk-MVQWAIMC.mjs";
6
6
  import {
7
7
  NotFoundError
8
8
  } from "./chunk-FYHBHHWK.mjs";
9
9
  import {
10
10
  getDynamoControlService
11
- } from "./chunk-6NBGYGFL.mjs";
11
+ } from "./chunk-VZCPGQXA.mjs";
12
12
 
13
13
  // src/data/operations/control/role/role-get-by-id-operation.ts
14
14
  async function getRoleByIdOperation(params) {
@@ -209,4 +209,4 @@ export {
209
209
  createPatientOperation,
210
210
  createPractitionerOperation
211
211
  };
212
- //# sourceMappingURL=chunk-AHYQFT4N.mjs.map
212
+ //# sourceMappingURL=chunk-E6MCKJVS.mjs.map
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-QJDHVMKT.mjs";
8
8
  import {
9
9
  getDynamoControlService
10
- } from "./chunk-6NBGYGFL.mjs";
10
+ } from "./chunk-VZCPGQXA.mjs";
11
11
  import {
12
12
  __toESM
13
13
  } from "./chunk-LZOMFHX3.mjs";
@@ -233,4 +233,4 @@ export {
233
233
  OWNING_DELETE_PROJECTION_ENTITY,
234
234
  listOwningChildProjectionsOperation
235
235
  };
236
- //# sourceMappingURL=chunk-W4KR4CSL.mjs.map
236
+ //# sourceMappingURL=chunk-M7Y3BOQW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/data/operations/control/owning-delete/owning-delete-batch-delete-operation.ts","../src/data/operations/control/owning-delete/owning-delete-list-child-projections-operation.ts"],"sourcesContent":["/**\n * Atomic chunk delete for the TR-022 hard-delete cascade.\n *\n * Each cascade Map iteration receives up to\n * {@link OWNING_DELETE_CASCADE_CHUNK_SIZE} projection rows tagged with\n * their projection entity and submits them all in a single\n * `TransactWriteItems` via the operations-layer multi-write helper\n * (#1010). All-or-nothing semantics: every row in the chunk lands or\n * none does.\n *\n * Idempotency: per TR-022 Choice 5A, replayed chunks fail the\n * `attribute_exists(PK)` condition (or are absorbed by the helper's\n * cancellation handling) and the state-machine `Catch` treats\n * `TransactionCanceledException` as a no-op success. The outer loop\n * keeps walking the partition until `Query` returns zero items.\n *\n * @see .state/adr-018-implementation-guide.md section 4 (Step Functions Map shape)\n * @see ../multi-write-operation.ts (executeMultiWrite)\n * @see .claude/rules/data-layer-layout.md\n */\n\nimport {\n type OwningChildProjectionRow,\n type OwningDeleteProjectionEntity,\n} from \"./owning-delete-list-child-projections-operation\";\nimport { getDynamoControlService } from \"../../../dynamo/dynamo-control-service\";\nimport {\n TRANSACT_WRITE_ITEM_LIMIT,\n executeMultiWrite,\n type MultiWriteTriple,\n} from \"../multi-write-operation\";\n\n/**\n * Maximum rows the cascade may submit in a single chunk. Mirrors the\n * AWS `TransactWriteItems` 100-item ceiling enforced by\n * {@link executeMultiWrite}.\n */\nexport const OWNING_DELETE_CASCADE_CHUNK_SIZE = TRANSACT_WRITE_ITEM_LIMIT;\n\n/** Inputs accepted by {@link deleteOwningChildChunkOperation}. */\nexport interface DeleteOwningChildChunkParams {\n /** Rows to delete in this transaction. Length must be 1..100. */\n readonly rows: ReadonlyArray<OwningChildProjectionRow>;\n /** Optional table-name override; resolved via env when omitted. */\n readonly tableName?: string;\n /** Optional idempotency token forwarded to ElectroDB. */\n readonly token?: string;\n}\n\n/** Result of {@link deleteOwningChildChunkOperation}. */\nexport interface DeleteOwningChildChunkResult {\n /** Number of rows committed to the transaction. */\n readonly rowsDeleted: number;\n /**\n * Per-entity breakdown of the rows deleted, for observability and\n * tests. Keyed by the projection-entity name.\n */\n readonly breakdown: Partial<Record<OwningDeleteProjectionEntity, number>>;\n}\n\n/**\n * Submit `rows` as a single `TransactWriteItems` via `executeMultiWrite`.\n *\n * Empty input is a no-op (returns `rowsDeleted: 0`) so the cascade\n * state machine never needs to pre-flight the chunk size — the Map\n * iteration body can call this operation unconditionally.\n */\nexport async function deleteOwningChildChunkOperation(\n params: DeleteOwningChildChunkParams,\n): Promise<DeleteOwningChildChunkResult> {\n const { rows, tableName, token } = params;\n\n if (rows.length === 0) {\n return { rowsDeleted: 0, breakdown: {} };\n }\n if (rows.length > OWNING_DELETE_CASCADE_CHUNK_SIZE) {\n throw new Error(\n `deleteOwningChildChunkOperation: chunk has ${rows.length} rows; limit is ${OWNING_DELETE_CASCADE_CHUNK_SIZE}`,\n );\n }\n\n const service = getDynamoControlService(tableName);\n\n const triples: Array<MultiWriteTriple> = rows.map((row) => ({\n entity: row.entity,\n action: \"delete\",\n item: { ...row.key },\n }));\n\n await executeMultiWrite({ service, triples, token });\n\n const breakdown: Partial<Record<OwningDeleteProjectionEntity, number>> = {};\n for (const row of rows) {\n breakdown[row.entity] = (breakdown[row.entity] ?? 0) + 1;\n }\n\n return { rowsDeleted: rows.length, breakdown };\n}\n\n/**\n * Split a flat row array into chunks of at most\n * {@link OWNING_DELETE_CASCADE_CHUNK_SIZE} items. Used by the cascade\n * state machine Pass state that prepares the Map's `ItemsPath` array.\n */\nexport function chunkOwningChildRows(\n rows: ReadonlyArray<OwningChildProjectionRow>,\n): Array<Array<OwningChildProjectionRow>> {\n const chunks: Array<Array<OwningChildProjectionRow>> = [];\n for (let i = 0; i < rows.length; i += OWNING_DELETE_CASCADE_CHUNK_SIZE) {\n chunks.push(rows.slice(i, i + OWNING_DELETE_CASCADE_CHUNK_SIZE));\n }\n return chunks;\n}\n","/**\n * Enumerate child projection rows under an owning entity's partition\n * for the TR-022 hard-delete cascade.\n *\n * The cascade state machine pages through this operation until it\n * returns zero items, batching each page into \\<=100-item chunks for the\n * delete step. The operation queries each of the projection entities\n * that key off the owner's partition and returns each row tagged with\n * the entity it came from plus the composite-key payload the\n * operations-layer multi-write helper needs to issue a delete.\n *\n * Owner-type to projection-entity matrix:\n *\n * | Owner | Partition | Entities queried |\n * |---|---|---|\n * | Workspace | `TID#<tenantId>#WORKSPACE#ID#<workspaceId>` | membershipWorkspaceProjection (#2), roleAssignmentWorkspaceProjection (#9), configurationWorkspaceProjection (#10) |\n * | User | `USER#ID#<userId>` | membershipUserProjection (#3, #4), roleAssignmentUserProjection (#5), configurationUserProjection (#10) |\n *\n * The owning canonical record itself (`SK = \"CURRENT\"`) is never\n * returned — the canonical row lives on a different entity (Workspace\n * / User) which is not queried here.\n *\n * Each page reads up to `limit` rows per entity; the operation merges\n * the per-entity responses and surfaces a single `cursor` map keyed by\n * entity name. The state machine outer loop passes this map back on\n * subsequent calls and stops when every per-entity cursor is exhausted.\n *\n * @see .state/adr-018-implementation-guide.md section 4 (Per-batch delete query)\n * @see .claude/rules/data-layer-layout.md (operations live under operations/, not dynamo/)\n */\n\nimport { OWNING_ENTITY_TYPE, type OwningEntityType } from \"@openhi/workflows\";\nimport { getDynamoControlService } from \"../../../dynamo/dynamo-control-service\";\n\n/**\n * Entity-name keys this operation may emit. Matches the keys exposed\n * by the control-plane service factory; downstream delete callers feed\n * them to `executeMultiWrite` as the `entity` field on each triple.\n */\nexport const OWNING_DELETE_PROJECTION_ENTITY = {\n MembershipUserProjection: \"membershipUserProjection\",\n MembershipWorkspaceProjection: \"membershipWorkspaceProjection\",\n RoleAssignmentUserProjection: \"roleAssignmentUserProjection\",\n RoleAssignmentWorkspaceProjection: \"roleAssignmentWorkspaceProjection\",\n ConfigurationUserProjection: \"configurationUserProjection\",\n ConfigurationWorkspaceProjection: \"configurationWorkspaceProjection\",\n} as const;\nexport type OwningDeleteProjectionEntity =\n (typeof OWNING_DELETE_PROJECTION_ENTITY)[keyof typeof OWNING_DELETE_PROJECTION_ENTITY];\n\n/** Inputs accepted by {@link listOwningChildProjectionsOperation}. */\nexport interface ListOwningChildProjectionsParams {\n /** The type of owning entity whose children the cascade is reaping. */\n readonly ownerType: OwningEntityType;\n /** Canonical id of the owning entity (Workspace id or User id). */\n readonly ownerId: string;\n /** Required for Workspace owners; ignored for User owners. */\n readonly tenantId?: string;\n /**\n * Per-entity cursor map carried forward from a prior page. Each\n * key is one of the {@link OWNING_DELETE_PROJECTION_ENTITY} values;\n * missing keys are treated as \"start from the beginning\". Pass the\n * value `null` to mark a per-entity stream as exhausted.\n */\n readonly cursors?: ListOwningChildProjectionsCursorMap;\n /**\n * Per-entity per-page limit (defaults to 100, matching the cascade\n * chunk size cap). The merged page can exceed this when more than\n * one entity has matching rows; the state machine chunker re-splits\n * the merged page into 100-item batches.\n */\n readonly limit?: number;\n /** Optional table-name override; resolved via env when omitted. */\n readonly tableName?: string;\n}\n\n/**\n * One projection row tagged for delete. Carries the entity name plus\n * the composite-key payload the operations-layer multi-write helper\n * expects on a `delete` triple — never the raw `PK`/`SK` strings, so\n * callers cannot accidentally delete an owning canonical record.\n */\nexport interface OwningChildProjectionRow {\n /** The projection entity this row belongs to. */\n readonly entity: OwningDeleteProjectionEntity;\n /**\n * Composite-key payload for `TransactWriteItems` delete. Shape\n * depends on `entity` — user-partition projections key on\n * `{ userId, sk }`; workspace-partition projections key on\n * `{ tenantId, workspaceId, sk }`.\n */\n readonly key: Record<string, string>;\n}\n\n/**\n * Per-entity cursor map. `null` for a key means the entity stream is\n * exhausted; an `undefined` / missing key means start from the\n * beginning.\n */\nexport type ListOwningChildProjectionsCursorMap = Partial<\n Record<OwningDeleteProjectionEntity, string | null>\n>;\n\n/** Page returned by {@link listOwningChildProjectionsOperation}. */\nexport interface ListOwningChildProjectionsResult {\n /** Projection rows in this page, merged across the per-entity queries. */\n readonly items: ReadonlyArray<OwningChildProjectionRow>;\n /** Per-entity cursors for the next page. */\n readonly cursors: ListOwningChildProjectionsCursorMap;\n /**\n * `true` when every per-entity stream returned no items and every\n * cursor is null — the cascade's outer loop terminates on this flag.\n */\n readonly exhausted: boolean;\n}\n\n/**\n * Build the owning partition key for the cascade query — exported so\n * tests and other operations can recompose the same partition string\n * the projection-entity queries here target via ElectroDB.\n */\nexport function buildOwningPartitionKey(params: {\n readonly ownerType: OwningEntityType;\n readonly ownerId: string;\n readonly tenantId?: string;\n}): string {\n switch (params.ownerType) {\n case OWNING_ENTITY_TYPE.Workspace:\n if (!params.tenantId || params.tenantId.length === 0) {\n throw new Error(\n \"buildOwningPartitionKey: tenantId is required for Workspace owners\",\n );\n }\n return `TID#${params.tenantId}#WORKSPACE#ID#${params.ownerId}`;\n case OWNING_ENTITY_TYPE.User:\n return `USER#ID#${params.ownerId}`;\n default: {\n const exhaustive: never = params.ownerType;\n throw new Error(\n `buildOwningPartitionKey: unsupported ownerType '${String(\n exhaustive,\n )}'`,\n );\n }\n }\n}\n\n/** Default per-entity per-page item limit. */\nconst DEFAULT_PAGE_SIZE = 100 as const;\n\n/** SK-prefix filter for each projection-entity query. */\nconst ENTITY_SK_PREFIXES: Record<OwningDeleteProjectionEntity, string> = {\n membershipUserProjection: \"MEMBERSHIP#\",\n membershipWorkspaceProjection: \"MEMBERSHIP#\",\n roleAssignmentUserProjection: \"ROLEASSIGNMENT#\",\n roleAssignmentWorkspaceProjection: \"ROLEASSIGNMENT#\",\n configurationUserProjection: \"CONFIGURATION#\",\n configurationWorkspaceProjection: \"CONFIGURATION#\",\n};\n\n/**\n * Entity-list per owner-type. Lookups for a Workspace skip user-\n * partition entities and vice versa, so the cascade never reaches\n * across the partition boundary by mistake.\n */\nconst ENTITIES_FOR_OWNER: Record<\n OwningEntityType,\n ReadonlyArray<OwningDeleteProjectionEntity>\n> = {\n Workspace: [\n \"membershipWorkspaceProjection\",\n \"roleAssignmentWorkspaceProjection\",\n \"configurationWorkspaceProjection\",\n ],\n User: [\n \"membershipUserProjection\",\n \"roleAssignmentUserProjection\",\n \"configurationUserProjection\",\n ],\n};\n\n/**\n * Issue one ElectroDB `Query` per applicable projection entity for the\n * owner's partition, return the merged page, and carry per-entity\n * cursors forward. Each entity is queried independently — when one\n * entity is exhausted but others still have rows, the next page reads\n * only the still-open streams. The merged result preserves entity\n * identity on every row so the delete step can issue a typed\n * `TransactWriteItems` via `executeMultiWrite`.\n */\nexport async function listOwningChildProjectionsOperation(\n params: ListOwningChildProjectionsParams,\n): Promise<ListOwningChildProjectionsResult> {\n const {\n ownerType,\n ownerId,\n tenantId,\n cursors = {},\n limit = DEFAULT_PAGE_SIZE,\n tableName,\n } = params;\n\n if (!ownerId || ownerId.length === 0) {\n throw new Error(\"listOwningChildProjectionsOperation: ownerId is required\");\n }\n if (\n ownerType === OWNING_ENTITY_TYPE.Workspace &&\n (!tenantId || tenantId.length === 0)\n ) {\n throw new Error(\n \"listOwningChildProjectionsOperation: tenantId is required for Workspace owners\",\n );\n }\n\n const service = getDynamoControlService(tableName);\n const entities = ENTITIES_FOR_OWNER[ownerType];\n\n const nextCursors: ListOwningChildProjectionsCursorMap = {};\n const items: Array<OwningChildProjectionRow> = [];\n\n for (const entityName of entities) {\n const priorCursor = cursors[entityName];\n if (priorCursor === null) {\n // Exhausted on a previous page — skip without re-querying.\n nextCursors[entityName] = null;\n continue;\n }\n const prefix = ENTITY_SK_PREFIXES[entityName];\n const page = await queryProjectionEntity({\n service,\n entityName,\n ownerType,\n ownerId,\n tenantId,\n prefix,\n cursor: priorCursor ?? null,\n limit,\n });\n for (const row of page.items) {\n items.push(row);\n }\n nextCursors[entityName] = page.cursor;\n }\n\n const exhausted = Object.values(nextCursors).every((value) => value === null);\n\n return { items, cursors: nextCursors, exhausted };\n}\n\ninterface QueryProjectionEntityParams {\n readonly service: ReturnType<typeof getDynamoControlService>;\n readonly entityName: OwningDeleteProjectionEntity;\n readonly ownerType: OwningEntityType;\n readonly ownerId: string;\n readonly tenantId?: string;\n readonly prefix: string;\n readonly cursor: string | null;\n readonly limit: number;\n}\n\ninterface QueryProjectionEntityResult {\n readonly items: ReadonlyArray<OwningChildProjectionRow>;\n readonly cursor: string | null;\n}\n\nasync function queryProjectionEntity(\n params: QueryProjectionEntityParams,\n): Promise<QueryProjectionEntityResult> {\n const {\n service,\n entityName,\n ownerType,\n ownerId,\n tenantId,\n prefix,\n cursor,\n limit,\n } = params;\n\n const goOptions = { cursor, limit };\n\n switch (entityName) {\n case \"membershipUserProjection\": {\n const result = await service.entities.membershipUserProjection.query\n .record({ userId: ownerId })\n .begins({ sk: prefix })\n .go(goOptions);\n const items = (result.data ?? []).map<OwningChildProjectionRow>(\n (row) => ({\n entity: entityName,\n key: { userId: row.userId, sk: row.sk },\n }),\n );\n return { items, cursor: result.cursor ?? null };\n }\n case \"membershipWorkspaceProjection\": {\n if (ownerType !== OWNING_ENTITY_TYPE.Workspace || !tenantId) {\n return { items: [], cursor: null };\n }\n const result = await service.entities.membershipWorkspaceProjection.query\n .record({ tenantId, workspaceId: ownerId })\n .begins({ sk: prefix })\n .go(goOptions);\n const items = (result.data ?? []).map<OwningChildProjectionRow>(\n (row) => ({\n entity: entityName,\n key: {\n tenantId: row.tenantId,\n workspaceId: row.workspaceId,\n sk: row.sk,\n },\n }),\n );\n return { items, cursor: result.cursor ?? null };\n }\n case \"roleAssignmentUserProjection\": {\n const result = await service.entities.roleAssignmentUserProjection.query\n .record({ userId: ownerId })\n .begins({ sk: prefix })\n .go(goOptions);\n const items = (result.data ?? []).map<OwningChildProjectionRow>(\n (row) => ({\n entity: entityName,\n key: { userId: row.userId, sk: row.sk },\n }),\n );\n return { items, cursor: result.cursor ?? null };\n }\n case \"roleAssignmentWorkspaceProjection\": {\n if (ownerType !== OWNING_ENTITY_TYPE.Workspace || !tenantId) {\n return { items: [], cursor: null };\n }\n const result =\n await service.entities.roleAssignmentWorkspaceProjection.query\n .record({ tenantId, workspaceId: ownerId })\n .begins({ sk: prefix })\n .go(goOptions);\n const items = (result.data ?? []).map<OwningChildProjectionRow>(\n (row) => ({\n entity: entityName,\n key: {\n tenantId: row.tenantId,\n workspaceId: row.workspaceId,\n sk: row.sk,\n },\n }),\n );\n return { items, cursor: result.cursor ?? null };\n }\n case \"configurationUserProjection\": {\n const result = await service.entities.configurationUserProjection.query\n .record({ userId: ownerId })\n .begins({ sk: prefix })\n .go(goOptions);\n const items = (result.data ?? []).map<OwningChildProjectionRow>(\n (row) => ({\n entity: entityName,\n key: { userId: row.userId, sk: row.sk },\n }),\n );\n return { items, cursor: result.cursor ?? null };\n }\n case \"configurationWorkspaceProjection\": {\n if (ownerType !== OWNING_ENTITY_TYPE.Workspace || !tenantId) {\n return { items: [], cursor: null };\n }\n const result =\n await service.entities.configurationWorkspaceProjection.query\n .record({ tenantId, workspaceId: ownerId })\n .begins({ sk: prefix })\n .go(goOptions);\n const items = (result.data ?? []).map<OwningChildProjectionRow>(\n (row) => ({\n entity: entityName,\n key: {\n tenantId: row.tenantId,\n workspaceId: row.workspaceId,\n sk: row.sk,\n },\n }),\n );\n return { items, cursor: result.cursor ?? null };\n }\n default: {\n const exhaustive: never = entityName;\n throw new Error(\n `listOwningChildProjectionsOperation: unsupported entity '${String(\n exhaustive,\n )}'`,\n );\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  SHARD_COUNT,
6
6
  computeShard
7
- } from "./chunk-6NBGYGFL.mjs";
7
+ } from "./chunk-VZCPGQXA.mjs";
8
8
  import {
9
9
  defaultTableName,
10
10
  dynamoClient
@@ -1352,4 +1352,4 @@ export {
1352
1352
  buildUpdatedResourceWithAudit,
1353
1353
  updateDataEntityById
1354
1354
  };
1355
- //# sourceMappingURL=chunk-U7L7T4XU.mjs.map
1355
+ //# sourceMappingURL=chunk-MVQWAIMC.mjs.map