@openhi/constructs 0.0.34 → 0.0.35
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/lambda/rest-api-lambda.handler.ts","../src/data/rest-api/rest-api.ts","../src/data/middleware/normalize-json-body.ts","../src/data/middleware/open-hi-context.ts","../src/data/rest-api/routes/control/configuration/configuration.ts","../src/lib/compression.ts","../src/data/dynamo/dynamo-control-service.ts","../src/data/dynamo/dynamo-client.ts","../src/data/dynamo/entities/control/configuration-entity.ts","../src/data/operations/control/configuration/configuration-create-operation.ts","../src/data/rest-api/routes/common.ts","../src/data/rest-api/routes/control/configuration/configuration-create-route.ts","../src/data/operations/control/configuration/configuration-delete-operation.ts","../src/data/rest-api/routes/control/configuration/configuration-delete-route.ts","../src/data/errors/domain-errors.ts","../src/data/operations/control/configuration/configuration-get-by-id-operation.ts","../src/data/rest-api/routes/control/configuration/configuration-get-by-id-route.ts","../src/data/operations/control/configuration/configuration-list-operation.ts","../src/data/rest-api/dynamic-configuration.ts","../src/data/rest-api/routes/control/configuration/configuration-list-route.ts","../src/data/operations/control/configuration/configuration-update-operation.ts","../src/data/rest-api/routes/control/configuration/configuration-update-route.ts","../src/data/rest-api/routes/data/encounter/encounter.ts","../src/data/operations/data/encounter/encounter-create-operation.ts","../src/data/audit-meta.ts","../src/data/dynamo/dynamo-data-service.ts","../src/data/dynamo/entities/data-entity-common.ts","../src/data/dynamo/entities/data/account-entity.ts","../src/data/dynamo/entities/data/activity-definition-entity.ts","../src/data/dynamo/entities/data/adverse-event-entity.ts","../src/data/dynamo/entities/data/allergy-intolerance-entity.ts","../src/data/dynamo/entities/data/appointment-entity.ts","../src/data/dynamo/entities/data/appointment-response-entity.ts","../src/data/dynamo/entities/data/audit-event-entity.ts","../src/data/dynamo/entities/data/basic-entity.ts","../src/data/dynamo/entities/data/biologically-derived-product-entity.ts","../src/data/dynamo/entities/data/body-structure-entity.ts","../src/data/dynamo/entities/data/care-plan-entity.ts","../src/data/dynamo/entities/data/care-team-entity.ts","../src/data/dynamo/entities/data/catalog-entry-entity.ts","../src/data/dynamo/entities/data/charge-item-definition-entity.ts","../src/data/dynamo/entities/data/charge-item-entity.ts","../src/data/dynamo/entities/data/claim-entity.ts","../src/data/dynamo/entities/data/claim-response-entity.ts","../src/data/dynamo/entities/data/clinical-impression-entity.ts","../src/data/dynamo/entities/data/communication-entity.ts","../src/data/dynamo/entities/data/communication-request-entity.ts","../src/data/dynamo/entities/data/composition-entity.ts","../src/data/dynamo/entities/data/condition-entity.ts","../src/data/dynamo/entities/data/consent-entity.ts","../src/data/dynamo/entities/data/contract-entity.ts","../src/data/dynamo/entities/data/coverage-eligibility-request-entity.ts","../src/data/dynamo/entities/data/coverage-eligibility-response-entity.ts","../src/data/dynamo/entities/data/coverage-entity.ts","../src/data/dynamo/entities/data/detected-issue-entity.ts","../src/data/dynamo/entities/data/device-definition-entity.ts","../src/data/dynamo/entities/data/device-entity.ts","../src/data/dynamo/entities/data/device-metric-entity.ts","../src/data/dynamo/entities/data/device-request-entity.ts","../src/data/dynamo/entities/data/device-use-statement-entity.ts","../src/data/dynamo/entities/data/diagnostic-report-entity.ts","../src/data/dynamo/entities/data/document-manifest-entity.ts","../src/data/dynamo/entities/data/document-reference-entity.ts","../src/data/dynamo/entities/data/effect-evidence-synthesis-entity.ts","../src/data/dynamo/entities/data/encounter-entity.ts","../src/data/dynamo/entities/data/endpoint-entity.ts","../src/data/dynamo/entities/data/enrollment-request-entity.ts","../src/data/dynamo/entities/data/enrollment-response-entity.ts","../src/data/dynamo/entities/data/episode-of-care-entity.ts","../src/data/dynamo/entities/data/event-definition-entity.ts","../src/data/dynamo/entities/data/evidence-entity.ts","../src/data/dynamo/entities/data/evidence-variable-entity.ts","../src/data/dynamo/entities/data/explanation-of-benefit-entity.ts","../src/data/dynamo/entities/data/family-member-history-entity.ts","../src/data/dynamo/entities/data/flag-entity.ts","../src/data/dynamo/entities/data/goal-entity.ts","../src/data/dynamo/entities/data/group-entity.ts","../src/data/dynamo/entities/data/guidance-response-entity.ts","../src/data/dynamo/entities/data/healthcare-service-entity.ts","../src/data/dynamo/entities/data/imaging-study-entity.ts","../src/data/dynamo/entities/data/immunization-entity.ts","../src/data/dynamo/entities/data/immunization-evaluation-entity.ts","../src/data/dynamo/entities/data/immunization-recommendation-entity.ts","../src/data/dynamo/entities/data/insurance-plan-entity.ts","../src/data/dynamo/entities/data/invoice-entity.ts","../src/data/dynamo/entities/data/library-entity.ts","../src/data/dynamo/entities/data/linkage-entity.ts","../src/data/dynamo/entities/data/list-entity.ts","../src/data/dynamo/entities/data/location-entity.ts","../src/data/dynamo/entities/data/measure-entity.ts","../src/data/dynamo/entities/data/measure-report-entity.ts","../src/data/dynamo/entities/data/media-entity.ts","../src/data/dynamo/entities/data/medication-administration-entity.ts","../src/data/dynamo/entities/data/medication-dispense-entity.ts","../src/data/dynamo/entities/data/medication-entity.ts","../src/data/dynamo/entities/data/medication-knowledge-entity.ts","../src/data/dynamo/entities/data/medication-request-entity.ts","../src/data/dynamo/entities/data/medication-statement-entity.ts","../src/data/dynamo/entities/data/message-header-entity.ts","../src/data/dynamo/entities/data/molecular-sequence-entity.ts","../src/data/dynamo/entities/data/nutrition-order-entity.ts","../src/data/dynamo/entities/data/observation-entity.ts","../src/data/dynamo/entities/data/organization-affiliation-entity.ts","../src/data/dynamo/entities/data/organization-entity.ts","../src/data/dynamo/entities/data/patient-entity.ts","../src/data/dynamo/entities/data/payment-notice-entity.ts","../src/data/dynamo/entities/data/payment-reconciliation-entity.ts","../src/data/dynamo/entities/data/person-entity.ts","../src/data/dynamo/entities/data/plan-definition-entity.ts","../src/data/dynamo/entities/data/practitioner-entity.ts","../src/data/dynamo/entities/data/practitioner-role-entity.ts","../src/data/dynamo/entities/data/procedure-entity.ts","../src/data/dynamo/entities/data/provenance-entity.ts","../src/data/dynamo/entities/data/questionnaire-entity.ts","../src/data/dynamo/entities/data/questionnaire-response-entity.ts","../src/data/dynamo/entities/data/related-person-entity.ts","../src/data/dynamo/entities/data/request-group-entity.ts","../src/data/dynamo/entities/data/research-study-entity.ts","../src/data/dynamo/entities/data/research-subject-entity.ts","../src/data/dynamo/entities/data/risk-assessment-entity.ts","../src/data/dynamo/entities/data/risk-evidence-synthesis-entity.ts","../src/data/dynamo/entities/data/schedule-entity.ts","../src/data/dynamo/entities/data/service-request-entity.ts","../src/data/dynamo/entities/data/slot-entity.ts","../src/data/dynamo/entities/data/specimen-entity.ts","../src/data/dynamo/entities/data/subscription-entity.ts","../src/data/dynamo/entities/data/substance-entity.ts","../src/data/dynamo/entities/data/supply-delivery-entity.ts","../src/data/dynamo/entities/data/supply-request-entity.ts","../src/data/dynamo/entities/data/task-entity.ts","../src/data/dynamo/entities/data/verification-result-entity.ts","../src/data/dynamo/entities/data/vision-prescription-entity.ts","../src/data/operations/data-operations-common.ts","../src/data/rest-api/routes/data/encounter/encounter-create-route.ts","../src/data/operations/data/encounter/encounter-delete-operation.ts","../src/data/rest-api/routes/data/encounter/encounter-delete-route.ts","../src/data/operations/data/encounter/encounter-get-by-id-operation.ts","../src/data/rest-api/routes/data/encounter/encounter-get-by-id-route.ts","../src/data/operations/data/encounter/encounter-list-operation.ts","../src/data/rest-api/routes/data/encounter/encounter-list-route.ts","../src/data/operations/data/encounter/encounter-update-operation.ts","../src/data/rest-api/routes/data/encounter/encounter-update-route.ts","../src/data/rest-api/routes/data/patient/patient.ts","../src/data/operations/data/patient/patient-create-operation.ts","../src/data/import-patient.ts","../src/data/rest-api/routes/data/patient/patient-create-route.ts","../src/data/operations/data/patient/patient-delete-operation.ts","../src/data/rest-api/routes/data/patient/patient-delete-route.ts","../src/data/operations/data/patient/patient-get-by-id-operation.ts","../src/data/rest-api/routes/data/patient/patient-get-by-id-route.ts","../src/data/operations/data/patient/patient-list-operation.ts","../src/data/rest-api/routes/data/patient/patient-list-route.ts","../src/data/operations/data/patient/patient-update-operation.ts","../src/data/rest-api/routes/data/patient/patient-update-route.ts","../src/data/rest-api/routes/data/practitioner/practitioner.ts","../src/data/operations/data/practitioner/practitioner-create-operation.ts","../src/data/rest-api/routes/data/practitioner/practitioner-create-route.ts","../src/data/operations/data/practitioner/practitioner-delete-operation.ts","../src/data/rest-api/routes/data/practitioner/practitioner-delete-route.ts","../src/data/operations/data/practitioner/practitioner-get-by-id-operation.ts","../src/data/rest-api/routes/data/practitioner/practitioner-get-by-id-route.ts","../src/data/operations/data/practitioner/practitioner-list-operation.ts","../src/data/rest-api/routes/data/practitioner/practitioner-list-route.ts","../src/data/operations/data/practitioner/practitioner-update-operation.ts","../src/data/rest-api/routes/data/practitioner/practitioner-update-route.ts"],"sourcesContent":["import serverlessExpress from \"@codegenie/serverless-express\";\nimport { app } from \"../rest-api/rest-api\";\n\n/**\n * @see sites/www-docs/content/packages/@openhi/constructs/data/lambda/rest-api-lambda.md\n */\n\nexport const handler = serverlessExpress({ app });\n","import path from \"node:path\";\nimport express, { Express, Request, Response } from \"express\";\nimport { normalizeJsonBodyMiddleware } from \"../middleware/normalize-json-body\";\nimport { openHiContextMiddleware } from \"../middleware/open-hi-context\";\nimport { configurationRouter } from \"./routes/control/configuration/configuration\";\nimport { encounterRouter } from \"./routes/data/encounter/encounter\";\nimport { patientRouter } from \"./routes/data/patient/patient\";\nimport { practitionerRouter } from \"./routes/data/practitioner/practitioner\";\n\n/**\n * @see sites/www-docs/content/packages/@openhi/constructs/data/rest-api/rest-api.md\n */\n\nconst app: Express = express();\n\napp.set(\"view engine\", \"ejs\");\napp.set(\"views\", path.join(__dirname, \"views\"));\n\n// CORS is handled exclusively by API Gateway when the REST API is deployed with rootHttpApiProps.corsPreflight\n// (see OpenHiRestApiService). Configure CORS there; do not add Express CORS middleware here.\napp.use(express.json());\napp.use(express.urlencoded({ extended: true }));\n// Normalize body when it arrives as Buffer/string (e.g. Lambda/API Gateway); all routes then see a plain object\napp.use(normalizeJsonBodyMiddleware);\n\napp.get(\"/\", (_req: Request, res: Response) => {\n return res.status(200).json({ message: \"POC App is running\" });\n});\n\n// Tenant/workspace resolved from JWT (or headers/env when implemented); attached to req for resource routes\napp.use(\n [\"/Patient\", \"/Encounter\", \"/Practitioner\", \"/Configuration\"],\n openHiContextMiddleware,\n);\n\n// FHIR R4 Patient resource\napp.use(\"/Patient\", patientRouter);\n\n// FHIR R4 Encounter resource\napp.use(\"/Encounter\", encounterRouter);\n\n// FHIR R4 Practitioner resource\napp.use(\"/Practitioner\", practitionerRouter);\n\n// Control Plane Configuration resource\napp.use(\"/Configuration\", configurationRouter);\n\nexport { app };\n","import type { Request, Response, NextFunction } from \"express\";\n\n/**\n * Normalize req.body so it is always a plain object when it was sent as JSON.\n * Runs after express.json(); handles Lambda/API Gateway cases where the body\n * may be attached as a Buffer or string (e.g. from event.body) instead of\n * being parsed by express.json(). Prevents handlers from spreading a Buffer\n * into resources (which would produce numeric keys from byte indices).\n */\nexport function normalizeJsonBodyMiddleware(\n req: Request,\n _res: Response,\n next: NextFunction,\n): void {\n const raw = req.body;\n if (Buffer.isBuffer(raw)) {\n try {\n req.body = JSON.parse(raw.toString(\"utf-8\")) as Request[\"body\"];\n } catch {\n // Leave body as-is; handler or validation can return 400\n }\n } else if (typeof raw === \"string\") {\n try {\n req.body = JSON.parse(raw) as Request[\"body\"];\n } catch {\n // Leave body as-is\n }\n }\n next();\n}\n","import { getCurrentInvoke } from \"@codegenie/serverless-express\";\nimport type { Request, Response, NextFunction } from \"express\";\nimport type { ApiGatewayJwtClaims } from \"./express\";\n\nconst REQUIRED_CLAIMS = [\n \"openhi_tenant_id\",\n \"openhi_workspace_id\",\n \"openhi_user_id\",\n \"openhi_user_name\",\n] as const;\n\nfunction getJwtClaims(req: Request): ApiGatewayJwtClaims | undefined {\n const invoke = getCurrentInvoke();\n const event =\n invoke?.event ??\n (req as Request & { apiGateway?: { event?: unknown } }).apiGateway?.event;\n\n const claims = (\n event as\n | {\n requestContext?: {\n authorizer?: { jwt?: { claims?: ApiGatewayJwtClaims } };\n };\n }\n | undefined\n )?.requestContext?.authorizer?.jwt?.claims;\n\n return claims;\n}\n\nfunction hasRequiredClaims(claims: ApiGatewayJwtClaims): boolean {\n return REQUIRED_CLAIMS.every(\n (key) =>\n typeof claims[key] === \"string\" && (claims[key] as string).trim() !== \"\",\n );\n}\n\n/**\n * Express middleware that sets req.openhiContext for REST API routes (e.g. /Patient, /Configuration).\n * Context is populated from JWT claims (openhi_tenant_id, openhi_workspace_id, openhi_user_id, openhi_user_name)\n * added by the Cognito pre-token generation Lambda. Missing required claims result in 403 Forbidden.\n *\n * @see ADR 2026-02-13-02 (JWT claim design)\n * @see sites/www-docs/content/packages/@openhi/constructs/rest-api.md — Middleware\n */\nexport function openHiContextMiddleware(\n req: Request,\n res: Response,\n next: NextFunction,\n): void {\n const claims = getJwtClaims(req);\n if (!claims || !hasRequiredClaims(claims)) {\n res.status(403).json({\n error: \"Forbidden\",\n message:\n \"Missing or invalid OpenHI JWT claims (tenant, workspace, or audit context).\",\n });\n return;\n }\n\n const invoke = getCurrentInvoke();\n const event = (invoke?.event ??\n (req as Request & { apiGateway?: { event?: unknown } }).apiGateway\n ?.event) as { requestContext?: { requestId?: string } } | undefined;\n const requestId =\n typeof event?.requestContext?.requestId === \"string\"\n ? event.requestContext.requestId\n : undefined;\n\n req.openhiContext = {\n tenantId: claims.openhi_tenant_id as string,\n workspaceId: claims.openhi_workspace_id as string,\n date: new Date().toISOString(),\n actorId: claims.openhi_user_id as string,\n actorName: claims.openhi_user_name as string,\n actorType: \"human\",\n roleId:\n typeof claims.openhi_role_id === \"string\" && claims.openhi_role_id !== \"\"\n ? claims.openhi_role_id\n : undefined,\n requestId,\n source: \"rest\",\n clientId:\n typeof claims.openhi_client_id === \"string\" &&\n claims.openhi_client_id !== \"\"\n ? claims.openhi_client_id\n : undefined,\n };\n\n next();\n}\n","import express from \"express\";\nimport { createConfigurationRoute } from \"./configuration-create-route\";\nimport { deleteConfigurationRoute } from \"./configuration-delete-route\";\nimport { getConfigurationByIdRoute } from \"./configuration-get-by-id-route\";\nimport { listConfigurationsRoute } from \"./configuration-list-route\";\nimport { updateConfigurationRoute } from \"./configuration-update-route\";\n\n/**\n * Configuration REST router: /Configuration\n * @see sites/www-docs/content/packages/@openhi/constructs/data/rest-api/routes/configuration.md\n */\nconst router: express.Router = express.Router();\n\nrouter.get(\"/\", listConfigurationsRoute);\nrouter.get(\"/:id\", getConfigurationByIdRoute);\nrouter.post(\"/\", createConfigurationRoute);\nrouter.put(\"/:id\", updateConfigurationRoute);\nrouter.delete(\"/:id\", deleteConfigurationRoute);\n\nexport { router as configurationRouter };\n","import { gzipSync, gunzipSync } from \"node:zlib\";\n\n/**\n * @see sites/www-docs/content/packages/@openhi/constructs/lib/compression.md\n */\n\n/** Envelope format version. See ADR 2026-02-15-02 (data layer compression). */\nconst ENVELOPE_VERSION = 1;\n\n/**\n * Compression algorithm identifiers supported by the envelope (string values).\n * Only algos that Node.js supports out of the box (zlib): gzip, brotli, deflate.\n * \"none\" = uncompressed payload. zstd was considered in the ADR but requires native addon/WASM.\n */\nexport const COMPRESSION_ALGOS = {\n NONE: \"none\",\n GZIP: \"gzip\",\n BROTLI: \"brotli\",\n DEFLATE: \"deflate\",\n} as const;\n\n/** Algorithm value for envelope `algo`; only gzip and none are implemented today. */\nexport type CompressionAlgo =\n (typeof COMPRESSION_ALGOS)[keyof typeof COMPRESSION_ALGOS];\n\n/** Stored value is a JSON string of this envelope. */\ninterface CompressionEnvelope {\n v: number;\n algo: string;\n payload: string;\n}\n\nfunction isEnvelope(obj: unknown): obj is CompressionEnvelope {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"v\" in obj &&\n \"algo\" in obj &&\n \"payload\" in obj &&\n typeof (obj as CompressionEnvelope).payload === \"string\"\n );\n}\n\n/**\n * Compresses a JSON string (e.g. serialized FHIR resource) for storage in DynamoDB.\n * Uses a versioned envelope: { v, algo, payload } with gzip+base64 in payload.\n * Used by the data layer on write; see REST API docs (compression in data layer).\n * Optional compression: pass `{ algo: COMPRESSION_ALGOS.NONE }` to store in envelope without compressing.\n */\nexport function compressResource(\n jsonString: string,\n options?: { algo?: CompressionAlgo },\n): string {\n const algo = options?.algo ?? COMPRESSION_ALGOS.GZIP;\n if (algo === COMPRESSION_ALGOS.NONE) {\n const envelope: CompressionEnvelope = {\n v: ENVELOPE_VERSION,\n algo: COMPRESSION_ALGOS.NONE,\n payload: jsonString,\n };\n return JSON.stringify(envelope);\n }\n const buf = Buffer.from(jsonString, \"utf-8\");\n const payload = gzipSync(buf).toString(\"base64\");\n const envelope: CompressionEnvelope = {\n v: ENVELOPE_VERSION,\n algo: COMPRESSION_ALGOS.GZIP,\n payload,\n };\n return JSON.stringify(envelope);\n}\n\n/**\n * Decompresses a stored value: versioned envelope (v, algo, payload) or legacy gzip+base64 / raw.\n * If the value is not valid envelope JSON, falls back to legacy: try gzip magic on base64, else return as-is.\n */\nexport function decompressResource(compressedOrRaw: string): string {\n try {\n const parsed = JSON.parse(compressedOrRaw) as unknown;\n if (isEnvelope(parsed)) {\n if (parsed.algo === COMPRESSION_ALGOS.GZIP) {\n const buf = Buffer.from(parsed.payload, \"base64\");\n return gunzipSync(buf).toString(\"utf-8\");\n }\n if (parsed.algo === COMPRESSION_ALGOS.NONE) {\n return parsed.payload;\n }\n // Unknown algo: return payload as-is (safe fallback per ADR)\n return parsed.payload;\n }\n } catch {\n // Not valid envelope JSON — legacy path\n }\n\n // Legacy: pre-envelope gzip+base64 or raw\n try {\n const buf = Buffer.from(compressedOrRaw, \"base64\");\n if (buf.length >= 2 && buf[0] === 0x1f && buf[1] === 0x8b) {\n return gunzipSync(buf).toString(\"utf-8\");\n }\n } catch {\n // not base64 or gunzip failed\n }\n return compressedOrRaw;\n}\n","import { Service } from \"electrodb\";\nimport { defaultTableName, dynamoClient } from \"./dynamo-client\";\nimport { ConfigurationEntity } from \"./entities/control/configuration-entity\";\n\n/**\n * Control-plane entities only (service \"control\"). Same table as data plane; use\n * DynamoDataService for data-plane entities.\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n */\n\nconst controlPlaneEntities = {\n configuration: ConfigurationEntity,\n};\n\nconst controlPlaneService = new Service(controlPlaneEntities, {\n table: defaultTableName,\n client: dynamoClient,\n});\n\n/**\n * Control-plane service: entities for configuration and control. Use with the\n * data store table (PK, SK, GSI4).\n */\nexport const DynamoControlService = {\n entities: controlPlaneService.entities,\n};\n\nexport type DynamoControlServiceType = typeof DynamoControlService;\n\n/**\n * Returns the control-plane service. Table name is resolved from tableName (optional override),\n * then DYNAMO_TABLE_NAME, then \"jesttesttable\".\n */\nexport function getDynamoControlService(\n tableName?: string,\n): DynamoControlServiceType {\n const resolved = tableName ?? defaultTableName;\n const service = new Service(controlPlaneEntities, {\n table: resolved,\n client: dynamoClient,\n });\n return {\n entities: service.entities,\n };\n}\n","import { DynamoDBClient } from \"@aws-sdk/client-dynamodb\";\n\n/**\n * DynamoDB table name for the data store. Set via DYNAMO_TABLE_NAME at runtime\n * (e.g. from Lambda env); defaults for local/test.\n */\nexport const defaultTableName =\n process.env.DYNAMO_TABLE_NAME ?? \"jesttesttable\";\n\n/**\n * DynamoDB client. When MOCK_DYNAMODB_ENDPOINT is set (e.g. local DynamoDB or\n * jest-dynalite), uses that endpoint with no SSL and region \"local\".\n */\nexport const dynamoClient = new DynamoDBClient({\n ...(process.env.MOCK_DYNAMODB_ENDPOINT && {\n endpoint: process.env.MOCK_DYNAMODB_ENDPOINT,\n sslEnabled: false,\n region: \"local\",\n }),\n});\n","import { Entity } from \"electrodb\";\n\n/**\n * Configuration data-store entity (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Partially tenant-isolated, control plane. Cascade of scope\n * levels: resolution order user → workspace → tenant → baseline. Sentinels: tenantId \"BASELINE\" for\n * baseline tier; workspaceId/userId/roleId \"-\" for absent dimension.\n *\n * Key structure: PK = CONFIG#TID#<tenantId>#WID#<workspaceId>#UID#<userId>#RID#<roleId>,\n * SK = KEY#<key>#SK#<sk>. Uniqueness: one Configuration per (tenantId, workspaceId, userId, roleId, key).\n * Standard attributes and key-building conventions align with single-table design.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entities/configuration.md\n * @see sites/www-docs/content/architecture/control-plane/configuration.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Key-building conventions (keys built inside entity)\n */\nexport const ConfigurationEntity = new Entity({\n model: {\n entity: \"configuration\",\n service: \"control\",\n version: \"01\",\n },\n attributes: {\n /** Sort key. \"CURRENT\" for current version; version history in S3. */\n sk: {\n type: \"string\" as const,\n required: true,\n default: \"CURRENT\",\n },\n /** Tenant scope. Use \"BASELINE\" when the config is baseline default (no tenant). */\n tenantId: {\n type: \"string\" as const,\n required: true,\n default: \"BASELINE\",\n },\n /** Workspace scope. Use \"-\" when absent. */\n workspaceId: {\n type: \"string\" as const,\n required: true,\n default: \"-\",\n },\n /** User scope. Use \"-\" when absent. */\n userId: {\n type: \"string\" as const,\n required: true,\n default: \"-\",\n },\n /** Role scope. Use \"-\" when absent. */\n roleId: {\n type: \"string\" as const,\n required: true,\n default: \"-\",\n },\n /** Config type (category), e.g. endpoints, branding, display. */\n key: {\n type: \"string\" as const,\n required: true,\n },\n /** FHIR Resource.id; logical id in URL and for the Configuration resource. */\n id: {\n type: \"string\" as const,\n required: true,\n },\n /** Payload as JSON string. JSON.stringify(resource) on write; JSON.parse(item.resource) on read. */\n resource: {\n type: \"string\" as const,\n required: true,\n },\n /** Version id (e.g. ULID). Tracks current version; S3 history key. */\n vid: {\n type: \"string\" as const,\n required: true,\n },\n lastUpdated: {\n type: \"string\" as const,\n required: true,\n },\n deleted: {\n type: \"boolean\" as const,\n required: false,\n },\n bundleId: {\n type: \"string\" as const,\n required: false,\n },\n msgId: {\n type: \"string\" as const,\n required: false,\n },\n },\n indexes: {\n /** Base table: PK, SK (data store key names). PK is built from tenantId, workspaceId, userId, roleId; SK is built from key and sk. Do not supply PK or SK from outside. */\n record: {\n pk: {\n field: \"PK\",\n composite: [\"tenantId\", \"workspaceId\", \"userId\", \"roleId\"],\n template:\n \"CONFIG#TID#${tenantId}#WID#${workspaceId}#UID#${userId}#RID#${roleId}\",\n },\n sk: {\n field: \"SK\",\n composite: [\"key\", \"sk\"],\n template: \"KEY#${key}#SK#${sk}\",\n },\n },\n\n /** GSI4 — Resource Type Index: list all Configuration in a tenant or workspace (no scan). Use for \"list configs scoped to this tenant\" (workspaceId = \"-\") or \"list configs scoped to this workspace\". Does not support hierarchical resolution in one query; use base table GetItem in fallback order (user → workspace → tenant → baseline) for that. */\n gsi4: {\n index: \"GSI4\",\n condition: () => true,\n pk: {\n field: \"GSI4PK\",\n composite: [\"tenantId\", \"workspaceId\"],\n template: \"TID#${tenantId}#WID#${workspaceId}#RT#Configuration\",\n },\n sk: {\n field: \"GSI4SK\",\n composite: [\"key\", \"sk\"],\n template: \"KEY#${key}#SK#${sk}\",\n },\n },\n },\n});\n","import { compressResource } from \"../../../../lib/compression\";\nimport { getDynamoControlService } from \"../../../dynamo/dynamo-control-service\";\nimport type { OpenHiContext } from \"../../../openhi-context\";\n\nconst SK = \"CURRENT\";\n\n/**\n * Create a Configuration. Accepts key and optional resource/scope; returns created resource.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entities/configuration.md\n */\nexport interface CreateConfigurationParams {\n context: OpenHiContext;\n /** At minimum key; optional id, resource, scope overrides, vid, lastUpdated. */\n body: {\n key: string;\n id?: string;\n resource?: Record<string, unknown> | string;\n tenantId?: string;\n workspaceId?: string;\n userId?: string;\n roleId?: string;\n vid?: string;\n lastUpdated?: string;\n };\n /** Optional table name override; resolved by data service from DYNAMO_TABLE_NAME when omitted. */\n tableName?: string;\n}\n\nexport interface CreateConfigurationResult {\n id: string;\n key: string;\n resource: Record<string, unknown>;\n meta: { lastUpdated: string; versionId: string };\n}\n\n/**\n * Creates a Configuration. Uses context for scope when not overridden in body.\n * Throws on service/validation errors; adapters map to HTTP/GraphQL.\n */\nexport async function createConfigurationOperation(\n params: CreateConfigurationParams,\n): Promise<CreateConfigurationResult> {\n const { context, body, tableName } = params;\n const {\n tenantId: ctxTenantId,\n workspaceId: ctxWorkspaceId,\n actorId: ctxActorId,\n date,\n } = context;\n const key = body.key;\n const id = body.id ?? `config-${key}-${Date.now()}`;\n const resourcePayload = body.resource;\n const resourceStr =\n typeof resourcePayload === \"string\"\n ? resourcePayload\n : JSON.stringify(resourcePayload ?? {});\n const tenantId = body.tenantId ?? ctxTenantId;\n const workspaceId = body.workspaceId ?? ctxWorkspaceId;\n const userId = body.userId ?? ctxActorId ?? \"-\";\n const roleId = body.roleId ?? context.roleId ?? \"-\";\n const lastUpdated = body.lastUpdated ?? date;\n const vid =\n body.vid ??\n (date.replace(/[-:T.Z]/g, \"\").slice(0, 12) || Date.now().toString(36));\n\n const service = getDynamoControlService(tableName);\n await service.entities.configuration\n .put({\n tenantId,\n workspaceId,\n userId,\n roleId,\n key,\n id,\n resource: compressResource(resourceStr),\n vid,\n lastUpdated,\n sk: SK,\n })\n .go();\n\n const resource =\n typeof resourcePayload === \"object\"\n ? (resourcePayload as Record<string, unknown>)\n : (JSON.parse(resourceStr) as Record<string, unknown>);\n\n return {\n id,\n key,\n resource: {\n resourceType: \"Configuration\",\n id,\n key,\n resource,\n },\n meta: { lastUpdated, versionId: vid },\n };\n}\n","import type { Request, Response } from \"express\";\n\n/** Base paths for REST API resources (FHIR and control). */\nexport const BASE_PATH = {\n CONFIGURATION: \"/Configuration\",\n ENCOUNTER: \"/Encounter\",\n PATIENT: \"/Patient\",\n PRACTITIONER: \"/Practitioner\",\n} as const;\n\n/**\n * Require req.body to be a plain object (set by express.json() + normalizeJsonBodyMiddleware).\n * Returns the body for use, or sends 400 and returns the response so the handler can return.\n */\nexport function requireJsonBody(\n req: Request,\n res: Response,\n): { body: Record<string, unknown> } | { errorResponse: Response } {\n const raw = req.body;\n if (raw == null || typeof raw !== \"object\" || Array.isArray(raw)) {\n return {\n errorResponse: res.status(400).json({\n resourceType: \"OperationOutcome\",\n issue: [\n {\n severity: \"error\",\n code: \"invalid\",\n diagnostics: \"Request body must be a JSON object.\",\n },\n ],\n }),\n };\n }\n return { body: raw as Record<string, unknown> };\n}\n\n/** Entry shape for list operation results (id + resource). */\nexport interface ListEntryForBundle {\n id: string;\n resource: unknown;\n}\n\n/**\n * Build a FHIR Bundle (searchset) from a base path and list entries.\n * Used by GET list routes for Patient, Encounter, Practitioner.\n */\nexport function buildSearchsetBundle(\n basePath: string,\n entries: Array<ListEntryForBundle>,\n): {\n resourceType: \"Bundle\";\n type: \"searchset\";\n total: number;\n link: Array<{ relation: string; url: string }>;\n entry: Array<{ fullUrl: string; resource: unknown }>;\n} {\n return {\n resourceType: \"Bundle\",\n type: \"searchset\",\n total: entries.length,\n link: [{ relation: \"self\", url: basePath }],\n entry: entries.map((item) => ({\n fullUrl: `${basePath}/${item.id}`,\n resource: item.resource,\n })),\n };\n}\n\n/**\n * Send a 404 OperationOutcome. Used by get-by-id and update routes when the resource is not found.\n */\nexport function sendOperationOutcome404(\n res: Response,\n diagnostics: string,\n): Response {\n return res.status(404).json({\n resourceType: \"OperationOutcome\",\n issue: [{ severity: \"error\", code: \"not-found\", diagnostics }],\n });\n}\n\n/**\n * Send a 500 OperationOutcome and optionally log. Used by all data routes on exception.\n */\nexport function sendOperationOutcome500(\n res: Response,\n err: unknown,\n logContext?: string,\n): Response {\n if (logContext) {\n console.error(logContext, err);\n }\n return res.status(500).json({\n resourceType: \"OperationOutcome\",\n issue: [{ severity: \"error\", code: \"exception\", diagnostics: String(err) }],\n });\n}\n","import type { Request, Response } from \"express\";\nimport { createConfigurationOperation } from \"../../../../operations/control/configuration/configuration-create-operation\";\nimport { BASE_PATH, requireJsonBody } from \"../../common\";\n\n/**\n * POST /Configuration — create: accepts Configuration in body, persists via data store, returns 201.\n * Scope from body (tenantId, workspaceId, userId, roleId) or req.openhiContext; use BASELINE/- for baseline.\n */\nexport async function createConfigurationRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const bodyResult = requireJsonBody(req, res);\n if (\"errorResponse\" in bodyResult) return bodyResult.errorResponse;\n\n const ctx = req.openhiContext!;\n const body = bodyResult.body as Record<string, unknown>;\n const key = body?.key as string;\n if (!key || typeof key !== \"string\") {\n return res.status(400).json({\n resourceType: \"OperationOutcome\",\n issue: [\n {\n severity: \"error\",\n code: \"required\",\n diagnostics: \"Configuration key is required\",\n },\n ],\n });\n }\n\n try {\n const result = await createConfigurationOperation({\n context: ctx,\n body: {\n key,\n id: body?.id as string | undefined,\n resource: body?.resource as\n | Record<string, unknown>\n | string\n | undefined,\n tenantId: body?.tenantId as string | undefined,\n workspaceId: body?.workspaceId as string | undefined,\n userId: body?.userId as string | undefined,\n roleId: body?.roleId as string | undefined,\n vid: body?.vid as string | undefined,\n lastUpdated: body?.lastUpdated as string | undefined,\n },\n });\n const config = {\n ...result.resource,\n meta: result.meta,\n };\n return res\n .status(201)\n .location(`${BASE_PATH.CONFIGURATION}/${result.key}`)\n .json(config);\n } catch (err: unknown) {\n console.error(\"POST Configuration error:\", err);\n return res.status(500).json({\n resourceType: \"OperationOutcome\",\n issue: [\n { severity: \"error\", code: \"exception\", diagnostics: String(err) },\n ],\n });\n }\n}\n","import { getDynamoControlService } from \"../../../dynamo/dynamo-control-service\";\nimport type { OpenHiContext } from \"../../../openhi-context\";\n\nconst SK = \"CURRENT\";\n\n/**\n * Delete a Configuration by id (key). No-op if the item does not exist (idempotent).\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entities/configuration.md\n */\nexport interface DeleteConfigurationParams {\n context: OpenHiContext;\n /** Configuration key (id). */\n id: string;\n /** Optional table name override; resolved by data service from DYNAMO_TABLE_NAME when omitted. */\n tableName?: string;\n}\n\n/**\n * Deletes the current Configuration for the given key in context scope.\n * Does not throw when the configuration does not exist.\n * Throws on service errors; adapters map to HTTP/GraphQL.\n */\nexport async function deleteConfigurationOperation(\n params: DeleteConfigurationParams,\n): Promise<void> {\n const { context, id, tableName } = params;\n const { tenantId, workspaceId, actorId, roleId: ctxRoleId } = context;\n const roleId = ctxRoleId ?? \"-\";\n const service = getDynamoControlService(tableName);\n\n await service.entities.configuration\n .delete({\n tenantId,\n workspaceId,\n userId: actorId,\n roleId,\n key: id,\n sk: SK,\n })\n .go();\n}\n","import type { Request, Response } from \"express\";\nimport { deleteConfigurationOperation } from \"../../../../operations/control/configuration/configuration-delete-operation\";\n\n/**\n * DELETE /Configuration/:id — delete: removes from data store, returns 204.\n */\nexport async function deleteConfigurationRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n\n try {\n await deleteConfigurationOperation({ context: ctx, id });\n return res.status(204).send();\n } catch (err: unknown) {\n console.error(\"DELETE Configuration error:\", err);\n return res.status(500).json({\n resourceType: \"OperationOutcome\",\n issue: [\n { severity: \"error\", code: \"exception\", diagnostics: String(err) },\n ],\n });\n }\n}\n","/**\n * Typed domain errors for the data operations layer.\n * Data operations throw these; adapters (REST, GraphQL, Step Function) map them to\n * HTTP status, GraphQL errors, or workflow envelopes. No HTTP or OperationOutcome here.\n *\n * Full documentation (error types, HTTP mapping, FHIR OperationOutcome.issue.code alignment):\n * @see sites/www-docs/content/packages/@openhi/constructs/data/errors.md\n */\n\n/**\n * Base class for domain errors thrown by data operations.\n * Adapters use instanceof checks or domainErrorToHttpStatus() to map to transport.\n */\nexport class DomainError extends Error {\n /** Stable code for adapter mapping (e.g. \"NOT_FOUND\", \"VALIDATION\", \"CONFLICT\"). */\n readonly code: string;\n\n /** Optional details for validation messages or conflict context. */\n readonly details?: unknown;\n\n constructor(\n message: string,\n code: string,\n options?: { cause?: unknown; details?: unknown },\n ) {\n super(message, options);\n this.name = this.constructor.name;\n this.code = code;\n this.details = options?.details;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when a requested resource or entity is not found (e.g. get by id returns nothing). */\nexport class NotFoundError extends DomainError {\n constructor(\n message: string,\n options?: { cause?: unknown; details?: unknown },\n ) {\n super(message, \"NOT_FOUND\", options);\n }\n}\n\n/** Thrown when input fails validation (e.g. missing required field, invalid format). */\nexport class ValidationError extends DomainError {\n constructor(\n message: string,\n options?: { cause?: unknown; details?: unknown },\n ) {\n super(message, \"VALIDATION\", options);\n }\n}\n\n/** Thrown when an operation conflicts with current state (e.g. duplicate key, version conflict). */\nexport class ConflictError extends DomainError {\n constructor(\n message: string,\n options?: { cause?: unknown; details?: unknown },\n ) {\n super(message, \"CONFLICT\", options);\n }\n}\n\n/**\n * Maps a thrown value to the HTTP status code that adapters should use for that domain error.\n * Returns null if the value is not a known domain error (adapter may use 500 or handle otherwise).\n * REST adapters use this to choose status; response body/OperationOutcome remain adapter responsibility.\n */\nexport function domainErrorToHttpStatus(err: unknown): number | null {\n if (err instanceof NotFoundError) return 404;\n if (err instanceof ValidationError) return 400;\n if (err instanceof ConflictError) return 409;\n return null;\n}\n","import { decompressResource } from \"../../../../lib/compression\";\nimport { getDynamoControlService } from \"../../../dynamo/dynamo-control-service\";\nimport { NotFoundError } from \"../../../errors\";\nimport type { OpenHiContext } from \"../../../openhi-context\";\n\nconst SK = \"CURRENT\";\n\n/**\n * Get a single Configuration by id (key). Throws NotFoundError if not found.\n */\nexport interface GetConfigurationByIdParams {\n context: OpenHiContext;\n id: string;\n /** Optional table name override; resolved by data service from DYNAMO_TABLE_NAME when omitted. */\n tableName?: string;\n}\n\nexport interface GetConfigurationByIdResult {\n id: string;\n key: string;\n resource: Record<string, unknown>;\n}\n\n/**\n * Returns the current Configuration for the id (key) in the given context scope.\n * Throws NotFoundError when the configuration does not exist.\n */\nexport async function getConfigurationByIdOperation(\n params: GetConfigurationByIdParams,\n): Promise<GetConfigurationByIdResult> {\n const { context, id, tableName } = params;\n const { tenantId, workspaceId, actorId, roleId: ctxRoleId } = context;\n const roleId = ctxRoleId ?? \"-\";\n const service = getDynamoControlService(tableName);\n\n const result = await service.entities.configuration\n .get({ tenantId, workspaceId, userId: actorId, roleId, key: id, sk: SK })\n .go();\n\n if (!result.data) {\n throw new NotFoundError(`Configuration ${id} not found`, {\n details: { id },\n });\n }\n\n const resource = JSON.parse(\n decompressResource(result.data.resource),\n ) as Record<string, unknown>;\n return {\n id: result.data.id,\n key: result.data.key,\n resource: {\n ...resource,\n resourceType: \"Configuration\",\n id: result.data.id,\n key: result.data.key,\n },\n };\n}\n","import type { Request, Response } from \"express\";\nimport { NotFoundError, domainErrorToHttpStatus } from \"../../../../errors\";\nimport { getConfigurationByIdOperation } from \"../../../../operations/control/configuration/configuration-get-by-id-operation\";\n\n/**\n * GET /Configuration/:id — read: returns a single Configuration resource for the id in current scope, or 404.\n */\nexport async function getConfigurationByIdRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n\n try {\n const result = await getConfigurationByIdOperation({ context: ctx, id });\n return res.json(result.resource);\n } catch (err: unknown) {\n const status = domainErrorToHttpStatus(err);\n if (status === 404) {\n return res.status(404).json({\n resourceType: \"OperationOutcome\",\n issue: [\n {\n severity: \"error\",\n code: \"not-found\",\n diagnostics:\n err instanceof NotFoundError\n ? err.message\n : `Configuration ${id} not found`,\n },\n ],\n });\n }\n console.error(\"GET Configuration error:\", err);\n return res.status(500).json({\n resourceType: \"OperationOutcome\",\n issue: [\n {\n severity: \"error\",\n code: \"exception\",\n diagnostics: String(err),\n },\n ],\n });\n }\n}\n","import { decompressResource } from \"../../../../lib/compression\";\nimport { getDynamoControlService } from \"../../../dynamo/dynamo-control-service\";\nimport type { OpenHiContext } from \"../../../openhi-context\";\n\n/**\n * List Configuration entries in a workspace (GSI4). Returns domain result for adapters to map to Bundle or other formats.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entities/configuration.md\n */\nexport interface ListConfigurationsParams {\n context: OpenHiContext;\n /** Optional table name override; resolved by data service from DYNAMO_TABLE_NAME when omitted. */\n tableName?: string;\n}\n\nexport interface ConfigurationListEntry {\n id: string;\n key: string;\n resource: Record<string, unknown>;\n}\n\nexport interface ListConfigurationsResult {\n entries: Array<ConfigurationListEntry>;\n}\n\n/**\n * Lists all Configuration entries in the workspace. Uses GSI4 (Resource Type Index).\n * Throws on service errors; adapters map to HTTP/GraphQL/Step Function.\n */\nexport async function listConfigurationsOperation(\n params: ListConfigurationsParams,\n): Promise<ListConfigurationsResult> {\n const { context, tableName } = params;\n const { tenantId, workspaceId } = context;\n const service = getDynamoControlService(tableName);\n\n const result = await service.entities.configuration.query\n .gsi4({ tenantId, workspaceId })\n .go();\n\n const entries: Array<ConfigurationListEntry> = (result.data ?? []).map(\n (item) => {\n const resource = JSON.parse(decompressResource(item.resource)) as Record<\n string,\n unknown\n >;\n return {\n id: item.id,\n key: item.key,\n resource: {\n resourceType: \"Configuration\",\n id: item.id,\n key: item.key,\n resource,\n },\n };\n },\n );\n\n return { entries };\n}\n","/**\n * Generates Configuration entries that are not stored in DynamoDB but are\n * included in the list response. Values are retrieved from AWS SSM Parameter\n * Store based on tags. Used by GET /Configuration to append dynamic\n * configs to Dynamo results.\n *\n * SSM parameters are selected when their tags match the Lambda environment\n * variables BRANCH_TAG_VALUE and HTTP_API_TAG_VALUE (set by RestApiLambda):\n * - Tag OpenHI:Branch must equal BRANCH_TAG_VALUE (e.g. branch name).\n * - Tag OpenHI:HttpApiParam must equal HTTP_API_TAG_VALUE (e.g. ROOT_HTTP_API).\n * If either env var is unset, the static dummy entry is returned.\n *\n * @see sites/www-docs/content/architecture/control-plane/configuration.md\n * @see packages/@openhi/constructs/src/data/lambda/rest-api-lambda.ts — BRANCH_TAG_VALUE, HTTP_API_TAG_VALUE\n */\n\nimport {\n DescribeParametersCommand,\n GetParametersCommand,\n SSMClient,\n} from \"@aws-sdk/client-ssm\";\n\n/**\n * @see sites/www-docs/content/packages/@openhi/constructs/data/rest-api/dynamic-configuration.md\n */\n\nconst BASE_PATH = \"/Configuration\";\n\n/** SSM tag key for branch (value must match Lambda env BRANCH_TAG_VALUE). */\nconst TAG_KEY_BRANCH = \"openhi:branch-name\";\n/** SSM tag key for HTTP API param (value must match Lambda env HTTP_API_TAG_VALUE). */\nconst TAG_KEY_HTTP_API_PARAM = \"openhi:param-name\";\n\n/** Shape of a single entry in the list Bundle (fullUrl + resource). */\nexport interface ConfigurationListEntry {\n fullUrl: string;\n resource: {\n resourceType: \"Configuration\";\n id: string;\n key: string;\n resource?: Record<string, unknown>;\n meta?: Record<string, unknown>;\n [k: string]: unknown;\n };\n}\n\n/**\n * Values used to filter SSM parameters by tags. Sourced from Lambda environment\n * (BRANCH_TAG_VALUE, HTTP_API_TAG_VALUE). Both must be set to perform SSM lookup.\n */\nexport interface SsmDynamicConfigEnvFilter {\n /** Value for tag OpenHI:Branch (e.g. branch name). From env BRANCH_TAG_VALUE. */\n branchTagValue: string;\n /** Value for tag OpenHI:HttpApiParam (e.g. ROOT_HTTP_API). From env HTTP_API_TAG_VALUE. */\n httpApiTagValue: string;\n}\n\n/**\n * Resolves the tag filter from Lambda environment variables.\n * Returns null if either BRANCH_TAG_VALUE or HTTP_API_TAG_VALUE is missing.\n */\nexport function getSsmDynamicConfigEnvFilter(): SsmDynamicConfigEnvFilter | null {\n const branchTagValue = process.env.BRANCH_TAG_VALUE;\n const httpApiTagValue = process.env.HTTP_API_TAG_VALUE;\n if (\n branchTagValue == null ||\n branchTagValue === \"\" ||\n httpApiTagValue == null ||\n httpApiTagValue === \"\"\n ) {\n return null;\n }\n return { branchTagValue, httpApiTagValue };\n}\n\n/**\n * Fetches SSM parameter names whose tags match BRANCH_TAG_VALUE and\n * HTTP_API_TAG_VALUE (OpenHI:Branch and OpenHI:HttpApiParam), then\n * retrieves their values and returns a single Configuration list entry\n * whose resource.parameter array is built from name/value pairs.\n *\n * Parameter names are used as the parameter \"name\" in the Configuration\n * (last path segment if the name contains \"/\", otherwise the full name).\n * Values are stored as valueString.\n *\n * If either env var is unset, returns the static dummy entry without calling SSM.\n */\nexport async function getDynamicConfigurationEntries(context?: {\n tenantId?: string;\n workspaceId?: string;\n}): Promise<Array<ConfigurationListEntry>> {\n const envFilter = getSsmDynamicConfigEnvFilter();\n if (envFilter == null) {\n return getStaticDummyEntry(context);\n }\n\n const region = process.env.AWS_REGION ?? process.env.AWS_DEFAULT_REGION;\n const client = new SSMClient({ region });\n\n try {\n // DescribeParameters: parameters must have both tags matching Lambda env\n const describeResult = await client.send(\n new DescribeParametersCommand({\n ParameterFilters: [\n {\n Key: `tag:${TAG_KEY_BRANCH}`,\n Option: \"Equals\",\n Values: [envFilter.branchTagValue],\n },\n {\n Key: `tag:${TAG_KEY_HTTP_API_PARAM}`,\n Option: \"Equals\",\n Values: [envFilter.httpApiTagValue],\n },\n ],\n MaxResults: 50,\n }),\n );\n\n const names = (describeResult.Parameters ?? [])\n .map((p: { Name?: string }) => p.Name)\n .filter((n: string | undefined): n is string => n != null);\n\n if (names.length === 0) {\n return getStaticDummyEntry(context);\n }\n\n // GetParameter values in batches of 10 (SSM limit)\n const parameters: Array<{ name: string; value: string }> = [];\n for (let i = 0; i < names.length; i += 10) {\n const batch = names.slice(i, i + 10);\n const getResult = await client.send(\n new GetParametersCommand({\n Names: batch,\n WithDecryption: true,\n }),\n );\n\n for (const p of getResult.Parameters ?? []) {\n const name = (p as { Name?: string }).Name;\n const value = (p as { Value?: string }).Value;\n if (name != null && value != null) {\n parameters.push({ name, value });\n }\n }\n }\n\n const parameterList = parameters.map((p) => {\n const shortName = p.name.includes(\"/\")\n ? p.name.split(\"/\").slice(-1)[0]\n : p.name;\n return { name: shortName, valueString: p.value };\n });\n\n const entry: ConfigurationListEntry = {\n fullUrl: `${BASE_PATH}/ssm-dynamic`,\n resource: {\n resourceType: \"Configuration\",\n id: \"ssm-dynamic\",\n key: \"ssm-dynamic\",\n resource: {\n parameter: parameterList,\n },\n meta: {\n lastUpdated: new Date().toISOString(),\n versionId: \"1\",\n },\n },\n };\n\n return [entry];\n } catch (err) {\n console.error(\"getDynamicConfigurationEntries SSM error:\", err);\n return getStaticDummyEntry(context);\n }\n}\n\n/**\n * Returns a static dummy Configuration entry when SSM is unavailable or\n * returns no parameters (e.g. in tests or fallback).\n */\nfunction getStaticDummyEntry(_context?: {\n tenantId?: string;\n workspaceId?: string;\n}): Array<ConfigurationListEntry> {\n const dummy: ConfigurationListEntry = {\n fullUrl: `${BASE_PATH}/dynamic-dummy`,\n resource: {\n resourceType: \"Configuration\",\n id: \"dynamic-dummy\",\n key: \"dynamic-dummy\",\n resource: {\n parameter: [\n {\n name: \"description\",\n valueString:\n \"Statically generated dummy configuration (not from DynamoDB).\",\n },\n { name: \"source\", valueString: \"dynamic-configuration\" },\n ],\n },\n meta: {\n lastUpdated: new Date().toISOString(),\n versionId: \"1\",\n },\n },\n };\n\n return [dummy];\n}\n","import type { Request, Response } from \"express\";\nimport { listConfigurationsOperation } from \"../../../../operations/control/configuration/configuration-list-operation\";\nimport { getDynamicConfigurationEntries } from \"../../../dynamic-configuration\";\nimport { BASE_PATH } from \"../../common\";\n\n/**\n * GET /Configuration — list: returns a FHIR Bundle (searchset) of Configuration resources.\n * Uses listConfigurationsOperation (GSI4) plus dynamic entries; scope from req.openhiContext.\n */\nexport async function listConfigurationsRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const ctx = req.openhiContext!;\n const { tenantId, workspaceId } = ctx;\n\n try {\n const { entries: dynamoEntries } = await listConfigurationsOperation({\n context: ctx,\n });\n const dynamoBundleEntries = dynamoEntries.map((e) => ({\n fullUrl: `${BASE_PATH.CONFIGURATION}/${e.key}`,\n resource: e.resource,\n }));\n const dynamicEntries = await getDynamicConfigurationEntries({\n tenantId,\n workspaceId,\n });\n const entries = [...dynamoBundleEntries, ...dynamicEntries];\n const bundle = {\n resourceType: \"Bundle\",\n type: \"searchset\",\n total: entries.length,\n link: [{ relation: \"self\", url: BASE_PATH.CONFIGURATION }],\n entry: entries,\n };\n return res.json(bundle);\n } catch (err: unknown) {\n console.error(\"GET /Configuration list error:\", err);\n return res.status(500).json({\n resourceType: \"OperationOutcome\",\n issue: [\n {\n severity: \"error\",\n code: \"exception\",\n diagnostics: String(err),\n },\n ],\n });\n }\n}\n","import { compressResource } from \"../../../../lib/compression\";\nimport { getDynamoControlService } from \"../../../dynamo/dynamo-control-service\";\nimport { NotFoundError } from \"../../../errors\";\nimport type { OpenHiContext } from \"../../../openhi-context\";\n\nconst SK = \"CURRENT\";\n\n/**\n * Update a Configuration by id (key). Throws NotFoundError if not found.\n */\nexport interface UpdateConfigurationParams {\n context: OpenHiContext;\n id: string;\n /** Body with resource and optional lastUpdated. */\n body: {\n resource?: Record<string, unknown> | string;\n lastUpdated?: string;\n };\n /** Optional table name override. */\n tableName?: string;\n}\n\nexport interface UpdateConfigurationResult {\n id: string;\n key: string;\n resource: Record<string, unknown>;\n meta: { lastUpdated: string; versionId: string };\n}\n\n/**\n * Updates the current Configuration. Throws NotFoundError when the configuration does not exist.\n */\nexport async function updateConfigurationOperation(\n params: UpdateConfigurationParams,\n): Promise<UpdateConfigurationResult> {\n const { context, id, body, tableName } = params;\n const { tenantId, workspaceId, actorId, date, roleId: ctxRoleId } = context;\n const roleId = ctxRoleId ?? \"-\";\n const service = getDynamoControlService(tableName);\n\n const existing = await service.entities.configuration\n .get({ tenantId, workspaceId, userId: actorId, roleId, key: id, sk: SK })\n .go();\n\n if (!existing.data) {\n throw new NotFoundError(`Configuration ${id} not found`, {\n details: { id },\n });\n }\n\n const resourcePayload = body.resource;\n const resourceStr =\n typeof resourcePayload === \"string\"\n ? resourcePayload\n : JSON.stringify(resourcePayload ?? {});\n const lastUpdated = body.lastUpdated ?? date;\n const nextVid =\n existing.data.vid != null\n ? String(Number(existing.data.vid) + 1)\n : date.replace(/[-:T.Z]/g, \"\").slice(0, 12) || \"2\";\n\n await service.entities.configuration\n .patch({ tenantId, workspaceId, userId: actorId, roleId, key: id, sk: SK })\n .set({\n resource: compressResource(resourceStr),\n lastUpdated,\n vid: nextVid,\n })\n .go();\n\n const parsedResource =\n typeof resourcePayload === \"object\"\n ? (resourcePayload as Record<string, unknown>)\n : (JSON.parse(resourceStr) as Record<string, unknown>);\n\n return {\n id: existing.data.id,\n key: existing.data.key,\n resource: {\n resourceType: \"Configuration\",\n id: existing.data.id,\n key: existing.data.key,\n resource: parsedResource,\n },\n meta: { lastUpdated, versionId: nextVid },\n };\n}\n","import type { Request, Response } from \"express\";\nimport { NotFoundError, domainErrorToHttpStatus } from \"../../../../errors\";\nimport { updateConfigurationOperation } from \"../../../../operations/control/configuration/configuration-update-operation\";\nimport { requireJsonBody } from \"../../common\";\n\n/**\n * PUT /Configuration/:id — update: accepts Configuration body, persists via data store, returns 200.\n */\nexport async function updateConfigurationRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const bodyResult = requireJsonBody(req, res);\n if (\"errorResponse\" in bodyResult) return bodyResult.errorResponse;\n\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n const body = bodyResult.body as Record<string, unknown>;\n\n try {\n const result = await updateConfigurationOperation({\n context: ctx,\n id,\n body: {\n resource: body?.resource as\n | Record<string, unknown>\n | string\n | undefined,\n lastUpdated: body?.lastUpdated as string | undefined,\n },\n });\n return res.json({\n ...result.resource,\n meta: result.meta,\n });\n } catch (err: unknown) {\n const status = domainErrorToHttpStatus(err);\n if (status === 404) {\n return res.status(404).json({\n resourceType: \"OperationOutcome\",\n issue: [\n {\n severity: \"error\",\n code: \"not-found\",\n diagnostics:\n err instanceof NotFoundError\n ? err.message\n : `Configuration ${id} not found`,\n },\n ],\n });\n }\n console.error(\"PUT Configuration error:\", err);\n return res.status(500).json({\n resourceType: \"OperationOutcome\",\n issue: [\n {\n severity: \"error\",\n code: \"exception\",\n diagnostics: String(err),\n },\n ],\n });\n }\n}\n","import express from \"express\";\nimport { createEncounterRoute } from \"./encounter-create-route\";\nimport { deleteEncounterRoute } from \"./encounter-delete-route\";\nimport { getEncounterByIdRoute } from \"./encounter-get-by-id-route\";\nimport { listEncountersRoute } from \"./encounter-list-route\";\nimport { updateEncounterRoute } from \"./encounter-update-route\";\n\n/**\n * Encounter REST router: /Encounter\n * FHIR R4 Encounter resource; same pattern as Patient routes.\n */\nconst router: express.Router = express.Router();\n\nrouter.get(\"/\", listEncountersRoute);\nrouter.get(\"/:id\", getEncounterByIdRoute);\nrouter.post(\"/\", createEncounterRoute);\nrouter.put(\"/:id\", updateEncounterRoute);\nrouter.delete(\"/:id\", deleteEncounterRoute);\n\nexport { router as encounterRouter };\n","import type { Encounter, Meta } from \"@openhi/types\";\nimport { ulid } from \"ulid\";\nimport {\n mergeAuditIntoMeta,\n type MetaWithExtensions,\n} from \"../../../audit-meta\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport type { OpenHiContext } from \"../../../openhi-context\";\nimport {\n createDataEntityRecord,\n type SingleResourceResult,\n} from \"../../data-operations-common\";\n\n/**\n * Create an Encounter. Accepts FHIR-like body and OpenHI context; returns created resource.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entities/encounter.md\n */\nexport interface CreateEncounterParams {\n context: OpenHiContext;\n /** FHIR Encounter body (resourceType, id optional, meta optional). */\n body: Encounter;\n /** Optional logical id; defaults to body.id or generated. */\n id?: string;\n /** Optional table name override; resolved by data service from DYNAMO_TABLE_NAME when omitted. */\n tableName?: string;\n}\n\nexport type CreateEncounterResult = SingleResourceResult<Encounter>;\n\n/**\n * Creates an Encounter. Builds put attrs with audit in meta, then ElectroDB put.\n * Throws on service/validation errors; adapters map to HTTP/GraphQL.\n */\nexport async function createEncounterOperation(\n params: CreateEncounterParams,\n): Promise<CreateEncounterResult> {\n const { context, body, id: optionalId, tableName } = params;\n const { tenantId, workspaceId, date, actorId, actorName } = context;\n const id = body.id ?? optionalId ?? ulid();\n\n const meta: Meta = {\n ...(body.meta ?? {}),\n lastUpdated: date,\n versionId: \"1\",\n };\n\n const encounterWithAudit: Encounter & {\n id: string;\n meta: MetaWithExtensions;\n } = {\n ...body,\n resourceType: \"Encounter\",\n id,\n meta: mergeAuditIntoMeta(meta, {\n createdDate: date,\n createdById: actorId,\n createdByName: actorName,\n modifiedDate: date,\n modifiedById: actorId,\n modifiedByName: actorName,\n }),\n };\n\n const service = getDynamoDataService(tableName);\n return createDataEntityRecord<Encounter>(\n service.entities.encounter as Parameters<typeof createDataEntityRecord>[0],\n tenantId,\n workspaceId,\n id,\n encounterWithAudit,\n date,\n );\n}\n","import type { Extension, Meta } from \"@openhi/types\";\n\n/**\n * Shared audit/meta helpers for FHIR resources. Used by data operations and import.\n * OpenHI audit is stored in resource meta.extension (per ADR 2026-01-13-06).\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md\n */\n\n/** OpenHI extension URLs for audit in resource meta (per ADR 2026-01-13-06). */\nconst OPENHI_EXT = \"http://openhi.org/fhir/StructureDefinition\";\n\n/** Meta with optional OpenHI audit extensions (created/modified by, etc.). */\nexport type MetaWithExtensions = Meta & { extension?: Array<Extension> };\n\n/** Audit fields stored in FHIR resource meta.extension. */\nexport interface AuditFields {\n createdDate?: string;\n createdById?: string;\n createdByName?: string;\n modifiedDate?: string;\n modifiedById?: string;\n modifiedByName?: string;\n deletedDate?: string;\n deletedById?: string;\n deletedByName?: string;\n}\n\n/** Audit extension entry shape (subset of Extension used by OpenHI audit). */\ntype AuditExtensionEntry = Pick<\n Extension,\n \"url\" | \"valueString\" | \"valueDateTime\"\n>;\n\n/** Builds meta.extension entries for audit; merges with existing meta. */\nexport function mergeAuditIntoMeta(\n meta: MetaWithExtensions | Record<string, unknown> | undefined,\n audit: AuditFields,\n): MetaWithExtensions {\n const existing = (meta ?? {}) as MetaWithExtensions;\n const ext: Array<AuditExtensionEntry> = [\n ...(Array.isArray(existing.extension)\n ? (existing.extension as Array<AuditExtensionEntry>)\n : []),\n ];\n const byUrl = new Map(ext.map((e) => [e.url, e]));\n function set(\n url: string,\n value: string | undefined,\n type: \"valueString\" | \"valueDateTime\",\n ) {\n if (value == null) return;\n byUrl.set(url, { url, [type]: value });\n }\n set(`${OPENHI_EXT}/created-date`, audit.createdDate, \"valueDateTime\");\n set(`${OPENHI_EXT}/created-by-id`, audit.createdById, \"valueString\");\n set(`${OPENHI_EXT}/created-by-name`, audit.createdByName, \"valueString\");\n set(`${OPENHI_EXT}/modified-date`, audit.modifiedDate, \"valueDateTime\");\n set(`${OPENHI_EXT}/modified-by-id`, audit.modifiedById, \"valueString\");\n set(`${OPENHI_EXT}/modified-by-name`, audit.modifiedByName, \"valueString\");\n set(`${OPENHI_EXT}/deleted-date`, audit.deletedDate, \"valueDateTime\");\n set(`${OPENHI_EXT}/deleted-by-id`, audit.deletedById, \"valueString\");\n set(`${OPENHI_EXT}/deleted-by-name`, audit.deletedByName, \"valueString\");\n return { ...existing, extension: Array.from(byUrl.values()) };\n}\n","import { Service } from \"electrodb\";\nimport { defaultTableName, dynamoClient } from \"./dynamo-client\";\nimport { AccountEntity } from \"./entities/data/account-entity\";\nimport { ActivityDefinitionEntity } from \"./entities/data/activity-definition-entity\";\nimport { AdverseEventEntity } from \"./entities/data/adverse-event-entity\";\nimport { AllergyIntoleranceEntity } from \"./entities/data/allergy-intolerance-entity\";\nimport { AppointmentEntity } from \"./entities/data/appointment-entity\";\nimport { AppointmentResponseEntity } from \"./entities/data/appointment-response-entity\";\nimport { AuditEventEntity } from \"./entities/data/audit-event-entity\";\nimport { BasicEntity } from \"./entities/data/basic-entity\";\nimport { BiologicallyDerivedProductEntity } from \"./entities/data/biologically-derived-product-entity\";\nimport { BodyStructureEntity } from \"./entities/data/body-structure-entity\";\nimport { CarePlanEntity } from \"./entities/data/care-plan-entity\";\nimport { CareTeamEntity } from \"./entities/data/care-team-entity\";\nimport { CatalogEntryEntity } from \"./entities/data/catalog-entry-entity\";\nimport { ChargeItemDefinitionEntity } from \"./entities/data/charge-item-definition-entity\";\nimport { ChargeItemEntity } from \"./entities/data/charge-item-entity\";\nimport { ClaimEntity } from \"./entities/data/claim-entity\";\nimport { ClaimResponseEntity } from \"./entities/data/claim-response-entity\";\nimport { ClinicalImpressionEntity } from \"./entities/data/clinical-impression-entity\";\nimport { CommunicationEntity } from \"./entities/data/communication-entity\";\nimport { CommunicationRequestEntity } from \"./entities/data/communication-request-entity\";\nimport { CompositionEntity } from \"./entities/data/composition-entity\";\nimport { ConditionEntity } from \"./entities/data/condition-entity\";\nimport { ConsentEntity } from \"./entities/data/consent-entity\";\nimport { ContractEntity } from \"./entities/data/contract-entity\";\nimport { CoverageEligibilityRequestEntity } from \"./entities/data/coverage-eligibility-request-entity\";\nimport { CoverageEligibilityResponseEntity } from \"./entities/data/coverage-eligibility-response-entity\";\nimport { CoverageEntity } from \"./entities/data/coverage-entity\";\nimport { DetectedIssueEntity } from \"./entities/data/detected-issue-entity\";\nimport { DeviceDefinitionEntity } from \"./entities/data/device-definition-entity\";\nimport { DeviceEntity } from \"./entities/data/device-entity\";\nimport { DeviceMetricEntity } from \"./entities/data/device-metric-entity\";\nimport { DeviceRequestEntity } from \"./entities/data/device-request-entity\";\nimport { DeviceUseStatementEntity } from \"./entities/data/device-use-statement-entity\";\nimport { DiagnosticReportEntity } from \"./entities/data/diagnostic-report-entity\";\nimport { DocumentManifestEntity } from \"./entities/data/document-manifest-entity\";\nimport { DocumentReferenceEntity } from \"./entities/data/document-reference-entity\";\nimport { EffectEvidenceSynthesisEntity } from \"./entities/data/effect-evidence-synthesis-entity\";\nimport { EncounterEntity } from \"./entities/data/encounter-entity\";\nimport { EndpointEntity } from \"./entities/data/endpoint-entity\";\nimport { EnrollmentRequestEntity } from \"./entities/data/enrollment-request-entity\";\nimport { EnrollmentResponseEntity } from \"./entities/data/enrollment-response-entity\";\nimport { EpisodeOfCareEntity } from \"./entities/data/episode-of-care-entity\";\nimport { EventDefinitionEntity } from \"./entities/data/event-definition-entity\";\nimport { EvidenceEntity } from \"./entities/data/evidence-entity\";\nimport { EvidenceVariableEntity } from \"./entities/data/evidence-variable-entity\";\nimport { ExplanationOfBenefitEntity } from \"./entities/data/explanation-of-benefit-entity\";\nimport { FamilyMemberHistoryEntity } from \"./entities/data/family-member-history-entity\";\nimport { FlagEntity } from \"./entities/data/flag-entity\";\nimport { GoalEntity } from \"./entities/data/goal-entity\";\nimport { GroupEntity } from \"./entities/data/group-entity\";\nimport { GuidanceResponseEntity } from \"./entities/data/guidance-response-entity\";\nimport { HealthcareServiceEntity } from \"./entities/data/healthcare-service-entity\";\nimport { ImagingStudyEntity } from \"./entities/data/imaging-study-entity\";\nimport { ImmunizationEntity } from \"./entities/data/immunization-entity\";\nimport { ImmunizationEvaluationEntity } from \"./entities/data/immunization-evaluation-entity\";\nimport { ImmunizationRecommendationEntity } from \"./entities/data/immunization-recommendation-entity\";\nimport { InsurancePlanEntity } from \"./entities/data/insurance-plan-entity\";\nimport { InvoiceEntity } from \"./entities/data/invoice-entity\";\nimport { LibraryEntity } from \"./entities/data/library-entity\";\nimport { LinkageEntity } from \"./entities/data/linkage-entity\";\nimport { ListEntity } from \"./entities/data/list-entity\";\nimport { LocationEntity } from \"./entities/data/location-entity\";\nimport { MeasureEntity } from \"./entities/data/measure-entity\";\nimport { MeasureReportEntity } from \"./entities/data/measure-report-entity\";\nimport { MediaEntity } from \"./entities/data/media-entity\";\nimport { MedicationAdministrationEntity } from \"./entities/data/medication-administration-entity\";\nimport { MedicationDispenseEntity } from \"./entities/data/medication-dispense-entity\";\nimport { MedicationEntity } from \"./entities/data/medication-entity\";\nimport { MedicationKnowledgeEntity } from \"./entities/data/medication-knowledge-entity\";\nimport { MedicationRequestEntity } from \"./entities/data/medication-request-entity\";\nimport { MedicationStatementEntity } from \"./entities/data/medication-statement-entity\";\nimport { MessageHeaderEntity } from \"./entities/data/message-header-entity\";\nimport { MolecularSequenceEntity } from \"./entities/data/molecular-sequence-entity\";\nimport { NutritionOrderEntity } from \"./entities/data/nutrition-order-entity\";\nimport { ObservationEntity } from \"./entities/data/observation-entity\";\nimport { OrganizationAffiliationEntity } from \"./entities/data/organization-affiliation-entity\";\nimport { OrganizationEntity } from \"./entities/data/organization-entity\";\nimport { PatientEntity } from \"./entities/data/patient-entity\";\nimport { PaymentNoticeEntity } from \"./entities/data/payment-notice-entity\";\nimport { PaymentReconciliationEntity } from \"./entities/data/payment-reconciliation-entity\";\nimport { PersonEntity } from \"./entities/data/person-entity\";\nimport { PlanDefinitionEntity } from \"./entities/data/plan-definition-entity\";\nimport { PractitionerEntity } from \"./entities/data/practitioner-entity\";\nimport { PractitionerRoleEntity } from \"./entities/data/practitioner-role-entity\";\nimport { ProcedureEntity } from \"./entities/data/procedure-entity\";\nimport { ProvenanceEntity } from \"./entities/data/provenance-entity\";\nimport { QuestionnaireEntity } from \"./entities/data/questionnaire-entity\";\nimport { QuestionnaireResponseEntity } from \"./entities/data/questionnaire-response-entity\";\nimport { RelatedPersonEntity } from \"./entities/data/related-person-entity\";\nimport { RequestGroupEntity } from \"./entities/data/request-group-entity\";\nimport { ResearchStudyEntity } from \"./entities/data/research-study-entity\";\nimport { ResearchSubjectEntity } from \"./entities/data/research-subject-entity\";\nimport { RiskAssessmentEntity } from \"./entities/data/risk-assessment-entity\";\nimport { RiskEvidenceSynthesisEntity } from \"./entities/data/risk-evidence-synthesis-entity\";\nimport { ScheduleEntity } from \"./entities/data/schedule-entity\";\nimport { ServiceRequestEntity } from \"./entities/data/service-request-entity\";\nimport { SlotEntity } from \"./entities/data/slot-entity\";\nimport { SpecimenEntity } from \"./entities/data/specimen-entity\";\nimport { SubscriptionEntity } from \"./entities/data/subscription-entity\";\nimport { SubstanceEntity } from \"./entities/data/substance-entity\";\nimport { SupplyDeliveryEntity } from \"./entities/data/supply-delivery-entity\";\nimport { SupplyRequestEntity } from \"./entities/data/supply-request-entity\";\nimport { TaskEntity } from \"./entities/data/task-entity\";\nimport { VerificationResultEntity } from \"./entities/data/verification-result-entity\";\nimport { VisionPrescriptionEntity } from \"./entities/data/vision-prescription-entity\";\n\n/**\n * Data-plane entities only (service \"data\"). Same table as control plane; use\n * DynamoControlService for control-plane entities.\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n */\n\nconst dataPlaneEntities = {\n account: AccountEntity,\n activitydefinition: ActivityDefinitionEntity,\n adverseevent: AdverseEventEntity,\n allergyintolerance: AllergyIntoleranceEntity,\n auditevent: AuditEventEntity,\n basic: BasicEntity,\n biologicallyderivedproduct: BiologicallyDerivedProductEntity,\n bodystructure: BodyStructureEntity,\n appointment: AppointmentEntity,\n appointmentresponse: AppointmentResponseEntity,\n careplan: CarePlanEntity,\n careteam: CareTeamEntity,\n catalogentry: CatalogEntryEntity,\n chargeitem: ChargeItemEntity,\n chargeitemdefinition: ChargeItemDefinitionEntity,\n claim: ClaimEntity,\n claimresponse: ClaimResponseEntity,\n clinicalimpression: ClinicalImpressionEntity,\n communication: CommunicationEntity,\n communicationrequest: CommunicationRequestEntity,\n composition: CompositionEntity,\n condition: ConditionEntity,\n consent: ConsentEntity,\n contract: ContractEntity,\n coverage: CoverageEntity,\n coverageeligibilityrequest: CoverageEligibilityRequestEntity,\n coverageeligibilityresponse: CoverageEligibilityResponseEntity,\n detectedissue: DetectedIssueEntity,\n device: DeviceEntity,\n devicedefinition: DeviceDefinitionEntity,\n devicemetric: DeviceMetricEntity,\n devicerequest: DeviceRequestEntity,\n deviceusestatement: DeviceUseStatementEntity,\n diagnosticreport: DiagnosticReportEntity,\n documentmanifest: DocumentManifestEntity,\n documentreference: DocumentReferenceEntity,\n effectevidencesynthesis: EffectEvidenceSynthesisEntity,\n encounter: EncounterEntity,\n endpoint: EndpointEntity,\n enrollmentrequest: EnrollmentRequestEntity,\n enrollmentresponse: EnrollmentResponseEntity,\n episodeofcare: EpisodeOfCareEntity,\n eventdefinition: EventDefinitionEntity,\n evidence: EvidenceEntity,\n evidencevariable: EvidenceVariableEntity,\n explanationofbenefit: ExplanationOfBenefitEntity,\n familymemberhistory: FamilyMemberHistoryEntity,\n flag: FlagEntity,\n goal: GoalEntity,\n group: GroupEntity,\n guidanceresponse: GuidanceResponseEntity,\n healthcareservice: HealthcareServiceEntity,\n immunization: ImmunizationEntity,\n immunizationevaluation: ImmunizationEvaluationEntity,\n immunizationrecommendation: ImmunizationRecommendationEntity,\n imagingstudy: ImagingStudyEntity,\n insuranceplan: InsurancePlanEntity,\n invoice: InvoiceEntity,\n library: LibraryEntity,\n linkage: LinkageEntity,\n list: ListEntity,\n location: LocationEntity,\n medication: MedicationEntity,\n medicationadministration: MedicationAdministrationEntity,\n medicationdispense: MedicationDispenseEntity,\n medicationknowledge: MedicationKnowledgeEntity,\n medicationrequest: MedicationRequestEntity,\n medicationstatement: MedicationStatementEntity,\n media: MediaEntity,\n measure: MeasureEntity,\n measurereport: MeasureReportEntity,\n messageheader: MessageHeaderEntity,\n molecularsequence: MolecularSequenceEntity,\n nutritionorder: NutritionOrderEntity,\n observation: ObservationEntity,\n organization: OrganizationEntity,\n organizationaffiliation: OrganizationAffiliationEntity,\n patient: PatientEntity,\n paymentnotice: PaymentNoticeEntity,\n paymentreconciliation: PaymentReconciliationEntity,\n person: PersonEntity,\n plandefinition: PlanDefinitionEntity,\n practitioner: PractitionerEntity,\n practitionerrole: PractitionerRoleEntity,\n procedure: ProcedureEntity,\n provenance: ProvenanceEntity,\n questionnaire: QuestionnaireEntity,\n questionnaireresponse: QuestionnaireResponseEntity,\n requestgroup: RequestGroupEntity,\n relatedperson: RelatedPersonEntity,\n researchstudy: ResearchStudyEntity,\n researchsubject: ResearchSubjectEntity,\n riskassessment: RiskAssessmentEntity,\n riskevidencesynthesis: RiskEvidenceSynthesisEntity,\n schedule: ScheduleEntity,\n servicerequest: ServiceRequestEntity,\n specimen: SpecimenEntity,\n substance: SubstanceEntity,\n subscription: SubscriptionEntity,\n supplydelivery: SupplyDeliveryEntity,\n supplyrequest: SupplyRequestEntity,\n slot: SlotEntity,\n task: TaskEntity,\n visionprescription: VisionPrescriptionEntity,\n verificationresult: VerificationResultEntity,\n};\n\nconst dataPlaneService = new Service(dataPlaneEntities, {\n table: defaultTableName,\n client: dynamoClient,\n});\n\n/**\n * Data-plane service: entities for the data store (FHIR and related). Data-plane\n * entities use the base table (PK, SK) only; control plane may use GSI4. Same\n * physical table.\n */\nexport const DynamoDataService = {\n entities: dataPlaneService.entities,\n};\n\nexport type DynamoDataServiceType = typeof DynamoDataService;\n\n/**\n * Returns the data-plane service. Table name is resolved from tableName (optional override),\n * then DYNAMO_TABLE_NAME, then \"jesttesttable\".\n */\nexport function getDynamoDataService(\n tableName?: string,\n): DynamoDataServiceType {\n const resolved = tableName ?? defaultTableName;\n const service = new Service(dataPlaneEntities, {\n table: resolved,\n client: dynamoClient,\n });\n return {\n entities: service.entities,\n };\n}\n","import { Entity } from \"electrodb\";\n\n/**\n * Shared attributes for all data-plane FHIR entities (tenant-isolated, single-table store).\n * Used by all data-plane entities (Account, Patient, Encounter, Practitioner, etc.).\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md\n */\nexport const dataEntityAttributes = {\n /** Sort key. \"CURRENT\" for current version; version history in S3. */\n sk: {\n type: \"string\" as const,\n required: true,\n default: \"CURRENT\",\n },\n tenantId: {\n type: \"string\" as const,\n required: true,\n },\n workspaceId: {\n type: \"string\" as const,\n required: true,\n },\n /** FHIR Resource.id; logical id in URL and PK. */\n id: {\n type: \"string\" as const,\n required: true,\n },\n /** FHIR resource as JSON string. JSON.stringify(resource) on write; JSON.parse(item.resource) on read. */\n resource: {\n type: \"string\" as const,\n required: true,\n },\n /** Version id (e.g. ULID). Tracks current version; S3 history key. */\n vid: {\n type: \"string\" as const,\n required: true,\n },\n lastUpdated: {\n type: \"string\" as const,\n required: true,\n },\n deleted: {\n type: \"boolean\" as const,\n required: false,\n },\n bundleId: {\n type: \"string\" as const,\n required: false,\n },\n msgId: {\n type: \"string\" as const,\n required: false,\n },\n};\n\n/** Data-plane entity names (model.entity and key segment). Single source of truth for allowed values. Keys are UPPER_SNAKE for consistency. */\nexport const DATA_ENTITY_NAMES = {\n ACCOUNT: \"account\",\n ACTIVITY_DEFINITION: \"activitydefinition\",\n ADVERSE_EVENT: \"adverseevent\",\n ALLERGY_INTOLERANCE: \"allergyintolerance\",\n APPOINTMENT: \"appointment\",\n APPOINTMENT_RESPONSE: \"appointmentresponse\",\n AUDIT_EVENT: \"auditevent\",\n BASIC: \"basic\",\n BIOLOGICALLY_DERIVED_PRODUCT: \"biologicallyderivedproduct\",\n BODY_STRUCTURE: \"bodystructure\",\n CARE_PLAN: \"careplan\",\n CARE_TEAM: \"careteam\",\n CATALOG_ENTRY: \"catalogentry\",\n CHARGE_ITEM: \"chargeitem\",\n CHARGE_ITEM_DEFINITION: \"chargeitemdefinition\",\n CLAIM: \"claim\",\n CLAIM_RESPONSE: \"claimresponse\",\n CLINICAL_IMPRESSION: \"clinicalimpression\",\n COMMUNICATION: \"communication\",\n COMMUNICATION_REQUEST: \"communicationrequest\",\n COMPOSITION: \"composition\",\n CONDITION: \"condition\",\n CONSENT: \"consent\",\n CONTRACT: \"contract\",\n COVERAGE: \"coverage\",\n COVERAGE_ELIGIBILITY_REQUEST: \"coverageeligibilityrequest\",\n COVERAGE_ELIGIBILITY_RESPONSE: \"coverageeligibilityresponse\",\n DETECTED_ISSUE: \"detectedissue\",\n DEVICE: \"device\",\n DEVICE_DEFINITION: \"devicedefinition\",\n DEVICE_METRIC: \"devicemetric\",\n DEVICE_REQUEST: \"devicerequest\",\n DEVICE_USE_STATEMENT: \"deviceusestatement\",\n DIAGNOSTIC_REPORT: \"diagnosticreport\",\n DOCUMENT_MANIFEST: \"documentmanifest\",\n DOCUMENT_REFERENCE: \"documentreference\",\n EFFECT_EVIDENCE_SYNTHESIS: \"effectevidencesynthesis\",\n ENCOUNTER: \"encounter\",\n ENDPOINT: \"endpoint\",\n ENROLLMENT_REQUEST: \"enrollmentrequest\",\n ENROLLMENT_RESPONSE: \"enrollmentresponse\",\n EPISODE_OF_CARE: \"episodeofcare\",\n EVENT_DEFINITION: \"eventdefinition\",\n EVIDENCE: \"evidence\",\n EVIDENCE_VARIABLE: \"evidencevariable\",\n EXPLANATION_OF_BENEFIT: \"explanationofbenefit\",\n FAMILY_MEMBER_HISTORY: \"familymemberhistory\",\n FLAG: \"flag\",\n GOAL: \"goal\",\n GROUP: \"group\",\n GUIDANCE_RESPONSE: \"guidanceresponse\",\n HEALTHCARE_SERVICE: \"healthcareservice\",\n IMAGING_STUDY: \"imagingstudy\",\n IMMUNIZATION: \"immunization\",\n IMMUNIZATION_EVALUATION: \"immunizationevaluation\",\n IMMUNIZATION_RECOMMENDATION: \"immunizationrecommendation\",\n INSURANCE_PLAN: \"insuranceplan\",\n INVOICE: \"invoice\",\n LIBRARY: \"library\",\n LINKAGE: \"linkage\",\n LIST: \"list\",\n LOCATION: \"location\",\n MEASURE: \"measure\",\n MEASURE_REPORT: \"measurereport\",\n MEDIA: \"media\",\n MEDICATION: \"medication\",\n MEDICATION_ADMINISTRATION: \"medicationadministration\",\n MEDICATION_DISPENSE: \"medicationdispense\",\n MEDICATION_KNOWLEDGE: \"medicationknowledge\",\n MEDICATION_REQUEST: \"medicationrequest\",\n MEDICATION_STATEMENT: \"medicationstatement\",\n MESSAGE_HEADER: \"messageheader\",\n MOLECULAR_SEQUENCE: \"molecularsequence\",\n NUTRITION_ORDER: \"nutritionorder\",\n OBSERVATION: \"observation\",\n ORGANIZATION: \"organization\",\n ORGANIZATION_AFFILIATION: \"organizationaffiliation\",\n PATIENT: \"patient\",\n PAYMENT_NOTICE: \"paymentnotice\",\n PAYMENT_RECONCILIATION: \"paymentreconciliation\",\n PERSON: \"person\",\n PLAN_DEFINITION: \"plandefinition\",\n PRACTITIONER: \"practitioner\",\n PRACTITIONER_ROLE: \"practitionerrole\",\n PROCEDURE: \"procedure\",\n PROVENANCE: \"provenance\",\n QUESTIONNAIRE: \"questionnaire\",\n QUESTIONNAIRE_RESPONSE: \"questionnaireresponse\",\n RELATED_PERSON: \"relatedperson\",\n REQUEST_GROUP: \"requestgroup\",\n RESEARCH_STUDY: \"researchstudy\",\n RESEARCH_SUBJECT: \"researchsubject\",\n RISK_ASSESSMENT: \"riskassessment\",\n RISK_EVIDENCE_SYNTHESIS: \"riskevidencesynthesis\",\n SCHEDULE: \"schedule\",\n SERVICE_REQUEST: \"servicerequest\",\n SLOT: \"slot\",\n SPECIMEN: \"specimen\",\n SUBSTANCE: \"substance\",\n SUBSCRIPTION: \"subscription\",\n SUPPLY_DELIVERY: \"supplydelivery\",\n SUPPLY_REQUEST: \"supplyrequest\",\n TASK: \"task\",\n VERIFICATION_RESULT: \"verificationresult\",\n VISION_PRESCRIPTION: \"visionprescription\",\n} as const;\n\n/** Data-plane entity name (model.entity and key segment). */\nexport type DataEntityName =\n (typeof DATA_ENTITY_NAMES)[keyof typeof DATA_ENTITY_NAMES];\n\n/**\n * Creates an ElectroDB Entity for a data-plane FHIR resource with the common model, attributes,\n * base-table index, and GSI4 (Resource Type Index) for list-by-type-in-workspace.\n * PK template uses resourceTypeLabel in the key (e.g. RT#Encounter#ID#...).\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md — GSI4, List by type in workspace (no scan)\n */\nexport function createDataEntity(\n entity: DataEntityName,\n resourceTypeLabel: string,\n) {\n return new Entity({\n model: {\n entity,\n service: \"data\",\n version: \"01\",\n },\n attributes: dataEntityAttributes,\n indexes: {\n /** Base table: PK, SK (data store key names). PK is built from tenantId, workspaceId, id. */\n record: {\n pk: {\n field: \"PK\",\n composite: [\"tenantId\", \"workspaceId\", \"id\"],\n template: `TID#\\${tenantId}#WID#\\${workspaceId}#RT#${resourceTypeLabel}#ID#\\${id}`,\n },\n sk: {\n field: \"SK\",\n composite: [\"sk\"],\n },\n },\n /** GSI4 — Resource Type Index: list all resources of this type in a workspace (no scan). Used by list operations (e.g. GET /Patient). */\n gsi4: {\n index: \"GSI4\",\n pk: {\n field: \"GSI4PK\",\n composite: [\"tenantId\", \"workspaceId\"],\n template: `TID#\\${tenantId}#WID#\\${workspaceId}#RT#${resourceTypeLabel}`,\n },\n sk: {\n field: \"GSI4SK\",\n composite: [\"id\"],\n template: `ID#\\${id}`,\n },\n },\n },\n });\n}\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Account data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Account#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const AccountEntity = createDataEntity(\"account\", \"Account\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ActivityDefinition data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ActivityDefinition#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ActivityDefinitionEntity = createDataEntity(\n \"activitydefinition\",\n \"ActivityDefinition\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * AdverseEvent data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#AdverseEvent#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const AdverseEventEntity = createDataEntity(\n \"adverseevent\",\n \"AdverseEvent\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * AllergyIntolerance data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#AllergyIntolerance#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const AllergyIntoleranceEntity = createDataEntity(\n \"allergyintolerance\",\n \"AllergyIntolerance\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Appointment data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Appointment#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const AppointmentEntity = createDataEntity(\"appointment\", \"Appointment\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * AppointmentResponse data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#AppointmentResponse#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const AppointmentResponseEntity = createDataEntity(\n \"appointmentresponse\",\n \"AppointmentResponse\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * AuditEvent data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#AuditEvent#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const AuditEventEntity = createDataEntity(\"auditevent\", \"AuditEvent\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Basic data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Basic#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const BasicEntity = createDataEntity(\"basic\", \"Basic\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * BiologicallyDerivedProduct data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#BiologicallyDerivedProduct#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const BiologicallyDerivedProductEntity = createDataEntity(\n \"biologicallyderivedproduct\",\n \"BiologicallyDerivedProduct\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * BodyStructure data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#BodyStructure#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const BodyStructureEntity = createDataEntity(\n \"bodystructure\",\n \"BodyStructure\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * CarePlan data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#CarePlan#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const CarePlanEntity = createDataEntity(\"careplan\", \"CarePlan\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * CareTeam data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#CareTeam#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const CareTeamEntity = createDataEntity(\"careteam\", \"CareTeam\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * CatalogEntry data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#CatalogEntry#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const CatalogEntryEntity = createDataEntity(\n \"catalogentry\",\n \"CatalogEntry\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ChargeItemDefinition data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ChargeItemDefinition#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ChargeItemDefinitionEntity = createDataEntity(\n \"chargeitemdefinition\",\n \"ChargeItemDefinition\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ChargeItem data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ChargeItem#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ChargeItemEntity = createDataEntity(\"chargeitem\", \"ChargeItem\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Claim data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Claim#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ClaimEntity = createDataEntity(\"claim\", \"Claim\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ClaimResponse data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ClaimResponse#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ClaimResponseEntity = createDataEntity(\n \"claimresponse\",\n \"ClaimResponse\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ClinicalImpression data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ClinicalImpression#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ClinicalImpressionEntity = createDataEntity(\n \"clinicalimpression\",\n \"ClinicalImpression\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Communication data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Communication#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const CommunicationEntity = createDataEntity(\n \"communication\",\n \"Communication\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * CommunicationRequest data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#CommunicationRequest#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const CommunicationRequestEntity = createDataEntity(\n \"communicationrequest\",\n \"CommunicationRequest\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Composition data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Composition#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const CompositionEntity = createDataEntity(\"composition\", \"Composition\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Condition data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Condition#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ConditionEntity = createDataEntity(\"condition\", \"Condition\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Consent data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Consent#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ConsentEntity = createDataEntity(\"consent\", \"Consent\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Contract data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Contract#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ContractEntity = createDataEntity(\"contract\", \"Contract\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * CoverageEligibilityRequest data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#CoverageEligibilityRequest#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const CoverageEligibilityRequestEntity = createDataEntity(\n \"coverageeligibilityrequest\",\n \"CoverageEligibilityRequest\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * CoverageEligibilityResponse data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#CoverageEligibilityResponse#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const CoverageEligibilityResponseEntity = createDataEntity(\n \"coverageeligibilityresponse\",\n \"CoverageEligibilityResponse\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Coverage data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Coverage#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const CoverageEntity = createDataEntity(\"coverage\", \"Coverage\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * DetectedIssue data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#DetectedIssue#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const DetectedIssueEntity = createDataEntity(\n \"detectedissue\",\n \"DetectedIssue\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * DeviceDefinition data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#DeviceDefinition#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const DeviceDefinitionEntity = createDataEntity(\n \"devicedefinition\",\n \"DeviceDefinition\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Device data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Device#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const DeviceEntity = createDataEntity(\"device\", \"Device\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * DeviceMetric data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#DeviceMetric#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const DeviceMetricEntity = createDataEntity(\n \"devicemetric\",\n \"DeviceMetric\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * DeviceRequest data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#DeviceRequest#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const DeviceRequestEntity = createDataEntity(\n \"devicerequest\",\n \"DeviceRequest\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * DeviceUseStatement data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#DeviceUseStatement#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const DeviceUseStatementEntity = createDataEntity(\n \"deviceusestatement\",\n \"DeviceUseStatement\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * DiagnosticReport data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#DiagnosticReport#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const DiagnosticReportEntity = createDataEntity(\n \"diagnosticreport\",\n \"DiagnosticReport\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * DocumentManifest data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#DocumentManifest#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const DocumentManifestEntity = createDataEntity(\n \"documentmanifest\",\n \"DocumentManifest\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * DocumentReference data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#DocumentReference#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const DocumentReferenceEntity = createDataEntity(\n \"documentreference\",\n \"DocumentReference\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * EffectEvidenceSynthesis data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#EffectEvidenceSynthesis#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const EffectEvidenceSynthesisEntity = createDataEntity(\n \"effectevidencesynthesis\",\n \"EffectEvidenceSynthesis\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Encounter data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Encounter#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with Patient and other domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entities/encounter.md\n */\nexport const EncounterEntity = createDataEntity(\"encounter\", \"Encounter\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Endpoint data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Endpoint#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const EndpointEntity = createDataEntity(\"endpoint\", \"Endpoint\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * EnrollmentRequest data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#EnrollmentRequest#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const EnrollmentRequestEntity = createDataEntity(\n \"enrollmentrequest\",\n \"EnrollmentRequest\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * EnrollmentResponse data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#EnrollmentResponse#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const EnrollmentResponseEntity = createDataEntity(\n \"enrollmentresponse\",\n \"EnrollmentResponse\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * EpisodeOfCare data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#EpisodeOfCare#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const EpisodeOfCareEntity = createDataEntity(\n \"episodeofcare\",\n \"EpisodeOfCare\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * EventDefinition data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#EventDefinition#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const EventDefinitionEntity = createDataEntity(\n \"eventdefinition\",\n \"EventDefinition\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Evidence data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Evidence#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const EvidenceEntity = createDataEntity(\"evidence\", \"Evidence\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * EvidenceVariable data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#EvidenceVariable#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const EvidenceVariableEntity = createDataEntity(\n \"evidencevariable\",\n \"EvidenceVariable\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ExplanationOfBenefit data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ExplanationOfBenefit#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ExplanationOfBenefitEntity = createDataEntity(\n \"explanationofbenefit\",\n \"ExplanationOfBenefit\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * FamilyMemberHistory data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#FamilyMemberHistory#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const FamilyMemberHistoryEntity = createDataEntity(\n \"familymemberhistory\",\n \"FamilyMemberHistory\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Flag data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Flag#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const FlagEntity = createDataEntity(\"flag\", \"Flag\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Goal data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Goal#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const GoalEntity = createDataEntity(\"goal\", \"Goal\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Group data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Group#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const GroupEntity = createDataEntity(\"group\", \"Group\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * GuidanceResponse data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#GuidanceResponse#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const GuidanceResponseEntity = createDataEntity(\n \"guidanceresponse\",\n \"GuidanceResponse\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * HealthcareService data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#HealthcareService#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const HealthcareServiceEntity = createDataEntity(\n \"healthcareservice\",\n \"HealthcareService\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ImagingStudy data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ImagingStudy#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ImagingStudyEntity = createDataEntity(\n \"imagingstudy\",\n \"ImagingStudy\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Immunization data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Immunization#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ImmunizationEntity = createDataEntity(\n \"immunization\",\n \"Immunization\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ImmunizationEvaluation data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ImmunizationEvaluation#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ImmunizationEvaluationEntity = createDataEntity(\n \"immunizationevaluation\",\n \"ImmunizationEvaluation\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ImmunizationRecommendation data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ImmunizationRecommendation#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ImmunizationRecommendationEntity = createDataEntity(\n \"immunizationrecommendation\",\n \"ImmunizationRecommendation\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * InsurancePlan data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#InsurancePlan#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const InsurancePlanEntity = createDataEntity(\n \"insuranceplan\",\n \"InsurancePlan\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Invoice data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Invoice#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const InvoiceEntity = createDataEntity(\"invoice\", \"Invoice\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Library data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Library#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const LibraryEntity = createDataEntity(\"library\", \"Library\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Linkage data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Linkage#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const LinkageEntity = createDataEntity(\"linkage\", \"Linkage\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * List data-store entity based on FHIR R4 (single-table store).\n * Represents the FHIR List resource (curated list of items).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#List#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ListEntity = createDataEntity(\"list\", \"List\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Location data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Location#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const LocationEntity = createDataEntity(\"location\", \"Location\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Measure data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Measure#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MeasureEntity = createDataEntity(\"measure\", \"Measure\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * MeasureReport data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#MeasureReport#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MeasureReportEntity = createDataEntity(\n \"measurereport\",\n \"MeasureReport\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Media data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Media#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MediaEntity = createDataEntity(\"media\", \"Media\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * MedicationAdministration data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#MedicationAdministration#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MedicationAdministrationEntity = createDataEntity(\n \"medicationadministration\",\n \"MedicationAdministration\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * MedicationDispense data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#MedicationDispense#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MedicationDispenseEntity = createDataEntity(\n \"medicationdispense\",\n \"MedicationDispense\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Medication data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Medication#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MedicationEntity = createDataEntity(\"medication\", \"Medication\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * MedicationKnowledge data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#MedicationKnowledge#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MedicationKnowledgeEntity = createDataEntity(\n \"medicationknowledge\",\n \"MedicationKnowledge\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * MedicationRequest data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#MedicationRequest#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MedicationRequestEntity = createDataEntity(\n \"medicationrequest\",\n \"MedicationRequest\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * MedicationStatement data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#MedicationStatement#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MedicationStatementEntity = createDataEntity(\n \"medicationstatement\",\n \"MedicationStatement\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * MessageHeader data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#MessageHeader#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MessageHeaderEntity = createDataEntity(\n \"messageheader\",\n \"MessageHeader\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * MolecularSequence data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#MolecularSequence#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MolecularSequenceEntity = createDataEntity(\n \"molecularsequence\",\n \"MolecularSequence\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * NutritionOrder data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#NutritionOrder#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const NutritionOrderEntity = createDataEntity(\n \"nutritionorder\",\n \"NutritionOrder\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Observation data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Observation#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ObservationEntity = createDataEntity(\"observation\", \"Observation\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * OrganizationAffiliation data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#OrganizationAffiliation#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const OrganizationAffiliationEntity = createDataEntity(\n \"organizationaffiliation\",\n \"OrganizationAffiliation\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Organization data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Organization#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const OrganizationEntity = createDataEntity(\n \"organization\",\n \"Organization\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Patient data-store entity based on FHIR (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Patient#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) are documented in the Data-Store Entity Standards (FHIR).\n * Audit is in FHIR resource meta (meta.extension), not item attributes. See entity-standards.md.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entities/patient.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const PatientEntity = createDataEntity(\"patient\", \"Patient\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * PaymentNotice data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#PaymentNotice#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const PaymentNoticeEntity = createDataEntity(\n \"paymentnotice\",\n \"PaymentNotice\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * PaymentReconciliation data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#PaymentReconciliation#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const PaymentReconciliationEntity = createDataEntity(\n \"paymentreconciliation\",\n \"PaymentReconciliation\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Person data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Person#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const PersonEntity = createDataEntity(\"person\", \"Person\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * PlanDefinition data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#PlanDefinition#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const PlanDefinitionEntity = createDataEntity(\n \"plandefinition\",\n \"PlanDefinition\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Practitioner data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Practitioner#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with Patient, Encounter, and entity standards.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entities/practitioner.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const PractitionerEntity = createDataEntity(\n \"practitioner\",\n \"Practitioner\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * PractitionerRole data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#PractitionerRole#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const PractitionerRoleEntity = createDataEntity(\n \"practitionerrole\",\n \"PractitionerRole\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Procedure data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Procedure#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ProcedureEntity = createDataEntity(\"procedure\", \"Procedure\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Provenance data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Provenance#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ProvenanceEntity = createDataEntity(\"provenance\", \"Provenance\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Questionnaire data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Questionnaire#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const QuestionnaireEntity = createDataEntity(\n \"questionnaire\",\n \"Questionnaire\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * QuestionnaireResponse data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#QuestionnaireResponse#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const QuestionnaireResponseEntity = createDataEntity(\n \"questionnaireresponse\",\n \"QuestionnaireResponse\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * RelatedPerson data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#RelatedPerson#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const RelatedPersonEntity = createDataEntity(\n \"relatedperson\",\n \"RelatedPerson\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * RequestGroup data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#RequestGroup#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const RequestGroupEntity = createDataEntity(\n \"requestgroup\",\n \"RequestGroup\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ResearchStudy data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ResearchStudy#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ResearchStudyEntity = createDataEntity(\n \"researchstudy\",\n \"ResearchStudy\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ResearchSubject data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ResearchSubject#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ResearchSubjectEntity = createDataEntity(\n \"researchsubject\",\n \"ResearchSubject\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * RiskAssessment data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#RiskAssessment#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const RiskAssessmentEntity = createDataEntity(\n \"riskassessment\",\n \"RiskAssessment\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * RiskEvidenceSynthesis data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#RiskEvidenceSynthesis#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const RiskEvidenceSynthesisEntity = createDataEntity(\n \"riskevidencesynthesis\",\n \"RiskEvidenceSynthesis\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Schedule data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Schedule#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ScheduleEntity = createDataEntity(\"schedule\", \"Schedule\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ServiceRequest data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ServiceRequest#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ServiceRequestEntity = createDataEntity(\n \"servicerequest\",\n \"ServiceRequest\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Slot data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Slot#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const SlotEntity = createDataEntity(\"slot\", \"Slot\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Specimen data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Specimen#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const SpecimenEntity = createDataEntity(\"specimen\", \"Specimen\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Subscription data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Subscription#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const SubscriptionEntity = createDataEntity(\n \"subscription\",\n \"Subscription\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Substance data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Substance#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const SubstanceEntity = createDataEntity(\"substance\", \"Substance\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * SupplyDelivery data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#SupplyDelivery#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const SupplyDeliveryEntity = createDataEntity(\n \"supplydelivery\",\n \"SupplyDelivery\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * SupplyRequest data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#SupplyRequest#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const SupplyRequestEntity = createDataEntity(\n \"supplyrequest\",\n \"SupplyRequest\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Task data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Task#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const TaskEntity = createDataEntity(\"task\", \"Task\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * VerificationResult data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#VerificationResult#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const VerificationResultEntity = createDataEntity(\n \"verificationresult\",\n \"VerificationResult\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * VisionPrescription data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#VisionPrescription#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const VisionPrescriptionEntity = createDataEntity(\n \"visionprescription\",\n \"VisionPrescription\",\n);\n","import { compressResource, decompressResource } from \"../../lib/compression\";\nimport { NotFoundError } from \"../errors\";\nimport type { OpenHiContext } from \"../openhi-context\";\n\n/**\n * Sort key for the current record version. Matches Dynamo record index SK default.\n * Use this in get/update/delete (and create where applicable) for data-plane entities.\n */\nexport const DATA_ENTITY_SK = \"CURRENT\" as const;\n\n/** Base params for data-entity operations: context and optional table override. */\nexport interface BaseDataEntityParams {\n context: OpenHiContext;\n /** Optional table name override; resolved by data service from DYNAMO_TABLE_NAME when omitted. */\n tableName?: string;\n}\n\n/** Params for get-by-id and delete (context + id + optional tableName). */\nexport interface GetByIdParams extends BaseDataEntityParams {\n id: string;\n}\n\n/** Params for list (context + optional tableName). */\nexport type ListParams = BaseDataEntityParams;\n\n/** Result for create / get-by-id / update: single resource. */\nexport interface SingleResourceResult<T> {\n id: string;\n resource: T;\n}\n\n/** Entry shape for list results. */\nexport interface ListEntry<T> {\n id: string;\n resource: T;\n}\n\n/** Result for list: entries array. */\nexport interface ListResult<T> {\n entries: Array<ListEntry<T>>;\n}\n\n/** Minimal entity shape for get (used by getDataEntityById). */\ninterface EntityWithGet {\n get(params: {\n tenantId: string;\n workspaceId: string;\n id: string;\n sk: string;\n }): { go(): Promise<{ data: { id: string; resource: string } | null }> };\n}\n\n/** Minimal entity shape for delete (used by deleteDataEntityById). */\ninterface EntityWithDelete {\n delete(params: {\n tenantId: string;\n workspaceId: string;\n id: string;\n sk: string;\n }): { go(): Promise<unknown> };\n}\n\n/** Minimal entity shape for list via GSI4 (used by listDataEntitiesByWorkspace). */\ninterface EntityWithGsi4Query {\n query: {\n gsi4(params: { tenantId: string; workspaceId: string }): {\n go(): Promise<{ data: Array<{ id: string; resource: string }> | null }>;\n };\n };\n}\n\n/** Minimal entity shape for put (used by createDataEntityRecord). */\ninterface EntityWithPut {\n put(attrs: {\n sk: string;\n tenantId: string;\n workspaceId: string;\n id: string;\n resource: string;\n vid: string;\n lastUpdated: string;\n }): { go(): Promise<unknown> };\n}\n\n/** Minimal entity shape for patch (used by updateDataEntityById). */\ninterface EntityWithPatch {\n get(params: {\n tenantId: string;\n workspaceId: string;\n id: string;\n sk: string;\n }): { go(): Promise<{ data: { id: string; resource: string } | null }> };\n patch(params: {\n tenantId: string;\n workspaceId: string;\n id: string;\n sk: string;\n }): {\n set(attrs: { resource: string; lastUpdated: string }): {\n go(): Promise<unknown>;\n };\n };\n}\n\n/**\n * Get a single data-entity record by id. Decompresses and parses resource; throws NotFoundError if missing.\n * Use from get-by-id operations with the appropriate entity and resource type.\n */\nexport async function getDataEntityById<T>(\n entity: EntityWithGet,\n tenantId: string,\n workspaceId: string,\n id: string,\n resourceLabel: string,\n): Promise<SingleResourceResult<T>> {\n const result = await entity\n .get({\n tenantId,\n workspaceId,\n id,\n sk: DATA_ENTITY_SK,\n })\n .go();\n\n if (!result.data) {\n throw new NotFoundError(`${resourceLabel} ${id} not found`, {\n details: { id },\n });\n }\n\n const parsed = JSON.parse(decompressResource(result.data.resource)) as T & {\n id?: string;\n };\n return {\n id: result.data.id,\n resource: { ...parsed, id: result.data.id } as T,\n };\n}\n\n/**\n * Delete a data-entity record by id. Idempotent (no-op if not found).\n * Use from delete operations with the appropriate entity.\n */\nexport async function deleteDataEntityById(\n entity: EntityWithDelete,\n tenantId: string,\n workspaceId: string,\n id: string,\n): Promise<void> {\n await entity\n .delete({\n tenantId,\n workspaceId,\n id,\n sk: DATA_ENTITY_SK,\n })\n .go();\n}\n\n/**\n * List data-entity records in a workspace via GSI4. Decompresses and parses each resource.\n * Use from list operations with the appropriate entity and resource type.\n */\nexport async function listDataEntitiesByWorkspace<T>(\n entity: EntityWithGsi4Query,\n tenantId: string,\n workspaceId: string,\n): Promise<ListResult<T>> {\n const result = await entity.query.gsi4({ tenantId, workspaceId }).go();\n\n const items = result.data ?? [];\n const entries: Array<ListEntry<T>> = items.map((item) => {\n const parsed = JSON.parse(decompressResource(item.resource)) as T & {\n id?: string;\n };\n return {\n id: item.id,\n resource: { ...parsed, id: item.id } as T,\n };\n });\n\n return { entries };\n}\n\n/**\n * Create a data-entity record with put. Computes vid from lastUpdated (from resource meta or fallback).\n * Use from create operations (e.g. Practitioner, Encounter) that build the resource with audit in meta.\n */\nexport async function createDataEntityRecord<T>(\n entity: EntityWithPut,\n tenantId: string,\n workspaceId: string,\n id: string,\n resourceWithAudit: T & { meta?: { lastUpdated?: string } },\n fallbackDate: string,\n): Promise<SingleResourceResult<T>> {\n const lastUpdated =\n resourceWithAudit.meta?.lastUpdated ??\n fallbackDate ??\n new Date().toISOString();\n const vid =\n lastUpdated.replace(/[-:T.Z]/g, \"\").slice(0, 12) || Date.now().toString(36);\n\n await entity\n .put({\n sk: DATA_ENTITY_SK,\n tenantId,\n workspaceId,\n id,\n resource: compressResource(JSON.stringify(resourceWithAudit)),\n vid,\n lastUpdated,\n })\n .go();\n\n return {\n id,\n resource: resourceWithAudit as T,\n };\n}\n\n/**\n * Update a data-entity record by id: get existing, throw if not found, then call builder with\n * decompressed existing resource string; builder returns { resource, lastUpdated }; then patch.\n * Use from update operations with the appropriate entity and resource type.\n */\nexport async function updateDataEntityById<T>(\n entity: EntityWithPatch,\n tenantId: string,\n workspaceId: string,\n id: string,\n resourceLabel: string,\n context: OpenHiContext,\n buildPatched: (existingResourceStr: string) => {\n resource: unknown;\n lastUpdated: string;\n },\n): Promise<SingleResourceResult<T>> {\n const existing = await entity\n .get({\n tenantId,\n workspaceId,\n id,\n sk: DATA_ENTITY_SK,\n })\n .go();\n\n if (!existing.data) {\n throw new NotFoundError(`${resourceLabel} ${id} not found`, {\n details: { id },\n });\n }\n\n const existingStr = decompressResource(existing.data.resource);\n const { resource, lastUpdated } = buildPatched(existingStr);\n\n await entity\n .patch({\n tenantId,\n workspaceId,\n id,\n sk: DATA_ENTITY_SK,\n })\n .set({\n resource: compressResource(JSON.stringify(resource)),\n lastUpdated,\n })\n .go();\n\n return {\n id,\n resource: resource as T,\n };\n}\n","import type { Encounter } from \"@openhi/types\";\nimport type { Request, Response } from \"express\";\nimport { createEncounterOperation } from \"../../../../operations/data/encounter/encounter-create-operation\";\nimport { BASE_PATH, requireJsonBody } from \"../../common\";\n\n/** POST /Encounter — create: accepts Encounter in body, persists via data layer, returns 201. */\nexport async function createEncounterRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const bodyResult = requireJsonBody(req, res);\n if (\"errorResponse\" in bodyResult) return bodyResult.errorResponse;\n\n const ctx = req.openhiContext!;\n const body = bodyResult.body as Encounter;\n const encounter: Encounter = {\n ...body,\n resourceType: \"Encounter\",\n } as Encounter;\n\n try {\n const result = await createEncounterOperation({\n context: ctx,\n body: encounter,\n });\n return res\n .status(201)\n .location(`${BASE_PATH.ENCOUNTER}/${result.id}`)\n .json(result.resource);\n } catch (err: unknown) {\n console.error(\"POST Encounter error:\", err);\n return res.status(500).json({\n resourceType: \"OperationOutcome\",\n issue: [\n { severity: \"error\", code: \"exception\", diagnostics: String(err) },\n ],\n });\n }\n}\n","import { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type BaseDataEntityParams,\n deleteDataEntityById,\n} from \"../../data-operations-common\";\n\n/**\n * Delete an Encounter by id. No-op if the item does not exist (ElectroDB delete is idempotent).\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport interface DeleteEncounterParams extends BaseDataEntityParams {\n id: string;\n}\n\n/**\n * Deletes the current version of an Encounter. Does not throw when the encounter does not exist.\n * Throws on service errors; adapters map to HTTP/GraphQL.\n */\nexport async function deleteEncounterOperation(\n params: DeleteEncounterParams,\n): Promise<void> {\n const { context, id, tableName } = params;\n const { tenantId, workspaceId } = context;\n const service = getDynamoDataService(tableName);\n await deleteDataEntityById(\n service.entities.encounter as Parameters<typeof deleteDataEntityById>[0],\n tenantId,\n workspaceId,\n id,\n );\n}\n","import type { Request, Response } from \"express\";\nimport { deleteEncounterOperation } from \"../../../../operations/data/encounter/encounter-delete-operation\";\nimport { sendOperationOutcome500 } from \"../../common\";\n\n/** DELETE /Encounter/:id — delete: removes from data store, returns 204. */\nexport async function deleteEncounterRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n\n try {\n await deleteEncounterOperation({ context: ctx, id });\n return res.status(204).send();\n } catch (err: unknown) {\n return sendOperationOutcome500(res, err, \"DELETE Encounter error:\");\n }\n}\n","import type { Encounter } from \"@openhi/types\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type GetByIdParams,\n getDataEntityById,\n type SingleResourceResult,\n} from \"../../data-operations-common\";\n\n/**\n * Get a single Encounter by id. Throws NotFoundError if not found.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport type GetEncounterByIdParams = GetByIdParams;\n\nexport type GetEncounterByIdResult = SingleResourceResult<Encounter>;\n\n/**\n * Returns the current version of an Encounter. Throws NotFoundError when the encounter does not exist.\n */\nexport async function getEncounterByIdOperation(\n params: GetEncounterByIdParams,\n): Promise<GetEncounterByIdResult> {\n const { context, id, tableName } = params;\n const { tenantId, workspaceId } = context;\n const service = getDynamoDataService(tableName);\n return getDataEntityById<Encounter>(\n service.entities.encounter as Parameters<typeof getDataEntityById>[0],\n tenantId,\n workspaceId,\n id,\n \"Encounter\",\n );\n}\n","import type { Request, Response } from \"express\";\nimport { NotFoundError, domainErrorToHttpStatus } from \"../../../../errors\";\nimport { getEncounterByIdOperation } from \"../../../../operations/data/encounter/encounter-get-by-id-operation\";\nimport { sendOperationOutcome404, sendOperationOutcome500 } from \"../../common\";\n\n/** GET /Encounter/:id — read: returns a single Encounter resource from the data store or 404. */\nexport async function getEncounterByIdRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n\n try {\n const result = await getEncounterByIdOperation({ context: ctx, id });\n return res.json(result.resource);\n } catch (err: unknown) {\n const status = domainErrorToHttpStatus(err);\n if (status === 404) {\n const diagnostics =\n err instanceof NotFoundError\n ? err.message\n : `Encounter ${id} not found`;\n return sendOperationOutcome404(res, diagnostics);\n }\n return sendOperationOutcome500(res, err, \"GET Encounter error:\");\n }\n}\n","import type { Encounter } from \"@openhi/types\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type ListParams,\n listDataEntitiesByWorkspace,\n type ListResult,\n type ListEntry,\n} from \"../../data-operations-common\";\n\n/**\n * List encounters in a workspace (GSI4). Returns domain result for adapters to map to FHIR Bundle or other formats.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport type ListEncountersParams = ListParams;\n\nexport type EncounterListEntry = ListEntry<Encounter>;\n\nexport type ListEncountersResult = ListResult<Encounter>;\n\n/**\n * Lists all Encounters in the workspace. Uses GSI4 (Resource Type Index).\n * Throws on service errors; adapters map to HTTP/GraphQL/Step Function.\n */\nexport async function listEncountersOperation(\n params: ListEncountersParams,\n): Promise<ListEncountersResult> {\n const { context, tableName } = params;\n const { tenantId, workspaceId } = context;\n const service = getDynamoDataService(tableName);\n return listDataEntitiesByWorkspace<Encounter>(\n service.entities.encounter as Parameters<\n typeof listDataEntitiesByWorkspace\n >[0],\n tenantId,\n workspaceId,\n );\n}\n","import type { Request, Response } from \"express\";\nimport { listEncountersOperation } from \"../../../../operations/data/encounter/encounter-list-operation\";\nimport {\n BASE_PATH,\n buildSearchsetBundle,\n sendOperationOutcome500,\n} from \"../../common\";\n\n/**\n * GET /Encounter — search/list: returns a FHIR Bundle (searchset) from the data store.\n * Uses GSI4 (Resource Type Index) to list all Encounters in the workspace without a table scan.\n */\nexport async function listEncountersRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const ctx = req.openhiContext!;\n\n try {\n const result = await listEncountersOperation({ context: ctx });\n const bundle = buildSearchsetBundle(BASE_PATH.ENCOUNTER, result.entries);\n return res.json(bundle);\n } catch (err: unknown) {\n return sendOperationOutcome500(res, err, \"GET /Encounter list error:\");\n }\n}\n","import type { Encounter, Meta } from \"@openhi/types\";\nimport {\n mergeAuditIntoMeta,\n type MetaWithExtensions,\n} from \"../../../audit-meta\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type BaseDataEntityParams,\n updateDataEntityById,\n type SingleResourceResult,\n} from \"../../data-operations-common\";\n\n/**\n * Update an Encounter by id. Throws NotFoundError if the encounter does not exist.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport interface UpdateEncounterParams extends BaseDataEntityParams {\n id: string;\n /** FHIR Encounter body (resourceType, id, meta optional). */\n body: Encounter;\n}\n\nexport type UpdateEncounterResult = SingleResourceResult<Encounter>;\n\n/**\n * Updates the current version of an Encounter. Merges audit from context into meta.\n * Throws NotFoundError when the encounter does not exist.\n */\nexport async function updateEncounterOperation(\n params: UpdateEncounterParams,\n): Promise<UpdateEncounterResult> {\n const { context, id, body, tableName } = params;\n const { tenantId, workspaceId, date, actorId, actorName } = context;\n const service = getDynamoDataService(tableName);\n\n return updateDataEntityById<Encounter>(\n service.entities.encounter as Parameters<typeof updateDataEntityById>[0],\n tenantId,\n workspaceId,\n id,\n \"Encounter\",\n context,\n (existingResourceStr) => {\n const bodyWithResource = body as Encounter & { id?: string; meta?: Meta };\n const existingMeta: MetaWithExtensions | undefined = (\n JSON.parse(existingResourceStr) as { meta?: MetaWithExtensions }\n ).meta;\n\n const encounter: Encounter & { id: string; meta?: Meta } = {\n ...body,\n resourceType: \"Encounter\",\n id,\n meta: {\n ...(bodyWithResource.meta ?? {}),\n lastUpdated: date,\n versionId: \"2\",\n },\n };\n\n const encounterWithMeta: Encounter & {\n id: string;\n meta: MetaWithExtensions;\n } = {\n ...encounter,\n meta: mergeAuditIntoMeta(encounter.meta ?? existingMeta, {\n modifiedDate: date,\n modifiedById: actorId,\n modifiedByName: actorName,\n }),\n };\n\n return {\n resource: encounterWithMeta,\n lastUpdated: date,\n };\n },\n );\n}\n","import type { Encounter } from \"@openhi/types\";\nimport type { Request, Response } from \"express\";\nimport { NotFoundError, domainErrorToHttpStatus } from \"../../../../errors\";\nimport { updateEncounterOperation } from \"../../../../operations/data/encounter/encounter-update-operation\";\nimport {\n requireJsonBody,\n sendOperationOutcome404,\n sendOperationOutcome500,\n} from \"../../common\";\n\n/** PUT /Encounter/:id — update: accepts Encounter in body, persists via data layer, returns 200. */\nexport async function updateEncounterRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const bodyResult = requireJsonBody(req, res);\n if (\"errorResponse\" in bodyResult) return bodyResult.errorResponse;\n\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n const body = bodyResult.body;\n const encounter: Encounter = {\n ...body,\n resourceType: \"Encounter\",\n id,\n meta: {\n ...((body?.meta as object) ?? {}),\n lastUpdated: ctx.date,\n versionId: \"2\",\n },\n } as Encounter;\n\n try {\n const result = await updateEncounterOperation({\n context: ctx,\n id,\n body: encounter,\n });\n return res.json(result.resource);\n } catch (err: unknown) {\n const status = domainErrorToHttpStatus(err);\n if (status === 404) {\n const diagnostics =\n err instanceof NotFoundError\n ? err.message\n : `Encounter ${id} not found`;\n return sendOperationOutcome404(res, diagnostics);\n }\n return sendOperationOutcome500(res, err, \"PUT Encounter error:\");\n }\n}\n","import express from \"express\";\nimport { createPatientRoute } from \"./patient-create-route\";\nimport { deletePatientRoute } from \"./patient-delete-route\";\nimport { getPatientByIdRoute } from \"./patient-get-by-id-route\";\nimport { listPatientsRoute } from \"./patient-list-route\";\nimport { updatePatientRoute } from \"./patient-update-route\";\n\n/**\n * Patient REST router: /Patient\n * @see sites/www-docs/content/packages/@openhi/constructs/data/rest-api/routes/patient.md\n */\nconst router: express.Router = express.Router();\n\nrouter.get(\"/\", listPatientsRoute);\nrouter.get(\"/:id\", getPatientByIdRoute);\nrouter.post(\"/\", createPatientRoute);\nrouter.put(\"/:id\", updatePatientRoute);\nrouter.delete(\"/:id\", deletePatientRoute);\n\nexport { router as patientRouter };\n","import type { Meta, Patient } from \"@openhi/types\";\nimport { ulid } from \"ulid\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n patientToPutAttrs,\n type ImportPatientOptions,\n} from \"../../../import-patient\";\nimport type { OpenHiContext } from \"../../../openhi-context\";\n\n/**\n * Create a Patient. Accepts FHIR-like body and OpenHI context; returns created resource.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/operations/patient/patient-create.md\n */\nexport interface CreatePatientParams {\n context: OpenHiContext;\n /** FHIR Patient body (resourceType, id optional, meta optional). */\n body: Patient;\n /** Optional logical id; defaults to body.id or generated. */\n id?: string;\n /** Optional table name override; resolved by data service from DYNAMO_TABLE_NAME when omitted. */\n tableName?: string;\n}\n\nexport interface CreatePatientResult {\n id: string;\n resource: Patient;\n}\n\n/**\n * Creates a Patient. Uses patientToPutAttrs and ElectroDB put.\n * Throws on service/validation errors; adapters map to HTTP/GraphQL.\n */\nexport async function createPatientOperation(\n params: CreatePatientParams,\n): Promise<CreatePatientResult> {\n const { context, body, id: optionalId } = params;\n const { tenantId, workspaceId, date, actorId, actorName } = context;\n const id = body.id ?? optionalId ?? ulid();\n\n const meta: Meta = {\n ...(body.meta ?? {}),\n lastUpdated: date,\n versionId: \"1\",\n };\n\n const patient: Patient & { id: string } = {\n ...body,\n resourceType: \"Patient\",\n id,\n meta,\n };\n\n const options: ImportPatientOptions = {\n tenantId,\n workspaceId,\n createdDate: date,\n createdById: actorId,\n createdByName: actorName,\n modifiedDate: date,\n modifiedById: actorId,\n modifiedByName: actorName,\n };\n\n const service = getDynamoDataService(params.tableName);\n const attrs = patientToPutAttrs(patient, options);\n await service.entities.patient\n .put(attrs as unknown as Parameters<typeof service.entities.patient.put>[0])\n .go();\n\n return {\n id,\n resource: patient,\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type { Meta } from \"@openhi/types\";\nimport { mergeAuditIntoMeta, type AuditFields } from \"./audit-meta\";\nimport { compressResource } from \"../lib/compression\";\nimport { getDynamoDataService } from \"./dynamo/dynamo-data-service\";\n\n/**\n * @see sites/www-docs/content/packages/@openhi/constructs/data/import-patient.md\n */\n\n/** Minimal FHIR Patient shape needed for import (id and resourceType required). */\ninterface FhirPatientLike {\n resourceType: string;\n id: string;\n meta?: Meta | Record<string, unknown>;\n}\n\n/** FHIR Bundle entry (e.g. Synthea transaction bundle). */\ninterface BundleEntry {\n fullUrl?: string;\n resource?: {\n resourceType?: string;\n id?: string;\n meta?: { lastUpdated?: string };\n };\n}\n\n/**\n * Extracts a Patient from parsed JSON. Accepts either:\n * - A standalone Patient resource (root has resourceType \"Patient\"), or\n * - A FHIR Bundle (e.g. Synthea transaction) — uses the first entry whose resource is a Patient.\n */\nfunction extractPatient(parsed: unknown): FhirPatientLike {\n if (parsed && typeof parsed === \"object\" && \"resourceType\" in parsed) {\n const root = parsed as {\n resourceType?: string;\n id?: string;\n meta?: { lastUpdated?: string };\n };\n if (root.resourceType === \"Patient\" && root.id) {\n return root as FhirPatientLike;\n }\n if (root.resourceType === \"Bundle\" && \"entry\" in parsed) {\n const entries = (parsed as { entry?: Array<BundleEntry> }).entry;\n if (Array.isArray(entries)) {\n const patientEntry = entries.find(\n (e) => e?.resource?.resourceType === \"Patient\" && e.resource.id,\n );\n if (patientEntry?.resource) {\n return patientEntry.resource as FhirPatientLike;\n }\n }\n }\n }\n throw new Error(\n \"File must be a FHIR Patient resource or a Bundle containing at least one Patient entry\",\n );\n}\n\nconst SK = \"CURRENT\";\n\n/** Default audit values for create/modify when importing. */\nconst defaultAudit = {\n createdDate: new Date().toISOString(),\n createdById: \"import\",\n createdByName: \"Bulk import\",\n modifiedDate: new Date().toISOString(),\n modifiedById: \"import\",\n modifiedByName: \"Bulk import\",\n};\n\nexport interface ImportPatientOptions {\n tenantId: string;\n workspaceId: string;\n tableName?: string;\n /** Audit fields at same level as tenantId/workspaceId; merged with defaults. */\n createdDate?: string;\n createdById?: string;\n createdByName?: string;\n modifiedDate?: string;\n modifiedById?: string;\n modifiedByName?: string;\n}\n\n/**\n * Maps a FHIR Patient (from JSON) to the attributes required for Patient.put().\n * Uses placeholder GSI2/GSI3 fields so ElectroDB index conditions are satisfied.\n */\nexport function patientToPutAttrs(\n patient: FhirPatientLike,\n options: ImportPatientOptions,\n): Record<string, unknown> {\n const {\n tenantId,\n workspaceId,\n createdDate,\n createdById,\n createdByName,\n modifiedDate,\n modifiedById,\n modifiedByName,\n } = options;\n const lastUpdated =\n (patient.meta?.lastUpdated as string | undefined) ??\n modifiedDate ??\n defaultAudit.modifiedDate ??\n new Date().toISOString();\n const auditMerged: AuditFields = {\n ...defaultAudit,\n ...(createdDate != null && { createdDate }),\n ...(createdById != null && { createdById }),\n ...(createdByName != null && { createdByName }),\n ...(modifiedDate != null && { modifiedDate }),\n ...(modifiedById != null && { modifiedById }),\n ...(modifiedByName != null && { modifiedByName }),\n };\n\n const patientWithMeta = {\n ...patient,\n meta: mergeAuditIntoMeta(patient.meta, auditMerged),\n };\n if (lastUpdated && !patientWithMeta.meta.lastUpdated) {\n (patientWithMeta.meta as Record<string, unknown>).lastUpdated = lastUpdated;\n }\n\n return {\n sk: SK,\n tenantId,\n workspaceId,\n id: patient.id,\n resource: compressResource(JSON.stringify(patientWithMeta)),\n vid:\n lastUpdated.replace(/[-:T.Z]/g, \"\").slice(0, 12) ||\n Date.now().toString(36),\n lastUpdated,\n identifierSystem: \"\",\n identifierValue: \"\",\n facilityId: \"\",\n normalizedName: \"\",\n };\n}\n\n/**\n * Reads a single Patient JSON file and imports it into the FHIR store.\n * Table name: options.tableName is passed through; data service resolves from DYNAMO_TABLE_NAME when omitted.\n */\nexport async function importPatientFromFile(\n filePath: string,\n options: ImportPatientOptions,\n): Promise<{ id: string; tenantId: string; workspaceId: string }> {\n const resolved = resolve(filePath);\n const raw = readFileSync(resolved, \"utf-8\");\n const parsed: unknown = JSON.parse(raw);\n const patient = extractPatient(parsed);\n\n const service = getDynamoDataService(options.tableName);\n const attrs = patientToPutAttrs(patient, options);\n\n const result = await service.entities.patient\n .put(attrs as unknown as Parameters<typeof service.entities.patient.put>[0])\n .go();\n\n const data = (\n result as { data?: { id: string; tenantId: string; workspaceId: string } }\n ).data;\n if (!data) {\n throw new Error(`Put failed for Patient ${patient.id}`);\n }\n\n return {\n id: data.id,\n tenantId: data.tenantId,\n workspaceId: data.workspaceId,\n };\n}\n\n/** Run as script: node/ts-node import-patient.ts <path-to-patient.json> [tenantId] [workspaceId] */\nasync function main(): Promise<void> {\n const [, , fileArg, tenantId = \"tenant-1\", workspaceId = \"ws-1\"] =\n process.argv;\n\n if (!fileArg) {\n console.error(\n \"Usage: import-patient.ts <path-to-patient.json> [tenantId] [workspaceId]\",\n );\n process.exit(1);\n }\n\n try {\n const result = await importPatientFromFile(fileArg, {\n tenantId,\n workspaceId,\n });\n console.log(\n `Imported Patient ${result.id} (tenant=${result.tenantId}, workspace=${result.workspaceId})`,\n );\n } catch (err) {\n console.error(err);\n process.exit(1);\n }\n}\n\nif (require.main === module) {\n void main();\n}\n","import type { Patient } from \"@openhi/types\";\nimport type { Request, Response } from \"express\";\nimport { createPatientOperation } from \"../../../../operations/data/patient/patient-create-operation\";\nimport { BASE_PATH, requireJsonBody } from \"../../common\";\n\n/** POST /Patient — create: accepts Patient in body, persists via data layer, returns 201. */\nexport async function createPatientRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const bodyResult = requireJsonBody(req, res);\n if (\"errorResponse\" in bodyResult) return bodyResult.errorResponse;\n\n const ctx = req.openhiContext!;\n const body = bodyResult.body as Patient;\n const patient: Patient = {\n ...body,\n resourceType: \"Patient\",\n } as Patient;\n\n try {\n const result = await createPatientOperation({\n context: ctx,\n body: patient,\n });\n return res\n .status(201)\n .location(`${BASE_PATH.PATIENT}/${result.id}`)\n .json(result.resource);\n } catch (err: unknown) {\n console.error(\"POST Patient error:\", err);\n return res.status(500).json({\n resourceType: \"OperationOutcome\",\n issue: [\n { severity: \"error\", code: \"exception\", diagnostics: String(err) },\n ],\n });\n }\n}\n","import { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type BaseDataEntityParams,\n deleteDataEntityById,\n} from \"../../data-operations-common\";\n\n/**\n * Delete a Patient by id. No-op if the item does not exist (ElectroDB delete is idempotent).\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport interface DeletePatientParams extends BaseDataEntityParams {\n id: string;\n}\n\n/**\n * Deletes the current version of a Patient. Does not throw when the patient does not exist.\n * Throws on service errors; adapters map to HTTP/GraphQL.\n */\nexport async function deletePatientOperation(\n params: DeletePatientParams,\n): Promise<void> {\n const { context, id, tableName } = params;\n const { tenantId, workspaceId } = context;\n const service = getDynamoDataService(tableName);\n await deleteDataEntityById(\n service.entities.patient as Parameters<typeof deleteDataEntityById>[0],\n tenantId,\n workspaceId,\n id,\n );\n}\n","import type { Request, Response } from \"express\";\nimport { deletePatientOperation } from \"../../../../operations/data/patient/patient-delete-operation\";\nimport { sendOperationOutcome500 } from \"../../common\";\n\n/** DELETE /Patient/:id — delete: removes from data store, returns 204. */\nexport async function deletePatientRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n\n try {\n await deletePatientOperation({ context: ctx, id });\n return res.status(204).send();\n } catch (err: unknown) {\n return sendOperationOutcome500(res, err, \"DELETE Patient error:\");\n }\n}\n","import type { Patient } from \"@openhi/types\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type GetByIdParams,\n getDataEntityById,\n type SingleResourceResult,\n} from \"../../data-operations-common\";\n\n/**\n * Get a single Patient by id. Throws NotFoundError if not found.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport type GetPatientByIdParams = GetByIdParams;\n\nexport type GetPatientByIdResult = SingleResourceResult<Patient>;\n\n/**\n * Returns the current version of a Patient. Throws NotFoundError when the patient does not exist.\n */\nexport async function getPatientByIdOperation(\n params: GetPatientByIdParams,\n): Promise<GetPatientByIdResult> {\n const { context, id, tableName } = params;\n const { tenantId, workspaceId } = context;\n const service = getDynamoDataService(tableName);\n return getDataEntityById<Patient>(\n service.entities.patient as Parameters<typeof getDataEntityById>[0],\n tenantId,\n workspaceId,\n id,\n \"Patient\",\n );\n}\n","import type { Request, Response } from \"express\";\nimport { NotFoundError, domainErrorToHttpStatus } from \"../../../../errors\";\nimport { getPatientByIdOperation } from \"../../../../operations/data/patient/patient-get-by-id-operation\";\nimport { sendOperationOutcome404, sendOperationOutcome500 } from \"../../common\";\n\n/** GET /Patient/:id — read: returns a single Patient resource from the data store or 404. */\nexport async function getPatientByIdRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n\n try {\n const result = await getPatientByIdOperation({ context: ctx, id });\n return res.json(result.resource);\n } catch (err: unknown) {\n const status = domainErrorToHttpStatus(err);\n if (status === 404) {\n const diagnostics =\n err instanceof NotFoundError ? err.message : `Patient ${id} not found`;\n return sendOperationOutcome404(res, diagnostics);\n }\n return sendOperationOutcome500(res, err, \"GET Patient error:\");\n }\n}\n","import type { Patient } from \"@openhi/types\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type ListParams,\n listDataEntitiesByWorkspace,\n type ListResult,\n type ListEntry,\n} from \"../../data-operations-common\";\n\n/**\n * List patients in a workspace (GSI4). Returns domain result for adapters to map to FHIR Bundle or other formats.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport type ListPatientsParams = ListParams;\n\nexport type PatientListEntry = ListEntry<Patient>;\n\nexport type ListPatientsResult = ListResult<Patient>;\n\n/**\n * Lists all Patients in the workspace. Uses GSI4 (Resource Type Index).\n * Throws on service errors; adapters map to HTTP/GraphQL/Step Function.\n */\nexport async function listPatientsOperation(\n params: ListPatientsParams,\n): Promise<ListPatientsResult> {\n const { context, tableName } = params;\n const { tenantId, workspaceId } = context;\n const service = getDynamoDataService(tableName);\n return listDataEntitiesByWorkspace<Patient>(\n service.entities.patient as Parameters<\n typeof listDataEntitiesByWorkspace\n >[0],\n tenantId,\n workspaceId,\n );\n}\n","import type { Request, Response } from \"express\";\nimport { listPatientsOperation } from \"../../../../operations/data/patient/patient-list-operation\";\nimport {\n BASE_PATH,\n buildSearchsetBundle,\n sendOperationOutcome500,\n} from \"../../common\";\n\n/**\n * GET /Patient — search/list: returns a FHIR Bundle (searchset) from the data store.\n * Uses GSI4 (Resource Type Index) to list all Patients in the workspace without a table scan.\n */\nexport async function listPatientsRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const ctx = req.openhiContext!;\n\n try {\n const result = await listPatientsOperation({ context: ctx });\n const bundle = buildSearchsetBundle(BASE_PATH.PATIENT, result.entries);\n return res.json(bundle);\n } catch (err: unknown) {\n return sendOperationOutcome500(res, err, \"GET /Patient list error:\");\n }\n}\n","import type { Meta, Patient } from \"@openhi/types\";\nimport {\n mergeAuditIntoMeta,\n type MetaWithExtensions,\n} from \"../../../audit-meta\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport type { OpenHiContext } from \"../../../openhi-context\";\nimport {\n type BaseDataEntityParams,\n updateDataEntityById,\n type SingleResourceResult,\n} from \"../../data-operations-common\";\n\n/**\n * Update a Patient by id. Throws NotFoundError if the patient does not exist.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport interface UpdatePatientParams extends BaseDataEntityParams {\n id: string;\n /** FHIR Patient body (resourceType, id, meta optional). */\n body: Patient;\n}\n\nexport type UpdatePatientResult = SingleResourceResult<Patient>;\n\n/**\n * Updates the current version of a Patient. Merges audit from context into meta.\n * Throws NotFoundError when the patient does not exist.\n */\nexport async function updatePatientOperation(\n params: UpdatePatientParams,\n): Promise<UpdatePatientResult> {\n const { context, id, body, tableName } = params;\n const { tenantId, workspaceId, date, actorId, actorName } = context;\n const service = getDynamoDataService(tableName);\n\n return updateDataEntityById<Patient>(\n service.entities.patient as Parameters<typeof updateDataEntityById>[0],\n tenantId,\n workspaceId,\n id,\n \"Patient\",\n context,\n (existingResourceStr) => {\n const bodyWithResource = body as Patient & { id?: string; meta?: Meta };\n const existingMeta: MetaWithExtensions | undefined = (\n JSON.parse(existingResourceStr) as { meta?: MetaWithExtensions }\n ).meta;\n\n const patient: Patient & { id: string; meta?: Meta } = {\n ...body,\n resourceType: \"Patient\",\n id,\n meta: {\n ...(bodyWithResource.meta ?? {}),\n lastUpdated: date,\n versionId: \"2\",\n },\n };\n\n const patientWithMeta: Patient & {\n id: string;\n meta: MetaWithExtensions;\n } = {\n ...patient,\n meta: mergeAuditIntoMeta(patient.meta ?? existingMeta, {\n modifiedDate: date,\n modifiedById: actorId,\n modifiedByName: actorName,\n }),\n };\n\n return {\n resource: patientWithMeta,\n lastUpdated: date,\n };\n },\n );\n}\n","import type { Patient } from \"@openhi/types\";\nimport type { Request, Response } from \"express\";\nimport { NotFoundError, domainErrorToHttpStatus } from \"../../../../errors\";\nimport { updatePatientOperation } from \"../../../../operations/data/patient/patient-update-operation\";\nimport {\n requireJsonBody,\n sendOperationOutcome404,\n sendOperationOutcome500,\n} from \"../../common\";\n\n/** PUT /Patient/:id — update: accepts Patient in body, persists via data store, returns 200. */\nexport async function updatePatientRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const bodyResult = requireJsonBody(req, res);\n if (\"errorResponse\" in bodyResult) return bodyResult.errorResponse;\n\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n const body = bodyResult.body as Patient;\n const patient: Patient = {\n ...body,\n resourceType: \"Patient\",\n id,\n } as Patient;\n\n try {\n const result = await updatePatientOperation({\n context: ctx,\n id,\n body: patient,\n });\n return res.json(result.resource);\n } catch (err: unknown) {\n const status = domainErrorToHttpStatus(err);\n if (status === 404) {\n const diagnostics =\n err instanceof NotFoundError ? err.message : `Patient ${id} not found`;\n return sendOperationOutcome404(res, diagnostics);\n }\n return sendOperationOutcome500(res, err, \"PUT Patient error:\");\n }\n}\n","import express from \"express\";\nimport { createPractitionerRoute } from \"./practitioner-create-route\";\nimport { deletePractitionerRoute } from \"./practitioner-delete-route\";\nimport { getPractitionerByIdRoute } from \"./practitioner-get-by-id-route\";\nimport { listPractitionersRoute } from \"./practitioner-list-route\";\nimport { updatePractitionerRoute } from \"./practitioner-update-route\";\n\n/**\n * Practitioner REST router: /Practitioner\n * FHIR R4 Practitioner resource; same pattern as Patient and Encounter routes.\n */\nconst router: express.Router = express.Router();\n\nrouter.get(\"/\", listPractitionersRoute);\nrouter.get(\"/:id\", getPractitionerByIdRoute);\nrouter.post(\"/\", createPractitionerRoute);\nrouter.put(\"/:id\", updatePractitionerRoute);\nrouter.delete(\"/:id\", deletePractitionerRoute);\n\nexport { router as practitionerRouter };\n","import type { Meta, Practitioner } from \"@openhi/types\";\nimport { ulid } from \"ulid\";\nimport {\n mergeAuditIntoMeta,\n type MetaWithExtensions,\n} from \"../../../audit-meta\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport type { OpenHiContext } from \"../../../openhi-context\";\nimport {\n createDataEntityRecord,\n type SingleResourceResult,\n} from \"../../data-operations-common\";\n\n/**\n * Create a Practitioner. Accepts FHIR-like body and OpenHI context; returns created resource.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entities/practitioner.md\n */\nexport interface CreatePractitionerParams {\n context: OpenHiContext;\n /** FHIR Practitioner body (resourceType, id optional, meta optional). */\n body: Practitioner;\n /** Optional logical id; defaults to body.id or generated. */\n id?: string;\n /** Optional table name override; resolved by data service from DYNAMO_TABLE_NAME when omitted. */\n tableName?: string;\n}\n\nexport type CreatePractitionerResult = SingleResourceResult<Practitioner>;\n\n/**\n * Creates a Practitioner. Builds put attrs with audit in meta, then ElectroDB put.\n * Throws on service/validation errors; adapters map to HTTP/GraphQL.\n */\nexport async function createPractitionerOperation(\n params: CreatePractitionerParams,\n): Promise<CreatePractitionerResult> {\n const { context, body, id: optionalId, tableName } = params;\n const { tenantId, workspaceId, date, actorId, actorName } = context;\n const id = body.id ?? optionalId ?? ulid();\n\n const meta: Meta = {\n ...(body.meta ?? {}),\n lastUpdated: date,\n versionId: \"1\",\n };\n\n const practitionerWithAudit: Practitioner & {\n id: string;\n meta: MetaWithExtensions;\n } = {\n ...body,\n resourceType: \"Practitioner\",\n id,\n meta: mergeAuditIntoMeta(meta, {\n createdDate: date,\n createdById: actorId,\n createdByName: actorName,\n modifiedDate: date,\n modifiedById: actorId,\n modifiedByName: actorName,\n }),\n };\n\n const service = getDynamoDataService(tableName);\n return createDataEntityRecord<Practitioner>(\n service.entities.practitioner as Parameters<\n typeof createDataEntityRecord\n >[0],\n tenantId,\n workspaceId,\n id,\n practitionerWithAudit,\n date,\n );\n}\n","import type { Practitioner } from \"@openhi/types\";\nimport type { Request, Response } from \"express\";\nimport { createPractitionerOperation } from \"../../../../operations/data/practitioner/practitioner-create-operation\";\nimport { BASE_PATH, requireJsonBody } from \"../../common\";\n\n/** POST /Practitioner — create: accepts Practitioner in body, persists via data layer, returns 201. */\nexport async function createPractitionerRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const bodyResult = requireJsonBody(req, res);\n if (\"errorResponse\" in bodyResult) return bodyResult.errorResponse;\n\n const ctx = req.openhiContext!;\n const body = bodyResult.body as Practitioner;\n const practitioner: Practitioner = {\n ...body,\n resourceType: \"Practitioner\",\n } as Practitioner;\n\n try {\n const result = await createPractitionerOperation({\n context: ctx,\n body: practitioner,\n });\n return res\n .status(201)\n .location(`${BASE_PATH.PRACTITIONER}/${result.id}`)\n .json(result.resource);\n } catch (err: unknown) {\n console.error(\"POST Practitioner error:\", err);\n return res.status(500).json({\n resourceType: \"OperationOutcome\",\n issue: [\n { severity: \"error\", code: \"exception\", diagnostics: String(err) },\n ],\n });\n }\n}\n","import { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type BaseDataEntityParams,\n deleteDataEntityById,\n} from \"../../data-operations-common\";\n\n/**\n * Delete a Practitioner by id. No-op if the item does not exist (ElectroDB delete is idempotent).\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport interface DeletePractitionerParams extends BaseDataEntityParams {\n id: string;\n}\n\n/**\n * Deletes the current version of a Practitioner. Does not throw when the practitioner does not exist.\n * Throws on service errors; adapters map to HTTP/GraphQL.\n */\nexport async function deletePractitionerOperation(\n params: DeletePractitionerParams,\n): Promise<void> {\n const { context, id, tableName } = params;\n const { tenantId, workspaceId } = context;\n const service = getDynamoDataService(tableName);\n await deleteDataEntityById(\n service.entities.practitioner as Parameters<typeof deleteDataEntityById>[0],\n tenantId,\n workspaceId,\n id,\n );\n}\n","import type { Request, Response } from \"express\";\nimport { deletePractitionerOperation } from \"../../../../operations/data/practitioner/practitioner-delete-operation\";\nimport { sendOperationOutcome500 } from \"../../common\";\n\n/** DELETE /Practitioner/:id — delete: removes from data store, returns 204. */\nexport async function deletePractitionerRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n\n try {\n await deletePractitionerOperation({ context: ctx, id });\n return res.status(204).send();\n } catch (err: unknown) {\n return sendOperationOutcome500(res, err, \"DELETE Practitioner error:\");\n }\n}\n","import type { Practitioner } from \"@openhi/types\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type GetByIdParams,\n getDataEntityById,\n type SingleResourceResult,\n} from \"../../data-operations-common\";\n\n/**\n * Get a single Practitioner by id. Throws NotFoundError if not found.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport type GetPractitionerByIdParams = GetByIdParams;\n\nexport type GetPractitionerByIdResult = SingleResourceResult<Practitioner>;\n\n/**\n * Returns the current version of a Practitioner. Throws NotFoundError when the practitioner does not exist.\n */\nexport async function getPractitionerByIdOperation(\n params: GetPractitionerByIdParams,\n): Promise<GetPractitionerByIdResult> {\n const { context, id, tableName } = params;\n const { tenantId, workspaceId } = context;\n const service = getDynamoDataService(tableName);\n return getDataEntityById<Practitioner>(\n service.entities.practitioner as Parameters<typeof getDataEntityById>[0],\n tenantId,\n workspaceId,\n id,\n \"Practitioner\",\n );\n}\n","import type { Request, Response } from \"express\";\nimport { NotFoundError, domainErrorToHttpStatus } from \"../../../../errors\";\nimport { getPractitionerByIdOperation } from \"../../../../operations/data/practitioner/practitioner-get-by-id-operation\";\nimport { sendOperationOutcome404, sendOperationOutcome500 } from \"../../common\";\n\n/** GET /Practitioner/:id — read: returns a single Practitioner resource from the data store or 404. */\nexport async function getPractitionerByIdRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n\n try {\n const result = await getPractitionerByIdOperation({ context: ctx, id });\n return res.json(result.resource);\n } catch (err: unknown) {\n const status = domainErrorToHttpStatus(err);\n if (status === 404) {\n const diagnostics =\n err instanceof NotFoundError\n ? err.message\n : `Practitioner ${id} not found`;\n return sendOperationOutcome404(res, diagnostics);\n }\n return sendOperationOutcome500(res, err, \"GET Practitioner error:\");\n }\n}\n","import type { Practitioner } from \"@openhi/types\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type ListParams,\n listDataEntitiesByWorkspace,\n type ListResult,\n type ListEntry,\n} from \"../../data-operations-common\";\n\n/**\n * List practitioners in a workspace (GSI4). Returns domain result for adapters to map to FHIR Bundle or other formats.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport type ListPractitionersParams = ListParams;\n\nexport type PractitionerListEntry = ListEntry<Practitioner>;\n\nexport type ListPractitionersResult = ListResult<Practitioner>;\n\n/**\n * Lists all Practitioners in the workspace. Uses GSI4 (Resource Type Index).\n * Throws on service errors; adapters map to HTTP/GraphQL/Step Function.\n */\nexport async function listPractitionersOperation(\n params: ListPractitionersParams,\n): Promise<ListPractitionersResult> {\n const { context, tableName } = params;\n const { tenantId, workspaceId } = context;\n const service = getDynamoDataService(tableName);\n return listDataEntitiesByWorkspace<Practitioner>(\n service.entities.practitioner as Parameters<\n typeof listDataEntitiesByWorkspace\n >[0],\n tenantId,\n workspaceId,\n );\n}\n","import type { Request, Response } from \"express\";\nimport { listPractitionersOperation } from \"../../../../operations/data/practitioner/practitioner-list-operation\";\nimport {\n BASE_PATH,\n buildSearchsetBundle,\n sendOperationOutcome500,\n} from \"../../common\";\n\n/**\n * GET /Practitioner — search/list: returns a FHIR Bundle (searchset) from the data store.\n * Uses GSI4 (Resource Type Index) to list all Practitioners in the workspace without a table scan.\n */\nexport async function listPractitionersRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const ctx = req.openhiContext!;\n\n try {\n const result = await listPractitionersOperation({ context: ctx });\n const bundle = buildSearchsetBundle(BASE_PATH.PRACTITIONER, result.entries);\n return res.json(bundle);\n } catch (err: unknown) {\n return sendOperationOutcome500(res, err, \"GET /Practitioner list error:\");\n }\n}\n","import type { Meta, Practitioner } from \"@openhi/types\";\nimport {\n mergeAuditIntoMeta,\n type MetaWithExtensions,\n} from \"../../../audit-meta\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type BaseDataEntityParams,\n updateDataEntityById,\n type SingleResourceResult,\n} from \"../../data-operations-common\";\n\n/**\n * Update a Practitioner by id. Throws NotFoundError if the practitioner does not exist.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport interface UpdatePractitionerParams extends BaseDataEntityParams {\n id: string;\n /** FHIR Practitioner body (resourceType, id, meta optional). */\n body: Practitioner;\n}\n\nexport type UpdatePractitionerResult = SingleResourceResult<Practitioner>;\n\n/**\n * Updates the current version of a Practitioner. Merges audit from context into meta.\n * Throws NotFoundError when the practitioner does not exist.\n */\nexport async function updatePractitionerOperation(\n params: UpdatePractitionerParams,\n): Promise<UpdatePractitionerResult> {\n const { context, id, body, tableName } = params;\n const { tenantId, workspaceId, date, actorId, actorName } = context;\n const service = getDynamoDataService(tableName);\n\n return updateDataEntityById<Practitioner>(\n service.entities.practitioner as Parameters<typeof updateDataEntityById>[0],\n tenantId,\n workspaceId,\n id,\n \"Practitioner\",\n context,\n (existingResourceStr) => {\n const bodyWithResource = body as Practitioner & {\n id?: string;\n meta?: Meta;\n };\n const existingMeta: MetaWithExtensions | undefined = (\n JSON.parse(existingResourceStr) as { meta?: MetaWithExtensions }\n ).meta;\n\n const practitioner: Practitioner & { id: string; meta?: Meta } = {\n ...body,\n resourceType: \"Practitioner\",\n id,\n meta: {\n ...(bodyWithResource.meta ?? {}),\n lastUpdated: date,\n versionId: \"2\",\n },\n };\n\n const practitionerWithMeta: Practitioner & {\n id: string;\n meta: MetaWithExtensions;\n } = {\n ...practitioner,\n meta: mergeAuditIntoMeta(practitioner.meta ?? existingMeta, {\n modifiedDate: date,\n modifiedById: actorId,\n modifiedByName: actorName,\n }),\n };\n\n return {\n resource: practitionerWithMeta,\n lastUpdated: date,\n };\n },\n );\n}\n","import type { Practitioner } from \"@openhi/types\";\nimport type { Request, Response } from \"express\";\nimport { NotFoundError, domainErrorToHttpStatus } from \"../../../../errors\";\nimport { updatePractitionerOperation } from \"../../../../operations/data/practitioner/practitioner-update-operation\";\nimport {\n requireJsonBody,\n sendOperationOutcome404,\n sendOperationOutcome500,\n} from \"../../common\";\n\n/** PUT /Practitioner/:id — update: accepts Practitioner in body, persists via data layer, returns 200. */\nexport async function updatePractitionerRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const bodyResult = requireJsonBody(req, res);\n if (\"errorResponse\" in bodyResult) return bodyResult.errorResponse;\n\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n const body = bodyResult.body;\n const practitioner: Practitioner = {\n ...body,\n resourceType: \"Practitioner\",\n id,\n meta: {\n ...((body?.meta as object) ?? {}),\n lastUpdated: ctx.date,\n versionId: \"2\",\n },\n } as Practitioner;\n\n try {\n const result = await updatePractitionerOperation({\n context: ctx,\n id,\n body: practitioner,\n });\n return res.json(result.resource);\n } catch (err: unknown) {\n const status = domainErrorToHttpStatus(err);\n if (status === 404) {\n const diagnostics =\n err instanceof NotFoundError\n ? err.message\n : `Practitioner ${id} not found`;\n return sendOperationOutcome404(res, diagnostics);\n }\n return sendOperationOutcome500(res, err, \"PUT Practitioner error:\");\n }\n}\n"],"mappings":"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","names":["import_serverless_express","import_node_path","import_express","envelope","import_electrodb","SK","SK","BASE_PATH","SK","express","import_express","import_electrodb","import_electrodb","router","express","import_express","import_ulid","SK","router","express","import_express","import_ulid","router","express","express","path","router","serverlessExpress"]}
|
|
1
|
+
{"version":3,"sources":["../src/data/lambda/rest-api-lambda.handler.ts","../src/data/rest-api/rest-api.ts","../src/data/middleware/normalize-json-body.ts","../src/data/middleware/open-hi-context.ts","../src/data/rest-api/routes/control/configuration/configuration.ts","../src/lib/compression.ts","../src/data/dynamo/dynamo-control-service.ts","../src/data/dynamo/dynamo-client.ts","../src/data/dynamo/entities/control/configuration-entity.ts","../src/data/operations/control/configuration/configuration-create-operation.ts","../src/data/rest-api/routes/common.ts","../src/data/rest-api/routes/control/configuration/configuration-create-route.ts","../src/data/operations/control/configuration/configuration-delete-operation.ts","../src/data/rest-api/routes/control/configuration/configuration-delete-route.ts","../src/data/errors/domain-errors.ts","../src/data/operations/control/configuration/configuration-get-by-id-operation.ts","../src/data/rest-api/routes/control/configuration/configuration-get-by-id-route.ts","../src/data/operations/control/configuration/configuration-list-operation.ts","../src/data/rest-api/dynamic-configuration.ts","../src/data/rest-api/routes/control/configuration/configuration-list-route.ts","../src/data/operations/control/configuration/configuration-update-operation.ts","../src/data/rest-api/routes/control/configuration/configuration-update-route.ts","../src/data/rest-api/routes/data/encounter/encounter.ts","../src/data/operations/data/encounter/encounter-create-operation.ts","../src/data/audit-meta.ts","../src/data/dynamo/dynamo-data-service.ts","../src/data/dynamo/entities/data-entity-common.ts","../src/data/dynamo/entities/data/account-entity.ts","../src/data/dynamo/entities/data/activity-definition-entity.ts","../src/data/dynamo/entities/data/adverse-event-entity.ts","../src/data/dynamo/entities/data/allergy-intolerance-entity.ts","../src/data/dynamo/entities/data/appointment-entity.ts","../src/data/dynamo/entities/data/appointment-response-entity.ts","../src/data/dynamo/entities/data/audit-event-entity.ts","../src/data/dynamo/entities/data/basic-entity.ts","../src/data/dynamo/entities/data/biologically-derived-product-entity.ts","../src/data/dynamo/entities/data/body-structure-entity.ts","../src/data/dynamo/entities/data/care-plan-entity.ts","../src/data/dynamo/entities/data/care-team-entity.ts","../src/data/dynamo/entities/data/catalog-entry-entity.ts","../src/data/dynamo/entities/data/charge-item-definition-entity.ts","../src/data/dynamo/entities/data/charge-item-entity.ts","../src/data/dynamo/entities/data/claim-entity.ts","../src/data/dynamo/entities/data/claim-response-entity.ts","../src/data/dynamo/entities/data/clinical-impression-entity.ts","../src/data/dynamo/entities/data/communication-entity.ts","../src/data/dynamo/entities/data/communication-request-entity.ts","../src/data/dynamo/entities/data/composition-entity.ts","../src/data/dynamo/entities/data/condition-entity.ts","../src/data/dynamo/entities/data/consent-entity.ts","../src/data/dynamo/entities/data/contract-entity.ts","../src/data/dynamo/entities/data/coverage-eligibility-request-entity.ts","../src/data/dynamo/entities/data/coverage-eligibility-response-entity.ts","../src/data/dynamo/entities/data/coverage-entity.ts","../src/data/dynamo/entities/data/detected-issue-entity.ts","../src/data/dynamo/entities/data/device-definition-entity.ts","../src/data/dynamo/entities/data/device-entity.ts","../src/data/dynamo/entities/data/device-metric-entity.ts","../src/data/dynamo/entities/data/device-request-entity.ts","../src/data/dynamo/entities/data/device-use-statement-entity.ts","../src/data/dynamo/entities/data/diagnostic-report-entity.ts","../src/data/dynamo/entities/data/document-manifest-entity.ts","../src/data/dynamo/entities/data/document-reference-entity.ts","../src/data/dynamo/entities/data/effect-evidence-synthesis-entity.ts","../src/data/dynamo/entities/data/encounter-entity.ts","../src/data/dynamo/entities/data/endpoint-entity.ts","../src/data/dynamo/entities/data/enrollment-request-entity.ts","../src/data/dynamo/entities/data/enrollment-response-entity.ts","../src/data/dynamo/entities/data/episode-of-care-entity.ts","../src/data/dynamo/entities/data/event-definition-entity.ts","../src/data/dynamo/entities/data/evidence-entity.ts","../src/data/dynamo/entities/data/evidence-variable-entity.ts","../src/data/dynamo/entities/data/explanation-of-benefit-entity.ts","../src/data/dynamo/entities/data/family-member-history-entity.ts","../src/data/dynamo/entities/data/flag-entity.ts","../src/data/dynamo/entities/data/goal-entity.ts","../src/data/dynamo/entities/data/group-entity.ts","../src/data/dynamo/entities/data/guidance-response-entity.ts","../src/data/dynamo/entities/data/healthcare-service-entity.ts","../src/data/dynamo/entities/data/imaging-study-entity.ts","../src/data/dynamo/entities/data/immunization-entity.ts","../src/data/dynamo/entities/data/immunization-evaluation-entity.ts","../src/data/dynamo/entities/data/immunization-recommendation-entity.ts","../src/data/dynamo/entities/data/insurance-plan-entity.ts","../src/data/dynamo/entities/data/invoice-entity.ts","../src/data/dynamo/entities/data/library-entity.ts","../src/data/dynamo/entities/data/linkage-entity.ts","../src/data/dynamo/entities/data/list-entity.ts","../src/data/dynamo/entities/data/location-entity.ts","../src/data/dynamo/entities/data/measure-entity.ts","../src/data/dynamo/entities/data/measure-report-entity.ts","../src/data/dynamo/entities/data/media-entity.ts","../src/data/dynamo/entities/data/medication-administration-entity.ts","../src/data/dynamo/entities/data/medication-dispense-entity.ts","../src/data/dynamo/entities/data/medication-entity.ts","../src/data/dynamo/entities/data/medication-knowledge-entity.ts","../src/data/dynamo/entities/data/medication-request-entity.ts","../src/data/dynamo/entities/data/medication-statement-entity.ts","../src/data/dynamo/entities/data/message-header-entity.ts","../src/data/dynamo/entities/data/molecular-sequence-entity.ts","../src/data/dynamo/entities/data/nutrition-order-entity.ts","../src/data/dynamo/entities/data/observation-entity.ts","../src/data/dynamo/entities/data/organization-affiliation-entity.ts","../src/data/dynamo/entities/data/organization-entity.ts","../src/data/dynamo/entities/data/patient-entity.ts","../src/data/dynamo/entities/data/payment-notice-entity.ts","../src/data/dynamo/entities/data/payment-reconciliation-entity.ts","../src/data/dynamo/entities/data/person-entity.ts","../src/data/dynamo/entities/data/plan-definition-entity.ts","../src/data/dynamo/entities/data/practitioner-entity.ts","../src/data/dynamo/entities/data/practitioner-role-entity.ts","../src/data/dynamo/entities/data/procedure-entity.ts","../src/data/dynamo/entities/data/provenance-entity.ts","../src/data/dynamo/entities/data/questionnaire-entity.ts","../src/data/dynamo/entities/data/questionnaire-response-entity.ts","../src/data/dynamo/entities/data/related-person-entity.ts","../src/data/dynamo/entities/data/request-group-entity.ts","../src/data/dynamo/entities/data/research-study-entity.ts","../src/data/dynamo/entities/data/research-subject-entity.ts","../src/data/dynamo/entities/data/risk-assessment-entity.ts","../src/data/dynamo/entities/data/risk-evidence-synthesis-entity.ts","../src/data/dynamo/entities/data/schedule-entity.ts","../src/data/dynamo/entities/data/service-request-entity.ts","../src/data/dynamo/entities/data/slot-entity.ts","../src/data/dynamo/entities/data/specimen-entity.ts","../src/data/dynamo/entities/data/subscription-entity.ts","../src/data/dynamo/entities/data/substance-entity.ts","../src/data/dynamo/entities/data/supply-delivery-entity.ts","../src/data/dynamo/entities/data/supply-request-entity.ts","../src/data/dynamo/entities/data/task-entity.ts","../src/data/dynamo/entities/data/verification-result-entity.ts","../src/data/dynamo/entities/data/vision-prescription-entity.ts","../src/data/operations/data-operations-common.ts","../src/data/rest-api/routes/data/encounter/encounter-create-route.ts","../src/data/operations/data/encounter/encounter-delete-operation.ts","../src/data/rest-api/routes/data/encounter/encounter-delete-route.ts","../src/data/operations/data/encounter/encounter-get-by-id-operation.ts","../src/data/rest-api/routes/data/encounter/encounter-get-by-id-route.ts","../src/data/operations/data/encounter/encounter-list-operation.ts","../src/data/rest-api/routes/data/encounter/encounter-list-route.ts","../src/data/operations/data/encounter/encounter-update-operation.ts","../src/data/rest-api/routes/data/encounter/encounter-update-route.ts","../src/data/rest-api/routes/data/patient/patient.ts","../src/data/operations/data/patient/patient-create-operation.ts","../src/data/import-patient.ts","../src/data/rest-api/routes/data/patient/patient-create-route.ts","../src/data/operations/data/patient/patient-delete-operation.ts","../src/data/rest-api/routes/data/patient/patient-delete-route.ts","../src/data/operations/data/patient/patient-get-by-id-operation.ts","../src/data/rest-api/routes/data/patient/patient-get-by-id-route.ts","../src/data/operations/data/patient/patient-list-operation.ts","../src/data/rest-api/routes/data/patient/patient-list-route.ts","../src/data/operations/data/patient/patient-update-operation.ts","../src/data/rest-api/routes/data/patient/patient-update-route.ts","../src/data/rest-api/routes/data/practitioner/practitioner.ts","../src/data/operations/data/practitioner/practitioner-create-operation.ts","../src/data/rest-api/routes/data/practitioner/practitioner-create-route.ts","../src/data/operations/data/practitioner/practitioner-delete-operation.ts","../src/data/rest-api/routes/data/practitioner/practitioner-delete-route.ts","../src/data/operations/data/practitioner/practitioner-get-by-id-operation.ts","../src/data/rest-api/routes/data/practitioner/practitioner-get-by-id-route.ts","../src/data/operations/data/practitioner/practitioner-list-operation.ts","../src/data/rest-api/routes/data/practitioner/practitioner-list-route.ts","../src/data/operations/data/practitioner/practitioner-update-operation.ts","../src/data/rest-api/routes/data/practitioner/practitioner-update-route.ts"],"sourcesContent":["import serverlessExpress from \"@codegenie/serverless-express\";\nimport { app } from \"../rest-api/rest-api\";\n\n/**\n * @see sites/www-docs/content/packages/@openhi/constructs/data/lambda/rest-api-lambda.md\n */\n\nexport const handler = serverlessExpress({ app });\n","import path from \"node:path\";\nimport express, { Express, Request, Response } from \"express\";\nimport { normalizeJsonBodyMiddleware } from \"../middleware/normalize-json-body\";\nimport { openHiContextMiddleware } from \"../middleware/open-hi-context\";\nimport { configurationRouter } from \"./routes/control/configuration/configuration\";\nimport { encounterRouter } from \"./routes/data/encounter/encounter\";\nimport { patientRouter } from \"./routes/data/patient/patient\";\nimport { practitionerRouter } from \"./routes/data/practitioner/practitioner\";\n\n/**\n * @see sites/www-docs/content/packages/@openhi/constructs/data/rest-api/rest-api.md\n */\n\nconst app: Express = express();\n\napp.set(\"view engine\", \"ejs\");\napp.set(\"views\", path.join(__dirname, \"views\"));\n\n// CORS is handled exclusively by API Gateway when the REST API is deployed with rootHttpApiProps.corsPreflight\n// (see OpenHiRestApiService). Configure CORS there; do not add Express CORS middleware here.\napp.use(express.json());\napp.use(express.urlencoded({ extended: true }));\n// Normalize body when it arrives as Buffer/string (e.g. Lambda/API Gateway); all routes then see a plain object\napp.use(normalizeJsonBodyMiddleware);\n\napp.get(\"/\", (_req: Request, res: Response) => {\n return res.status(200).json({ message: \"POC App is running\" });\n});\n\n// Tenant/workspace resolved from JWT (or headers/env when implemented); attached to req for resource routes\napp.use(\n [\"/Patient\", \"/Encounter\", \"/Practitioner\", \"/Configuration\"],\n openHiContextMiddleware,\n);\n\n// FHIR R4 Patient resource\napp.use(\"/Patient\", patientRouter);\n\n// FHIR R4 Encounter resource\napp.use(\"/Encounter\", encounterRouter);\n\n// FHIR R4 Practitioner resource\napp.use(\"/Practitioner\", practitionerRouter);\n\n// Control Plane Configuration resource\napp.use(\"/Configuration\", configurationRouter);\n\nexport { app };\n","import type { Request, Response, NextFunction } from \"express\";\n\n/**\n * Normalize req.body so it is always a plain object when it was sent as JSON.\n * Runs after express.json(); handles Lambda/API Gateway cases where the body\n * may be attached as a Buffer or string (e.g. from event.body) instead of\n * being parsed by express.json(). Prevents handlers from spreading a Buffer\n * into resources (which would produce numeric keys from byte indices).\n */\nexport function normalizeJsonBodyMiddleware(\n req: Request,\n _res: Response,\n next: NextFunction,\n): void {\n const raw = req.body;\n if (Buffer.isBuffer(raw)) {\n try {\n req.body = JSON.parse(raw.toString(\"utf-8\")) as Request[\"body\"];\n } catch {\n // Leave body as-is; handler or validation can return 400\n }\n } else if (typeof raw === \"string\") {\n try {\n req.body = JSON.parse(raw) as Request[\"body\"];\n } catch {\n // Leave body as-is\n }\n }\n next();\n}\n","import { getCurrentInvoke } from \"@codegenie/serverless-express\";\nimport type { Request, Response, NextFunction } from \"express\";\nimport type { ApiGatewayJwtClaims } from \"./express\";\n\nconst REQUIRED_CLAIMS = [\n \"openhi_tenant_id\",\n \"openhi_workspace_id\",\n \"openhi_user_id\",\n \"openhi_user_name\",\n] as const;\n\nfunction getJwtClaims(req: Request): ApiGatewayJwtClaims | undefined {\n const invoke = getCurrentInvoke();\n const event =\n invoke?.event ??\n (req as Request & { apiGateway?: { event?: unknown } }).apiGateway?.event;\n\n const claims = (\n event as\n | {\n requestContext?: {\n authorizer?: { jwt?: { claims?: ApiGatewayJwtClaims } };\n };\n }\n | undefined\n )?.requestContext?.authorizer?.jwt?.claims;\n\n return claims;\n}\n\nfunction hasRequiredClaims(claims: ApiGatewayJwtClaims): boolean {\n return REQUIRED_CLAIMS.every(\n (key) =>\n typeof claims[key] === \"string\" && (claims[key] as string).trim() !== \"\",\n );\n}\n\n/**\n * Express middleware that sets req.openhiContext for REST API routes (e.g. /Patient, /Configuration).\n * Context is populated from JWT claims (openhi_tenant_id, openhi_workspace_id, openhi_user_id, openhi_user_name)\n * added by the Cognito pre-token generation Lambda. Missing required claims result in 403 Forbidden.\n *\n * @see ADR 2026-02-13-02 (JWT claim design)\n * @see sites/www-docs/content/packages/@openhi/constructs/rest-api.md — Middleware\n */\nexport function openHiContextMiddleware(\n req: Request,\n res: Response,\n next: NextFunction,\n): void {\n const claims = getJwtClaims(req);\n if (!claims || !hasRequiredClaims(claims)) {\n res.status(403).json({\n error: \"Forbidden\",\n message:\n \"Missing or invalid OpenHI JWT claims (tenant, workspace, or audit context).\",\n });\n return;\n }\n\n const invoke = getCurrentInvoke();\n const event = (invoke?.event ??\n (req as Request & { apiGateway?: { event?: unknown } }).apiGateway\n ?.event) as { requestContext?: { requestId?: string } } | undefined;\n const requestId =\n typeof event?.requestContext?.requestId === \"string\"\n ? event.requestContext.requestId\n : undefined;\n\n req.openhiContext = {\n tenantId: claims.openhi_tenant_id as string,\n workspaceId: claims.openhi_workspace_id as string,\n date: new Date().toISOString(),\n actorId: claims.openhi_user_id as string,\n actorName: claims.openhi_user_name as string,\n actorType: \"human\",\n roleId:\n typeof claims.openhi_role_id === \"string\" && claims.openhi_role_id !== \"\"\n ? claims.openhi_role_id\n : undefined,\n requestId,\n source: \"rest\",\n clientId:\n typeof claims.openhi_client_id === \"string\" &&\n claims.openhi_client_id !== \"\"\n ? claims.openhi_client_id\n : undefined,\n };\n\n next();\n}\n","import express from \"express\";\nimport { createConfigurationRoute } from \"./configuration-create-route\";\nimport { deleteConfigurationRoute } from \"./configuration-delete-route\";\nimport { getConfigurationByIdRoute } from \"./configuration-get-by-id-route\";\nimport { listConfigurationsRoute } from \"./configuration-list-route\";\nimport { updateConfigurationRoute } from \"./configuration-update-route\";\n\n/**\n * Configuration REST router: /Configuration\n * @see sites/www-docs/content/packages/@openhi/constructs/data/rest-api/routes/configuration.md\n */\nconst router: express.Router = express.Router();\n\nrouter.get(\"/\", listConfigurationsRoute);\nrouter.get(\"/:id\", getConfigurationByIdRoute);\nrouter.post(\"/\", createConfigurationRoute);\nrouter.put(\"/:id\", updateConfigurationRoute);\nrouter.delete(\"/:id\", deleteConfigurationRoute);\n\nexport { router as configurationRouter };\n","import { gzipSync, gunzipSync } from \"node:zlib\";\n\n/**\n * @see sites/www-docs/content/packages/@openhi/constructs/lib/compression.md\n */\n\n/** Envelope format version. See ADR 2026-02-15-02 (data layer compression). */\nconst ENVELOPE_VERSION = 1;\n\n/**\n * Compression algorithm identifiers supported by the envelope (string values).\n * Only algos that Node.js supports out of the box (zlib): gzip, brotli, deflate.\n * \"none\" = uncompressed payload. zstd was considered in the ADR but requires native addon/WASM.\n */\nexport const COMPRESSION_ALGOS = {\n NONE: \"none\",\n GZIP: \"gzip\",\n BROTLI: \"brotli\",\n DEFLATE: \"deflate\",\n} as const;\n\n/** Algorithm value for envelope `algo`; only gzip and none are implemented today. */\nexport type CompressionAlgo =\n (typeof COMPRESSION_ALGOS)[keyof typeof COMPRESSION_ALGOS];\n\n/** Stored value is a JSON string of this envelope. */\ninterface CompressionEnvelope {\n v: number;\n algo: string;\n payload: string;\n}\n\nfunction isEnvelope(obj: unknown): obj is CompressionEnvelope {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"v\" in obj &&\n \"algo\" in obj &&\n \"payload\" in obj &&\n typeof (obj as CompressionEnvelope).payload === \"string\"\n );\n}\n\n/**\n * Compresses a JSON string (e.g. serialized FHIR resource) for storage in DynamoDB.\n * Uses a versioned envelope: { v, algo, payload } with gzip+base64 in payload.\n * Used by the data layer on write; see REST API docs (compression in data layer).\n * Optional compression: pass `{ algo: COMPRESSION_ALGOS.NONE }` to store in envelope without compressing.\n */\nexport function compressResource(\n jsonString: string,\n options?: { algo?: CompressionAlgo },\n): string {\n const algo = options?.algo ?? COMPRESSION_ALGOS.GZIP;\n if (algo === COMPRESSION_ALGOS.NONE) {\n const envelope: CompressionEnvelope = {\n v: ENVELOPE_VERSION,\n algo: COMPRESSION_ALGOS.NONE,\n payload: jsonString,\n };\n return JSON.stringify(envelope);\n }\n const buf = Buffer.from(jsonString, \"utf-8\");\n const payload = gzipSync(buf).toString(\"base64\");\n const envelope: CompressionEnvelope = {\n v: ENVELOPE_VERSION,\n algo: COMPRESSION_ALGOS.GZIP,\n payload,\n };\n return JSON.stringify(envelope);\n}\n\n/**\n * Decompresses a stored value: versioned envelope (v, algo, payload) or legacy gzip+base64 / raw.\n * If the value is not valid envelope JSON, falls back to legacy: try gzip magic on base64, else return as-is.\n */\nexport function decompressResource(compressedOrRaw: string): string {\n try {\n const parsed = JSON.parse(compressedOrRaw) as unknown;\n if (isEnvelope(parsed)) {\n if (parsed.algo === COMPRESSION_ALGOS.GZIP) {\n const buf = Buffer.from(parsed.payload, \"base64\");\n return gunzipSync(buf).toString(\"utf-8\");\n }\n if (parsed.algo === COMPRESSION_ALGOS.NONE) {\n return parsed.payload;\n }\n // Unknown algo: return payload as-is (safe fallback per ADR)\n return parsed.payload;\n }\n } catch {\n // Not valid envelope JSON — legacy path\n }\n\n // Legacy: pre-envelope gzip+base64 or raw\n try {\n const buf = Buffer.from(compressedOrRaw, \"base64\");\n if (buf.length >= 2 && buf[0] === 0x1f && buf[1] === 0x8b) {\n return gunzipSync(buf).toString(\"utf-8\");\n }\n } catch {\n // not base64 or gunzip failed\n }\n return compressedOrRaw;\n}\n","import { Service } from \"electrodb\";\nimport { defaultTableName, dynamoClient } from \"./dynamo-client\";\nimport { ConfigurationEntity } from \"./entities/control/configuration-entity\";\n\n/**\n * Control-plane entities only (service \"control\"). Same table as data plane; use\n * DynamoDataService for data-plane entities.\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n */\n\nconst controlPlaneEntities = {\n configuration: ConfigurationEntity,\n};\n\nconst controlPlaneService = new Service(controlPlaneEntities, {\n table: defaultTableName,\n client: dynamoClient,\n});\n\n/**\n * Control-plane service: entities for configuration and control. Use with the\n * data store table (PK, SK, GSI4).\n */\nexport const DynamoControlService = {\n entities: controlPlaneService.entities,\n};\n\nexport type DynamoControlServiceType = typeof DynamoControlService;\n\n/**\n * Returns the control-plane service. Table name is resolved from tableName (optional override),\n * then DYNAMO_TABLE_NAME, then \"jesttesttable\".\n */\nexport function getDynamoControlService(\n tableName?: string,\n): DynamoControlServiceType {\n const resolved = tableName ?? defaultTableName;\n const service = new Service(controlPlaneEntities, {\n table: resolved,\n client: dynamoClient,\n });\n return {\n entities: service.entities,\n };\n}\n","import { DynamoDBClient } from \"@aws-sdk/client-dynamodb\";\n\n/**\n * DynamoDB table name for the data store. Set via DYNAMO_TABLE_NAME at runtime\n * (e.g. from Lambda env); defaults for local/test.\n */\nexport const defaultTableName =\n process.env.DYNAMO_TABLE_NAME ?? \"jesttesttable\";\n\n/**\n * DynamoDB client. When MOCK_DYNAMODB_ENDPOINT is set (e.g. local DynamoDB or\n * jest-dynalite), uses that endpoint with no SSL and region \"local\".\n */\nexport const dynamoClient = new DynamoDBClient({\n ...(process.env.MOCK_DYNAMODB_ENDPOINT && {\n endpoint: process.env.MOCK_DYNAMODB_ENDPOINT,\n sslEnabled: false,\n region: \"local\",\n }),\n});\n","import { Entity } from \"electrodb\";\n\n/**\n * Configuration data-store entity (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Partially tenant-isolated, control plane. Cascade of scope\n * levels: resolution order user → workspace → tenant → baseline. Sentinels: tenantId \"BASELINE\" for\n * baseline tier; workspaceId/userId/roleId \"-\" for absent dimension.\n *\n * Key structure: PK = CONFIG#TID#<tenantId>#WID#<workspaceId>#UID#<userId>#RID#<roleId>,\n * SK = KEY#<key>#SK#<sk>. Uniqueness: one Configuration per (tenantId, workspaceId, userId, roleId, key).\n * Standard attributes and key-building conventions align with single-table design.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entities/configuration.md\n * @see sites/www-docs/content/architecture/control-plane/configuration.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Key-building conventions (keys built inside entity)\n */\nexport const ConfigurationEntity = new Entity({\n model: {\n entity: \"configuration\",\n service: \"control\",\n version: \"01\",\n },\n attributes: {\n /** Sort key. \"CURRENT\" for current version; version history in S3. */\n sk: {\n type: \"string\" as const,\n required: true,\n default: \"CURRENT\",\n },\n /** Tenant scope. Use \"BASELINE\" when the config is baseline default (no tenant). */\n tenantId: {\n type: \"string\" as const,\n required: true,\n default: \"BASELINE\",\n },\n /** Workspace scope. Use \"-\" when absent. */\n workspaceId: {\n type: \"string\" as const,\n required: true,\n default: \"-\",\n },\n /** User scope. Use \"-\" when absent. */\n userId: {\n type: \"string\" as const,\n required: true,\n default: \"-\",\n },\n /** Role scope. Use \"-\" when absent. */\n roleId: {\n type: \"string\" as const,\n required: true,\n default: \"-\",\n },\n /** Config type (category), e.g. endpoints, branding, display. */\n key: {\n type: \"string\" as const,\n required: true,\n },\n /** FHIR Resource.id; logical id in URL and for the Configuration resource. */\n id: {\n type: \"string\" as const,\n required: true,\n },\n /** Payload as JSON string. JSON.stringify(resource) on write; JSON.parse(item.resource) on read. */\n resource: {\n type: \"string\" as const,\n required: true,\n },\n /** Version id (e.g. ULID). Tracks current version; S3 history key. */\n vid: {\n type: \"string\" as const,\n required: true,\n },\n lastUpdated: {\n type: \"string\" as const,\n required: true,\n },\n deleted: {\n type: \"boolean\" as const,\n required: false,\n },\n bundleId: {\n type: \"string\" as const,\n required: false,\n },\n msgId: {\n type: \"string\" as const,\n required: false,\n },\n },\n indexes: {\n /** Base table: PK, SK (data store key names). PK is built from tenantId, workspaceId, userId, roleId; SK is built from key and sk. Do not supply PK or SK from outside. */\n record: {\n pk: {\n field: \"PK\",\n composite: [\"tenantId\", \"workspaceId\", \"userId\", \"roleId\"],\n template:\n \"CONFIG#TID#${tenantId}#WID#${workspaceId}#UID#${userId}#RID#${roleId}\",\n },\n sk: {\n field: \"SK\",\n composite: [\"key\", \"sk\"],\n template: \"KEY#${key}#SK#${sk}\",\n },\n },\n\n /** GSI4 — Resource Type Index: list all Configuration in a tenant or workspace (no scan). Use for \"list configs scoped to this tenant\" (workspaceId = \"-\") or \"list configs scoped to this workspace\". Does not support hierarchical resolution in one query; use base table GetItem in fallback order (user → workspace → tenant → baseline) for that. */\n gsi4: {\n index: \"GSI4\",\n condition: () => true,\n pk: {\n field: \"GSI4PK\",\n composite: [\"tenantId\", \"workspaceId\"],\n template: \"TID#${tenantId}#WID#${workspaceId}#RT#Configuration\",\n },\n sk: {\n field: \"GSI4SK\",\n composite: [\"key\", \"sk\"],\n template: \"KEY#${key}#SK#${sk}\",\n },\n },\n },\n});\n","import { compressResource } from \"../../../../lib/compression\";\nimport { getDynamoControlService } from \"../../../dynamo/dynamo-control-service\";\nimport type { OpenHiContext } from \"../../../openhi-context\";\n\nconst SK = \"CURRENT\";\n\n/**\n * Create a Configuration. Accepts key and optional resource/scope; returns created resource.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entities/configuration.md\n */\nexport interface CreateConfigurationParams {\n context: OpenHiContext;\n /** At minimum key; optional id, resource, scope overrides, vid, lastUpdated. */\n body: {\n key: string;\n id?: string;\n resource?: Record<string, unknown> | string;\n tenantId?: string;\n workspaceId?: string;\n userId?: string;\n roleId?: string;\n vid?: string;\n lastUpdated?: string;\n };\n /** Optional table name override; resolved by data service from DYNAMO_TABLE_NAME when omitted. */\n tableName?: string;\n}\n\nexport interface CreateConfigurationResult {\n id: string;\n key: string;\n resource: Record<string, unknown>;\n meta: { lastUpdated: string; versionId: string };\n}\n\n/**\n * Creates a Configuration. Uses context for scope when not overridden in body.\n * Throws on service/validation errors; adapters map to HTTP/GraphQL.\n */\nexport async function createConfigurationOperation(\n params: CreateConfigurationParams,\n): Promise<CreateConfigurationResult> {\n const { context, body, tableName } = params;\n const {\n tenantId: ctxTenantId,\n workspaceId: ctxWorkspaceId,\n actorId: ctxActorId,\n date,\n } = context;\n const key = body.key;\n const id = body.id ?? `config-${key}-${Date.now()}`;\n const resourcePayload = body.resource;\n const resourceStr =\n typeof resourcePayload === \"string\"\n ? resourcePayload\n : JSON.stringify(resourcePayload ?? {});\n const tenantId = body.tenantId ?? ctxTenantId;\n const workspaceId = body.workspaceId ?? ctxWorkspaceId;\n const userId = body.userId ?? ctxActorId ?? \"-\";\n const roleId = body.roleId ?? context.roleId ?? \"-\";\n const lastUpdated = body.lastUpdated ?? date;\n const vid =\n body.vid ??\n (date.replace(/[-:T.Z]/g, \"\").slice(0, 12) || Date.now().toString(36));\n\n const service = getDynamoControlService(tableName);\n await service.entities.configuration\n .put({\n tenantId,\n workspaceId,\n userId,\n roleId,\n key,\n id,\n resource: compressResource(resourceStr),\n vid,\n lastUpdated,\n sk: SK,\n })\n .go();\n\n const resource =\n typeof resourcePayload === \"object\"\n ? (resourcePayload as Record<string, unknown>)\n : (JSON.parse(resourceStr) as Record<string, unknown>);\n\n return {\n id,\n key,\n resource: {\n resourceType: \"Configuration\",\n id,\n key,\n resource,\n },\n meta: { lastUpdated, versionId: vid },\n };\n}\n","import type { Request, Response } from \"express\";\n\n/** Base paths for REST API resources (FHIR and control). */\nexport const BASE_PATH = {\n CONFIGURATION: \"/Configuration\",\n ENCOUNTER: \"/Encounter\",\n PATIENT: \"/Patient\",\n PRACTITIONER: \"/Practitioner\",\n} as const;\n\n/**\n * Require req.body to be a plain object (set by express.json() + normalizeJsonBodyMiddleware).\n * Returns the body for use, or sends 400 and returns the response so the handler can return.\n */\nexport function requireJsonBody(\n req: Request,\n res: Response,\n): { body: Record<string, unknown> } | { errorResponse: Response } {\n const raw = req.body;\n if (raw == null || typeof raw !== \"object\" || Array.isArray(raw)) {\n return {\n errorResponse: res.status(400).json({\n resourceType: \"OperationOutcome\",\n issue: [\n {\n severity: \"error\",\n code: \"invalid\",\n diagnostics: \"Request body must be a JSON object.\",\n },\n ],\n }),\n };\n }\n return { body: raw as Record<string, unknown> };\n}\n\n/**\n * Like requireJsonBody but returns body typed as T. Use when the route expects a specific JSON shape (e.g. FHIR resource).\n * Validation of the shape is the route's responsibility; this only guarantees a plain object.\n */\nexport function requireJsonBodyAs<T>(\n req: Request,\n res: Response,\n): { body: T } | { errorResponse: Response } {\n const result = requireJsonBody(req, res);\n if (\"errorResponse\" in result) return result;\n return { body: result.body as T };\n}\n\n/** Entry shape for list operation results (id + resource). */\nexport interface ListEntryForBundle {\n id: string;\n resource: unknown;\n}\n\n/**\n * Build a FHIR Bundle (searchset) from a base path and list entries.\n * Used by GET list routes for Patient, Encounter, Practitioner.\n */\nexport function buildSearchsetBundle(\n basePath: string,\n entries: Array<ListEntryForBundle>,\n): {\n resourceType: \"Bundle\";\n type: \"searchset\";\n total: number;\n link: Array<{ relation: string; url: string }>;\n entry: Array<{ fullUrl: string; resource: unknown }>;\n} {\n return {\n resourceType: \"Bundle\",\n type: \"searchset\",\n total: entries.length,\n link: [{ relation: \"self\", url: basePath }],\n entry: entries.map((item) => ({\n fullUrl: `${basePath}/${item.id}`,\n resource: item.resource,\n })),\n };\n}\n\n/**\n * Send a 404 OperationOutcome. Used by get-by-id and update routes when the resource is not found.\n */\nexport function sendOperationOutcome404(\n res: Response,\n diagnostics: string,\n): Response {\n return res.status(404).json({\n resourceType: \"OperationOutcome\",\n issue: [{ severity: \"error\", code: \"not-found\", diagnostics }],\n });\n}\n\n/**\n * Send a 500 OperationOutcome and optionally log. Used by all data routes on exception.\n */\nexport function sendOperationOutcome500(\n res: Response,\n err: unknown,\n logContext?: string,\n): Response {\n if (logContext) {\n console.error(logContext, err);\n }\n return res.status(500).json({\n resourceType: \"OperationOutcome\",\n issue: [{ severity: \"error\", code: \"exception\", diagnostics: String(err) }],\n });\n}\n","import type { Request, Response } from \"express\";\nimport { createConfigurationOperation } from \"../../../../operations/control/configuration/configuration-create-operation\";\nimport { BASE_PATH, requireJsonBody } from \"../../common\";\n\n/**\n * POST /Configuration — create: accepts Configuration in body, persists via data store, returns 201.\n * Scope from body (tenantId, workspaceId, userId, roleId) or req.openhiContext; use BASELINE/- for baseline.\n */\nexport async function createConfigurationRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const bodyResult = requireJsonBody(req, res);\n if (\"errorResponse\" in bodyResult) return bodyResult.errorResponse;\n\n const ctx = req.openhiContext!;\n const body = bodyResult.body as Record<string, unknown>;\n const key = body?.key as string;\n if (!key || typeof key !== \"string\") {\n return res.status(400).json({\n resourceType: \"OperationOutcome\",\n issue: [\n {\n severity: \"error\",\n code: \"required\",\n diagnostics: \"Configuration key is required\",\n },\n ],\n });\n }\n\n try {\n const result = await createConfigurationOperation({\n context: ctx,\n body: {\n key,\n id: body?.id as string | undefined,\n resource: body?.resource as\n | Record<string, unknown>\n | string\n | undefined,\n tenantId: body?.tenantId as string | undefined,\n workspaceId: body?.workspaceId as string | undefined,\n userId: body?.userId as string | undefined,\n roleId: body?.roleId as string | undefined,\n vid: body?.vid as string | undefined,\n lastUpdated: body?.lastUpdated as string | undefined,\n },\n });\n const config = {\n ...result.resource,\n meta: result.meta,\n };\n return res\n .status(201)\n .location(`${BASE_PATH.CONFIGURATION}/${result.key}`)\n .json(config);\n } catch (err: unknown) {\n console.error(\"POST Configuration error:\", err);\n return res.status(500).json({\n resourceType: \"OperationOutcome\",\n issue: [\n { severity: \"error\", code: \"exception\", diagnostics: String(err) },\n ],\n });\n }\n}\n","import { getDynamoControlService } from \"../../../dynamo/dynamo-control-service\";\nimport type { OpenHiContext } from \"../../../openhi-context\";\n\nconst SK = \"CURRENT\";\n\n/**\n * Delete a Configuration by id (key). No-op if the item does not exist (idempotent).\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entities/configuration.md\n */\nexport interface DeleteConfigurationParams {\n context: OpenHiContext;\n /** Configuration key (id). */\n id: string;\n /** Optional table name override; resolved by data service from DYNAMO_TABLE_NAME when omitted. */\n tableName?: string;\n}\n\n/**\n * Deletes the current Configuration for the given key in context scope.\n * Does not throw when the configuration does not exist.\n * Throws on service errors; adapters map to HTTP/GraphQL.\n */\nexport async function deleteConfigurationOperation(\n params: DeleteConfigurationParams,\n): Promise<void> {\n const { context, id, tableName } = params;\n const { tenantId, workspaceId, actorId, roleId: ctxRoleId } = context;\n const roleId = ctxRoleId ?? \"-\";\n const service = getDynamoControlService(tableName);\n\n await service.entities.configuration\n .delete({\n tenantId,\n workspaceId,\n userId: actorId,\n roleId,\n key: id,\n sk: SK,\n })\n .go();\n}\n","import type { Request, Response } from \"express\";\nimport { deleteConfigurationOperation } from \"../../../../operations/control/configuration/configuration-delete-operation\";\n\n/**\n * DELETE /Configuration/:id — delete: removes from data store, returns 204.\n */\nexport async function deleteConfigurationRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n\n try {\n await deleteConfigurationOperation({ context: ctx, id });\n return res.status(204).send();\n } catch (err: unknown) {\n console.error(\"DELETE Configuration error:\", err);\n return res.status(500).json({\n resourceType: \"OperationOutcome\",\n issue: [\n { severity: \"error\", code: \"exception\", diagnostics: String(err) },\n ],\n });\n }\n}\n","/**\n * Typed domain errors for the data operations layer.\n * Data operations throw these; adapters (REST, GraphQL, Step Function) map them to\n * HTTP status, GraphQL errors, or workflow envelopes. No HTTP or OperationOutcome here.\n *\n * Full documentation (error types, HTTP mapping, FHIR OperationOutcome.issue.code alignment):\n * @see sites/www-docs/content/packages/@openhi/constructs/data/errors.md\n */\n\n/**\n * Base class for domain errors thrown by data operations.\n * Adapters use instanceof checks or domainErrorToHttpStatus() to map to transport.\n */\nexport class DomainError extends Error {\n /** Stable code for adapter mapping (e.g. \"NOT_FOUND\", \"VALIDATION\", \"CONFLICT\"). */\n readonly code: string;\n\n /** Optional details for validation messages or conflict context. */\n readonly details?: unknown;\n\n constructor(\n message: string,\n code: string,\n options?: { cause?: unknown; details?: unknown },\n ) {\n super(message, options);\n this.name = this.constructor.name;\n this.code = code;\n this.details = options?.details;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when a requested resource or entity is not found (e.g. get by id returns nothing). */\nexport class NotFoundError extends DomainError {\n constructor(\n message: string,\n options?: { cause?: unknown; details?: unknown },\n ) {\n super(message, \"NOT_FOUND\", options);\n }\n}\n\n/** Thrown when input fails validation (e.g. missing required field, invalid format). */\nexport class ValidationError extends DomainError {\n constructor(\n message: string,\n options?: { cause?: unknown; details?: unknown },\n ) {\n super(message, \"VALIDATION\", options);\n }\n}\n\n/** Thrown when an operation conflicts with current state (e.g. duplicate key, version conflict). */\nexport class ConflictError extends DomainError {\n constructor(\n message: string,\n options?: { cause?: unknown; details?: unknown },\n ) {\n super(message, \"CONFLICT\", options);\n }\n}\n\n/**\n * Maps a thrown value to the HTTP status code that adapters should use for that domain error.\n * Returns null if the value is not a known domain error (adapter may use 500 or handle otherwise).\n * REST adapters use this to choose status; response body/OperationOutcome remain adapter responsibility.\n */\nexport function domainErrorToHttpStatus(err: unknown): number | null {\n if (err instanceof NotFoundError) return 404;\n if (err instanceof ValidationError) return 400;\n if (err instanceof ConflictError) return 409;\n return null;\n}\n","import { decompressResource } from \"../../../../lib/compression\";\nimport { getDynamoControlService } from \"../../../dynamo/dynamo-control-service\";\nimport { NotFoundError } from \"../../../errors\";\nimport type { OpenHiContext } from \"../../../openhi-context\";\n\nconst SK = \"CURRENT\";\n\n/**\n * Get a single Configuration by id (key). Throws NotFoundError if not found.\n */\nexport interface GetConfigurationByIdParams {\n context: OpenHiContext;\n id: string;\n /** Optional table name override; resolved by data service from DYNAMO_TABLE_NAME when omitted. */\n tableName?: string;\n}\n\nexport interface GetConfigurationByIdResult {\n id: string;\n key: string;\n resource: Record<string, unknown>;\n}\n\n/**\n * Returns the current Configuration for the id (key) in the given context scope.\n * Throws NotFoundError when the configuration does not exist.\n */\nexport async function getConfigurationByIdOperation(\n params: GetConfigurationByIdParams,\n): Promise<GetConfigurationByIdResult> {\n const { context, id, tableName } = params;\n const { tenantId, workspaceId, actorId, roleId: ctxRoleId } = context;\n const roleId = ctxRoleId ?? \"-\";\n const service = getDynamoControlService(tableName);\n\n const result = await service.entities.configuration\n .get({ tenantId, workspaceId, userId: actorId, roleId, key: id, sk: SK })\n .go();\n\n if (!result.data) {\n throw new NotFoundError(`Configuration ${id} not found`, {\n details: { id },\n });\n }\n\n const resource = JSON.parse(\n decompressResource(result.data.resource),\n ) as Record<string, unknown>;\n return {\n id: result.data.id,\n key: result.data.key,\n resource: {\n ...resource,\n resourceType: \"Configuration\",\n id: result.data.id,\n key: result.data.key,\n },\n };\n}\n","import type { Request, Response } from \"express\";\nimport { NotFoundError, domainErrorToHttpStatus } from \"../../../../errors\";\nimport { getConfigurationByIdOperation } from \"../../../../operations/control/configuration/configuration-get-by-id-operation\";\n\n/**\n * GET /Configuration/:id — read: returns a single Configuration resource for the id in current scope, or 404.\n */\nexport async function getConfigurationByIdRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n\n try {\n const result = await getConfigurationByIdOperation({ context: ctx, id });\n return res.json(result.resource);\n } catch (err: unknown) {\n const status = domainErrorToHttpStatus(err);\n if (status === 404) {\n return res.status(404).json({\n resourceType: \"OperationOutcome\",\n issue: [\n {\n severity: \"error\",\n code: \"not-found\",\n diagnostics:\n err instanceof NotFoundError\n ? err.message\n : `Configuration ${id} not found`,\n },\n ],\n });\n }\n console.error(\"GET Configuration error:\", err);\n return res.status(500).json({\n resourceType: \"OperationOutcome\",\n issue: [\n {\n severity: \"error\",\n code: \"exception\",\n diagnostics: String(err),\n },\n ],\n });\n }\n}\n","import { decompressResource } from \"../../../../lib/compression\";\nimport { getDynamoControlService } from \"../../../dynamo/dynamo-control-service\";\nimport type { OpenHiContext } from \"../../../openhi-context\";\n\n/**\n * List Configuration entries in a workspace (GSI4). Returns domain result for adapters to map to Bundle or other formats.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entities/configuration.md\n */\nexport interface ListConfigurationsParams {\n context: OpenHiContext;\n /** Optional table name override; resolved by data service from DYNAMO_TABLE_NAME when omitted. */\n tableName?: string;\n}\n\nexport interface ConfigurationListEntry {\n id: string;\n key: string;\n resource: Record<string, unknown>;\n}\n\nexport interface ListConfigurationsResult {\n entries: Array<ConfigurationListEntry>;\n}\n\n/**\n * Lists all Configuration entries in the workspace. Uses GSI4 (Resource Type Index).\n * Throws on service errors; adapters map to HTTP/GraphQL/Step Function.\n */\nexport async function listConfigurationsOperation(\n params: ListConfigurationsParams,\n): Promise<ListConfigurationsResult> {\n const { context, tableName } = params;\n const { tenantId, workspaceId } = context;\n const service = getDynamoControlService(tableName);\n\n const result = await service.entities.configuration.query\n .gsi4({ tenantId, workspaceId })\n .go();\n\n const entries: Array<ConfigurationListEntry> = (result.data ?? []).map(\n (item) => {\n const resource = JSON.parse(decompressResource(item.resource)) as Record<\n string,\n unknown\n >;\n return {\n id: item.id,\n key: item.key,\n resource: {\n resourceType: \"Configuration\",\n id: item.id,\n key: item.key,\n resource,\n },\n };\n },\n );\n\n return { entries };\n}\n","/**\n * Generates Configuration entries that are not stored in DynamoDB but are\n * included in the list response. Values are retrieved from AWS SSM Parameter\n * Store based on tags. Used by GET /Configuration to append dynamic\n * configs to Dynamo results.\n *\n * SSM parameters are selected when their tags match the Lambda environment\n * variables BRANCH_TAG_VALUE and HTTP_API_TAG_VALUE (set by RestApiLambda):\n * - Tag OpenHI:Branch must equal BRANCH_TAG_VALUE (e.g. branch name).\n * - Tag OpenHI:HttpApiParam must equal HTTP_API_TAG_VALUE (e.g. ROOT_HTTP_API).\n * If either env var is unset, the static dummy entry is returned.\n *\n * @see sites/www-docs/content/architecture/control-plane/configuration.md\n * @see packages/@openhi/constructs/src/data/lambda/rest-api-lambda.ts — BRANCH_TAG_VALUE, HTTP_API_TAG_VALUE\n */\n\nimport {\n DescribeParametersCommand,\n GetParametersCommand,\n SSMClient,\n} from \"@aws-sdk/client-ssm\";\n\n/**\n * @see sites/www-docs/content/packages/@openhi/constructs/data/rest-api/dynamic-configuration.md\n */\n\nconst BASE_PATH = \"/Configuration\";\n\n/** SSM tag key for branch (value must match Lambda env BRANCH_TAG_VALUE). */\nconst TAG_KEY_BRANCH = \"openhi:branch-name\";\n/** SSM tag key for HTTP API param (value must match Lambda env HTTP_API_TAG_VALUE). */\nconst TAG_KEY_HTTP_API_PARAM = \"openhi:param-name\";\n\n/** Shape of a single entry in the list Bundle (fullUrl + resource). */\nexport interface ConfigurationListEntry {\n fullUrl: string;\n resource: {\n resourceType: \"Configuration\";\n id: string;\n key: string;\n resource?: Record<string, unknown>;\n meta?: Record<string, unknown>;\n [k: string]: unknown;\n };\n}\n\n/**\n * Values used to filter SSM parameters by tags. Sourced from Lambda environment\n * (BRANCH_TAG_VALUE, HTTP_API_TAG_VALUE). Both must be set to perform SSM lookup.\n */\nexport interface SsmDynamicConfigEnvFilter {\n /** Value for tag OpenHI:Branch (e.g. branch name). From env BRANCH_TAG_VALUE. */\n branchTagValue: string;\n /** Value for tag OpenHI:HttpApiParam (e.g. ROOT_HTTP_API). From env HTTP_API_TAG_VALUE. */\n httpApiTagValue: string;\n}\n\n/**\n * Resolves the tag filter from Lambda environment variables.\n * Returns null if either BRANCH_TAG_VALUE or HTTP_API_TAG_VALUE is missing.\n */\nexport function getSsmDynamicConfigEnvFilter(): SsmDynamicConfigEnvFilter | null {\n const branchTagValue = process.env.BRANCH_TAG_VALUE;\n const httpApiTagValue = process.env.HTTP_API_TAG_VALUE;\n if (\n branchTagValue == null ||\n branchTagValue === \"\" ||\n httpApiTagValue == null ||\n httpApiTagValue === \"\"\n ) {\n return null;\n }\n return { branchTagValue, httpApiTagValue };\n}\n\n/**\n * Fetches SSM parameter names whose tags match BRANCH_TAG_VALUE and\n * HTTP_API_TAG_VALUE (OpenHI:Branch and OpenHI:HttpApiParam), then\n * retrieves their values and returns a single Configuration list entry\n * whose resource.parameter array is built from name/value pairs.\n *\n * Parameter names are used as the parameter \"name\" in the Configuration\n * (last path segment if the name contains \"/\", otherwise the full name).\n * Values are stored as valueString.\n *\n * If either env var is unset, returns the static dummy entry without calling SSM.\n */\nexport async function getDynamicConfigurationEntries(context?: {\n tenantId?: string;\n workspaceId?: string;\n}): Promise<Array<ConfigurationListEntry>> {\n const envFilter = getSsmDynamicConfigEnvFilter();\n if (envFilter == null) {\n return getStaticDummyEntry(context);\n }\n\n const region = process.env.AWS_REGION ?? process.env.AWS_DEFAULT_REGION;\n const client = new SSMClient({ region });\n\n try {\n // DescribeParameters: parameters must have both tags matching Lambda env\n const describeResult = await client.send(\n new DescribeParametersCommand({\n ParameterFilters: [\n {\n Key: `tag:${TAG_KEY_BRANCH}`,\n Option: \"Equals\",\n Values: [envFilter.branchTagValue],\n },\n {\n Key: `tag:${TAG_KEY_HTTP_API_PARAM}`,\n Option: \"Equals\",\n Values: [envFilter.httpApiTagValue],\n },\n ],\n MaxResults: 50,\n }),\n );\n\n const names = (describeResult.Parameters ?? [])\n .map((p: { Name?: string }) => p.Name)\n .filter((n: string | undefined): n is string => n != null);\n\n if (names.length === 0) {\n return getStaticDummyEntry(context);\n }\n\n // GetParameter values in batches of 10 (SSM limit)\n const parameters: Array<{ name: string; value: string }> = [];\n for (let i = 0; i < names.length; i += 10) {\n const batch = names.slice(i, i + 10);\n const getResult = await client.send(\n new GetParametersCommand({\n Names: batch,\n WithDecryption: true,\n }),\n );\n\n for (const p of getResult.Parameters ?? []) {\n const name = (p as { Name?: string }).Name;\n const value = (p as { Value?: string }).Value;\n if (name != null && value != null) {\n parameters.push({ name, value });\n }\n }\n }\n\n const parameterList = parameters.map((p) => {\n const shortName = p.name.includes(\"/\")\n ? p.name.split(\"/\").slice(-1)[0]\n : p.name;\n return { name: shortName, valueString: p.value };\n });\n\n const entry: ConfigurationListEntry = {\n fullUrl: `${BASE_PATH}/ssm-dynamic`,\n resource: {\n resourceType: \"Configuration\",\n id: \"ssm-dynamic\",\n key: \"ssm-dynamic\",\n resource: {\n parameter: parameterList,\n },\n meta: {\n lastUpdated: new Date().toISOString(),\n versionId: \"1\",\n },\n },\n };\n\n return [entry];\n } catch (err) {\n console.error(\"getDynamicConfigurationEntries SSM error:\", err);\n return getStaticDummyEntry(context);\n }\n}\n\n/**\n * Returns a static dummy Configuration entry when SSM is unavailable or\n * returns no parameters (e.g. in tests or fallback).\n */\nfunction getStaticDummyEntry(_context?: {\n tenantId?: string;\n workspaceId?: string;\n}): Array<ConfigurationListEntry> {\n const dummy: ConfigurationListEntry = {\n fullUrl: `${BASE_PATH}/dynamic-dummy`,\n resource: {\n resourceType: \"Configuration\",\n id: \"dynamic-dummy\",\n key: \"dynamic-dummy\",\n resource: {\n parameter: [\n {\n name: \"description\",\n valueString:\n \"Statically generated dummy configuration (not from DynamoDB).\",\n },\n { name: \"source\", valueString: \"dynamic-configuration\" },\n ],\n },\n meta: {\n lastUpdated: new Date().toISOString(),\n versionId: \"1\",\n },\n },\n };\n\n return [dummy];\n}\n","import type { Request, Response } from \"express\";\nimport { listConfigurationsOperation } from \"../../../../operations/control/configuration/configuration-list-operation\";\nimport { getDynamicConfigurationEntries } from \"../../../dynamic-configuration\";\nimport { BASE_PATH } from \"../../common\";\n\n/**\n * GET /Configuration — list: returns a FHIR Bundle (searchset) of Configuration resources.\n * Uses listConfigurationsOperation (GSI4) plus dynamic entries; scope from req.openhiContext.\n */\nexport async function listConfigurationsRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const ctx = req.openhiContext!;\n const { tenantId, workspaceId } = ctx;\n\n try {\n const { entries: dynamoEntries } = await listConfigurationsOperation({\n context: ctx,\n });\n const dynamoBundleEntries = dynamoEntries.map((e) => ({\n fullUrl: `${BASE_PATH.CONFIGURATION}/${e.key}`,\n resource: e.resource,\n }));\n const dynamicEntries = await getDynamicConfigurationEntries({\n tenantId,\n workspaceId,\n });\n const entries = [...dynamoBundleEntries, ...dynamicEntries];\n const bundle = {\n resourceType: \"Bundle\",\n type: \"searchset\",\n total: entries.length,\n link: [{ relation: \"self\", url: BASE_PATH.CONFIGURATION }],\n entry: entries,\n };\n return res.json(bundle);\n } catch (err: unknown) {\n console.error(\"GET /Configuration list error:\", err);\n return res.status(500).json({\n resourceType: \"OperationOutcome\",\n issue: [\n {\n severity: \"error\",\n code: \"exception\",\n diagnostics: String(err),\n },\n ],\n });\n }\n}\n","import { compressResource } from \"../../../../lib/compression\";\nimport { getDynamoControlService } from \"../../../dynamo/dynamo-control-service\";\nimport { NotFoundError } from \"../../../errors\";\nimport type { OpenHiContext } from \"../../../openhi-context\";\n\nconst SK = \"CURRENT\";\n\n/**\n * Update a Configuration by id (key). Throws NotFoundError if not found.\n */\nexport interface UpdateConfigurationParams {\n context: OpenHiContext;\n id: string;\n /** Body with resource and optional lastUpdated. */\n body: {\n resource?: Record<string, unknown> | string;\n lastUpdated?: string;\n };\n /** Optional table name override. */\n tableName?: string;\n}\n\nexport interface UpdateConfigurationResult {\n id: string;\n key: string;\n resource: Record<string, unknown>;\n meta: { lastUpdated: string; versionId: string };\n}\n\n/**\n * Updates the current Configuration. Throws NotFoundError when the configuration does not exist.\n */\nexport async function updateConfigurationOperation(\n params: UpdateConfigurationParams,\n): Promise<UpdateConfigurationResult> {\n const { context, id, body, tableName } = params;\n const { tenantId, workspaceId, actorId, date, roleId: ctxRoleId } = context;\n const roleId = ctxRoleId ?? \"-\";\n const service = getDynamoControlService(tableName);\n\n const existing = await service.entities.configuration\n .get({ tenantId, workspaceId, userId: actorId, roleId, key: id, sk: SK })\n .go();\n\n if (!existing.data) {\n throw new NotFoundError(`Configuration ${id} not found`, {\n details: { id },\n });\n }\n\n const resourcePayload = body.resource;\n const resourceStr =\n typeof resourcePayload === \"string\"\n ? resourcePayload\n : JSON.stringify(resourcePayload ?? {});\n const lastUpdated = body.lastUpdated ?? date;\n const nextVid =\n existing.data.vid != null\n ? String(Number(existing.data.vid) + 1)\n : date.replace(/[-:T.Z]/g, \"\").slice(0, 12) || \"2\";\n\n await service.entities.configuration\n .patch({ tenantId, workspaceId, userId: actorId, roleId, key: id, sk: SK })\n .set({\n resource: compressResource(resourceStr),\n lastUpdated,\n vid: nextVid,\n })\n .go();\n\n const parsedResource =\n typeof resourcePayload === \"object\"\n ? (resourcePayload as Record<string, unknown>)\n : (JSON.parse(resourceStr) as Record<string, unknown>);\n\n return {\n id: existing.data.id,\n key: existing.data.key,\n resource: {\n resourceType: \"Configuration\",\n id: existing.data.id,\n key: existing.data.key,\n resource: parsedResource,\n },\n meta: { lastUpdated, versionId: nextVid },\n };\n}\n","import type { Request, Response } from \"express\";\nimport { NotFoundError, domainErrorToHttpStatus } from \"../../../../errors\";\nimport { updateConfigurationOperation } from \"../../../../operations/control/configuration/configuration-update-operation\";\nimport { requireJsonBody } from \"../../common\";\n\n/**\n * PUT /Configuration/:id — update: accepts Configuration body, persists via data store, returns 200.\n */\nexport async function updateConfigurationRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const bodyResult = requireJsonBody(req, res);\n if (\"errorResponse\" in bodyResult) return bodyResult.errorResponse;\n\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n const body = bodyResult.body as Record<string, unknown>;\n\n try {\n const result = await updateConfigurationOperation({\n context: ctx,\n id,\n body: {\n resource: body?.resource as\n | Record<string, unknown>\n | string\n | undefined,\n lastUpdated: body?.lastUpdated as string | undefined,\n },\n });\n return res.json({\n ...result.resource,\n meta: result.meta,\n });\n } catch (err: unknown) {\n const status = domainErrorToHttpStatus(err);\n if (status === 404) {\n return res.status(404).json({\n resourceType: \"OperationOutcome\",\n issue: [\n {\n severity: \"error\",\n code: \"not-found\",\n diagnostics:\n err instanceof NotFoundError\n ? err.message\n : `Configuration ${id} not found`,\n },\n ],\n });\n }\n console.error(\"PUT Configuration error:\", err);\n return res.status(500).json({\n resourceType: \"OperationOutcome\",\n issue: [\n {\n severity: \"error\",\n code: \"exception\",\n diagnostics: String(err),\n },\n ],\n });\n }\n}\n","import express from \"express\";\nimport { createEncounterRoute } from \"./encounter-create-route\";\nimport { deleteEncounterRoute } from \"./encounter-delete-route\";\nimport { getEncounterByIdRoute } from \"./encounter-get-by-id-route\";\nimport { listEncountersRoute } from \"./encounter-list-route\";\nimport { updateEncounterRoute } from \"./encounter-update-route\";\n\n/**\n * Encounter REST router: /Encounter\n * FHIR R4 Encounter resource; same pattern as Patient routes.\n */\nconst router: express.Router = express.Router();\n\nrouter.get(\"/\", listEncountersRoute);\nrouter.get(\"/:id\", getEncounterByIdRoute);\nrouter.post(\"/\", createEncounterRoute);\nrouter.put(\"/:id\", updateEncounterRoute);\nrouter.delete(\"/:id\", deleteEncounterRoute);\n\nexport { router as encounterRouter };\n","import type { Encounter, Meta } from \"@openhi/types\";\nimport { ulid } from \"ulid\";\nimport {\n mergeAuditIntoMeta,\n type MetaWithExtensions,\n} from \"../../../audit-meta\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport type { OpenHiContext } from \"../../../openhi-context\";\nimport {\n createDataEntityRecord,\n type SingleResourceResult,\n} from \"../../data-operations-common\";\n\n/**\n * Create an Encounter. Accepts FHIR-like body and OpenHI context; returns created resource.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entities/encounter.md\n */\nexport interface CreateEncounterParams {\n context: OpenHiContext;\n /** FHIR Encounter body (resourceType, id optional, meta optional). */\n body: Encounter;\n /** Optional table name override; resolved by data service from DYNAMO_TABLE_NAME when omitted. */\n tableName?: string;\n}\n\nexport type CreateEncounterResult = SingleResourceResult<Encounter>;\n\n/**\n * Creates an Encounter. Builds put attrs with audit in meta, then ElectroDB put.\n * Throws on service/validation errors; adapters map to HTTP/GraphQL.\n */\nexport async function createEncounterOperation(\n params: CreateEncounterParams,\n): Promise<CreateEncounterResult> {\n const { context, body, tableName } = params;\n const { tenantId, workspaceId, date, actorId, actorName } = context;\n const id = body.id ?? ulid();\n\n const meta: Meta = {\n ...(body.meta ?? {}),\n lastUpdated: date,\n versionId: \"1\",\n };\n\n const encounterWithAudit: Encounter & {\n id: string;\n meta: MetaWithExtensions;\n } = {\n ...body,\n resourceType: \"Encounter\",\n id,\n meta: mergeAuditIntoMeta(meta, {\n createdDate: date,\n createdById: actorId,\n createdByName: actorName,\n modifiedDate: date,\n modifiedById: actorId,\n modifiedByName: actorName,\n }),\n };\n\n const service = getDynamoDataService(tableName);\n return createDataEntityRecord<Encounter>(\n service.entities.encounter as Parameters<typeof createDataEntityRecord>[0],\n tenantId,\n workspaceId,\n id,\n encounterWithAudit,\n date,\n );\n}\n","import type { Extension, Meta } from \"@openhi/types\";\n\n/**\n * Shared audit/meta helpers for FHIR resources. Used by data operations and import.\n * OpenHI audit is stored in resource meta.extension (per ADR 2026-01-13-06).\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md\n */\n\n/** OpenHI extension URLs for audit in resource meta (per ADR 2026-01-13-06). */\nconst OPENHI_EXT = \"http://openhi.org/fhir/StructureDefinition\";\n\n/** Meta with optional OpenHI audit extensions (created/modified by, etc.). */\nexport type MetaWithExtensions = Meta & { extension?: Array<Extension> };\n\n/** Audit fields stored in FHIR resource meta.extension. */\nexport interface AuditFields {\n createdDate?: string;\n createdById?: string;\n createdByName?: string;\n modifiedDate?: string;\n modifiedById?: string;\n modifiedByName?: string;\n deletedDate?: string;\n deletedById?: string;\n deletedByName?: string;\n}\n\n/** Audit extension entry shape (subset of Extension used by OpenHI audit). */\ntype AuditExtensionEntry = Pick<\n Extension,\n \"url\" | \"valueString\" | \"valueDateTime\"\n>;\n\n/** Builds meta.extension entries for audit; merges with existing meta. */\nexport function mergeAuditIntoMeta(\n meta: MetaWithExtensions | Record<string, unknown> | undefined,\n audit: AuditFields,\n): MetaWithExtensions {\n const existing = (meta ?? {}) as MetaWithExtensions;\n const ext: Array<AuditExtensionEntry> = [\n ...(Array.isArray(existing.extension)\n ? (existing.extension as Array<AuditExtensionEntry>)\n : []),\n ];\n const byUrl = new Map(ext.map((e) => [e.url, e]));\n function set(\n url: string,\n value: string | undefined,\n type: \"valueString\" | \"valueDateTime\",\n ) {\n if (value == null) return;\n byUrl.set(url, { url, [type]: value });\n }\n set(`${OPENHI_EXT}/created-date`, audit.createdDate, \"valueDateTime\");\n set(`${OPENHI_EXT}/created-by-id`, audit.createdById, \"valueString\");\n set(`${OPENHI_EXT}/created-by-name`, audit.createdByName, \"valueString\");\n set(`${OPENHI_EXT}/modified-date`, audit.modifiedDate, \"valueDateTime\");\n set(`${OPENHI_EXT}/modified-by-id`, audit.modifiedById, \"valueString\");\n set(`${OPENHI_EXT}/modified-by-name`, audit.modifiedByName, \"valueString\");\n set(`${OPENHI_EXT}/deleted-date`, audit.deletedDate, \"valueDateTime\");\n set(`${OPENHI_EXT}/deleted-by-id`, audit.deletedById, \"valueString\");\n set(`${OPENHI_EXT}/deleted-by-name`, audit.deletedByName, \"valueString\");\n return { ...existing, extension: Array.from(byUrl.values()) };\n}\n","import { Service } from \"electrodb\";\nimport { defaultTableName, dynamoClient } from \"./dynamo-client\";\nimport { AccountEntity } from \"./entities/data/account-entity\";\nimport { ActivityDefinitionEntity } from \"./entities/data/activity-definition-entity\";\nimport { AdverseEventEntity } from \"./entities/data/adverse-event-entity\";\nimport { AllergyIntoleranceEntity } from \"./entities/data/allergy-intolerance-entity\";\nimport { AppointmentEntity } from \"./entities/data/appointment-entity\";\nimport { AppointmentResponseEntity } from \"./entities/data/appointment-response-entity\";\nimport { AuditEventEntity } from \"./entities/data/audit-event-entity\";\nimport { BasicEntity } from \"./entities/data/basic-entity\";\nimport { BiologicallyDerivedProductEntity } from \"./entities/data/biologically-derived-product-entity\";\nimport { BodyStructureEntity } from \"./entities/data/body-structure-entity\";\nimport { CarePlanEntity } from \"./entities/data/care-plan-entity\";\nimport { CareTeamEntity } from \"./entities/data/care-team-entity\";\nimport { CatalogEntryEntity } from \"./entities/data/catalog-entry-entity\";\nimport { ChargeItemDefinitionEntity } from \"./entities/data/charge-item-definition-entity\";\nimport { ChargeItemEntity } from \"./entities/data/charge-item-entity\";\nimport { ClaimEntity } from \"./entities/data/claim-entity\";\nimport { ClaimResponseEntity } from \"./entities/data/claim-response-entity\";\nimport { ClinicalImpressionEntity } from \"./entities/data/clinical-impression-entity\";\nimport { CommunicationEntity } from \"./entities/data/communication-entity\";\nimport { CommunicationRequestEntity } from \"./entities/data/communication-request-entity\";\nimport { CompositionEntity } from \"./entities/data/composition-entity\";\nimport { ConditionEntity } from \"./entities/data/condition-entity\";\nimport { ConsentEntity } from \"./entities/data/consent-entity\";\nimport { ContractEntity } from \"./entities/data/contract-entity\";\nimport { CoverageEligibilityRequestEntity } from \"./entities/data/coverage-eligibility-request-entity\";\nimport { CoverageEligibilityResponseEntity } from \"./entities/data/coverage-eligibility-response-entity\";\nimport { CoverageEntity } from \"./entities/data/coverage-entity\";\nimport { DetectedIssueEntity } from \"./entities/data/detected-issue-entity\";\nimport { DeviceDefinitionEntity } from \"./entities/data/device-definition-entity\";\nimport { DeviceEntity } from \"./entities/data/device-entity\";\nimport { DeviceMetricEntity } from \"./entities/data/device-metric-entity\";\nimport { DeviceRequestEntity } from \"./entities/data/device-request-entity\";\nimport { DeviceUseStatementEntity } from \"./entities/data/device-use-statement-entity\";\nimport { DiagnosticReportEntity } from \"./entities/data/diagnostic-report-entity\";\nimport { DocumentManifestEntity } from \"./entities/data/document-manifest-entity\";\nimport { DocumentReferenceEntity } from \"./entities/data/document-reference-entity\";\nimport { EffectEvidenceSynthesisEntity } from \"./entities/data/effect-evidence-synthesis-entity\";\nimport { EncounterEntity } from \"./entities/data/encounter-entity\";\nimport { EndpointEntity } from \"./entities/data/endpoint-entity\";\nimport { EnrollmentRequestEntity } from \"./entities/data/enrollment-request-entity\";\nimport { EnrollmentResponseEntity } from \"./entities/data/enrollment-response-entity\";\nimport { EpisodeOfCareEntity } from \"./entities/data/episode-of-care-entity\";\nimport { EventDefinitionEntity } from \"./entities/data/event-definition-entity\";\nimport { EvidenceEntity } from \"./entities/data/evidence-entity\";\nimport { EvidenceVariableEntity } from \"./entities/data/evidence-variable-entity\";\nimport { ExplanationOfBenefitEntity } from \"./entities/data/explanation-of-benefit-entity\";\nimport { FamilyMemberHistoryEntity } from \"./entities/data/family-member-history-entity\";\nimport { FlagEntity } from \"./entities/data/flag-entity\";\nimport { GoalEntity } from \"./entities/data/goal-entity\";\nimport { GroupEntity } from \"./entities/data/group-entity\";\nimport { GuidanceResponseEntity } from \"./entities/data/guidance-response-entity\";\nimport { HealthcareServiceEntity } from \"./entities/data/healthcare-service-entity\";\nimport { ImagingStudyEntity } from \"./entities/data/imaging-study-entity\";\nimport { ImmunizationEntity } from \"./entities/data/immunization-entity\";\nimport { ImmunizationEvaluationEntity } from \"./entities/data/immunization-evaluation-entity\";\nimport { ImmunizationRecommendationEntity } from \"./entities/data/immunization-recommendation-entity\";\nimport { InsurancePlanEntity } from \"./entities/data/insurance-plan-entity\";\nimport { InvoiceEntity } from \"./entities/data/invoice-entity\";\nimport { LibraryEntity } from \"./entities/data/library-entity\";\nimport { LinkageEntity } from \"./entities/data/linkage-entity\";\nimport { ListEntity } from \"./entities/data/list-entity\";\nimport { LocationEntity } from \"./entities/data/location-entity\";\nimport { MeasureEntity } from \"./entities/data/measure-entity\";\nimport { MeasureReportEntity } from \"./entities/data/measure-report-entity\";\nimport { MediaEntity } from \"./entities/data/media-entity\";\nimport { MedicationAdministrationEntity } from \"./entities/data/medication-administration-entity\";\nimport { MedicationDispenseEntity } from \"./entities/data/medication-dispense-entity\";\nimport { MedicationEntity } from \"./entities/data/medication-entity\";\nimport { MedicationKnowledgeEntity } from \"./entities/data/medication-knowledge-entity\";\nimport { MedicationRequestEntity } from \"./entities/data/medication-request-entity\";\nimport { MedicationStatementEntity } from \"./entities/data/medication-statement-entity\";\nimport { MessageHeaderEntity } from \"./entities/data/message-header-entity\";\nimport { MolecularSequenceEntity } from \"./entities/data/molecular-sequence-entity\";\nimport { NutritionOrderEntity } from \"./entities/data/nutrition-order-entity\";\nimport { ObservationEntity } from \"./entities/data/observation-entity\";\nimport { OrganizationAffiliationEntity } from \"./entities/data/organization-affiliation-entity\";\nimport { OrganizationEntity } from \"./entities/data/organization-entity\";\nimport { PatientEntity } from \"./entities/data/patient-entity\";\nimport { PaymentNoticeEntity } from \"./entities/data/payment-notice-entity\";\nimport { PaymentReconciliationEntity } from \"./entities/data/payment-reconciliation-entity\";\nimport { PersonEntity } from \"./entities/data/person-entity\";\nimport { PlanDefinitionEntity } from \"./entities/data/plan-definition-entity\";\nimport { PractitionerEntity } from \"./entities/data/practitioner-entity\";\nimport { PractitionerRoleEntity } from \"./entities/data/practitioner-role-entity\";\nimport { ProcedureEntity } from \"./entities/data/procedure-entity\";\nimport { ProvenanceEntity } from \"./entities/data/provenance-entity\";\nimport { QuestionnaireEntity } from \"./entities/data/questionnaire-entity\";\nimport { QuestionnaireResponseEntity } from \"./entities/data/questionnaire-response-entity\";\nimport { RelatedPersonEntity } from \"./entities/data/related-person-entity\";\nimport { RequestGroupEntity } from \"./entities/data/request-group-entity\";\nimport { ResearchStudyEntity } from \"./entities/data/research-study-entity\";\nimport { ResearchSubjectEntity } from \"./entities/data/research-subject-entity\";\nimport { RiskAssessmentEntity } from \"./entities/data/risk-assessment-entity\";\nimport { RiskEvidenceSynthesisEntity } from \"./entities/data/risk-evidence-synthesis-entity\";\nimport { ScheduleEntity } from \"./entities/data/schedule-entity\";\nimport { ServiceRequestEntity } from \"./entities/data/service-request-entity\";\nimport { SlotEntity } from \"./entities/data/slot-entity\";\nimport { SpecimenEntity } from \"./entities/data/specimen-entity\";\nimport { SubscriptionEntity } from \"./entities/data/subscription-entity\";\nimport { SubstanceEntity } from \"./entities/data/substance-entity\";\nimport { SupplyDeliveryEntity } from \"./entities/data/supply-delivery-entity\";\nimport { SupplyRequestEntity } from \"./entities/data/supply-request-entity\";\nimport { TaskEntity } from \"./entities/data/task-entity\";\nimport { VerificationResultEntity } from \"./entities/data/verification-result-entity\";\nimport { VisionPrescriptionEntity } from \"./entities/data/vision-prescription-entity\";\n\n/**\n * Data-plane entities only (service \"data\"). Same table as control plane; use\n * DynamoControlService for control-plane entities.\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n */\n\nconst dataPlaneEntities = {\n account: AccountEntity,\n activitydefinition: ActivityDefinitionEntity,\n adverseevent: AdverseEventEntity,\n allergyintolerance: AllergyIntoleranceEntity,\n auditevent: AuditEventEntity,\n basic: BasicEntity,\n biologicallyderivedproduct: BiologicallyDerivedProductEntity,\n bodystructure: BodyStructureEntity,\n appointment: AppointmentEntity,\n appointmentresponse: AppointmentResponseEntity,\n careplan: CarePlanEntity,\n careteam: CareTeamEntity,\n catalogentry: CatalogEntryEntity,\n chargeitem: ChargeItemEntity,\n chargeitemdefinition: ChargeItemDefinitionEntity,\n claim: ClaimEntity,\n claimresponse: ClaimResponseEntity,\n clinicalimpression: ClinicalImpressionEntity,\n communication: CommunicationEntity,\n communicationrequest: CommunicationRequestEntity,\n composition: CompositionEntity,\n condition: ConditionEntity,\n consent: ConsentEntity,\n contract: ContractEntity,\n coverage: CoverageEntity,\n coverageeligibilityrequest: CoverageEligibilityRequestEntity,\n coverageeligibilityresponse: CoverageEligibilityResponseEntity,\n detectedissue: DetectedIssueEntity,\n device: DeviceEntity,\n devicedefinition: DeviceDefinitionEntity,\n devicemetric: DeviceMetricEntity,\n devicerequest: DeviceRequestEntity,\n deviceusestatement: DeviceUseStatementEntity,\n diagnosticreport: DiagnosticReportEntity,\n documentmanifest: DocumentManifestEntity,\n documentreference: DocumentReferenceEntity,\n effectevidencesynthesis: EffectEvidenceSynthesisEntity,\n encounter: EncounterEntity,\n endpoint: EndpointEntity,\n enrollmentrequest: EnrollmentRequestEntity,\n enrollmentresponse: EnrollmentResponseEntity,\n episodeofcare: EpisodeOfCareEntity,\n eventdefinition: EventDefinitionEntity,\n evidence: EvidenceEntity,\n evidencevariable: EvidenceVariableEntity,\n explanationofbenefit: ExplanationOfBenefitEntity,\n familymemberhistory: FamilyMemberHistoryEntity,\n flag: FlagEntity,\n goal: GoalEntity,\n group: GroupEntity,\n guidanceresponse: GuidanceResponseEntity,\n healthcareservice: HealthcareServiceEntity,\n immunization: ImmunizationEntity,\n immunizationevaluation: ImmunizationEvaluationEntity,\n immunizationrecommendation: ImmunizationRecommendationEntity,\n imagingstudy: ImagingStudyEntity,\n insuranceplan: InsurancePlanEntity,\n invoice: InvoiceEntity,\n library: LibraryEntity,\n linkage: LinkageEntity,\n list: ListEntity,\n location: LocationEntity,\n medication: MedicationEntity,\n medicationadministration: MedicationAdministrationEntity,\n medicationdispense: MedicationDispenseEntity,\n medicationknowledge: MedicationKnowledgeEntity,\n medicationrequest: MedicationRequestEntity,\n medicationstatement: MedicationStatementEntity,\n media: MediaEntity,\n measure: MeasureEntity,\n measurereport: MeasureReportEntity,\n messageheader: MessageHeaderEntity,\n molecularsequence: MolecularSequenceEntity,\n nutritionorder: NutritionOrderEntity,\n observation: ObservationEntity,\n organization: OrganizationEntity,\n organizationaffiliation: OrganizationAffiliationEntity,\n patient: PatientEntity,\n paymentnotice: PaymentNoticeEntity,\n paymentreconciliation: PaymentReconciliationEntity,\n person: PersonEntity,\n plandefinition: PlanDefinitionEntity,\n practitioner: PractitionerEntity,\n practitionerrole: PractitionerRoleEntity,\n procedure: ProcedureEntity,\n provenance: ProvenanceEntity,\n questionnaire: QuestionnaireEntity,\n questionnaireresponse: QuestionnaireResponseEntity,\n requestgroup: RequestGroupEntity,\n relatedperson: RelatedPersonEntity,\n researchstudy: ResearchStudyEntity,\n researchsubject: ResearchSubjectEntity,\n riskassessment: RiskAssessmentEntity,\n riskevidencesynthesis: RiskEvidenceSynthesisEntity,\n schedule: ScheduleEntity,\n servicerequest: ServiceRequestEntity,\n specimen: SpecimenEntity,\n substance: SubstanceEntity,\n subscription: SubscriptionEntity,\n supplydelivery: SupplyDeliveryEntity,\n supplyrequest: SupplyRequestEntity,\n slot: SlotEntity,\n task: TaskEntity,\n visionprescription: VisionPrescriptionEntity,\n verificationresult: VerificationResultEntity,\n};\n\nconst dataPlaneService = new Service(dataPlaneEntities, {\n table: defaultTableName,\n client: dynamoClient,\n});\n\n/**\n * Data-plane service: entities for the data store (FHIR and related). Data-plane\n * entities use the base table (PK, SK) only; control plane may use GSI4. Same\n * physical table.\n */\nexport const DynamoDataService = {\n entities: dataPlaneService.entities,\n};\n\nexport type DynamoDataServiceType = typeof DynamoDataService;\n\n/**\n * Returns the data-plane service. Table name is resolved from tableName (optional override),\n * then DYNAMO_TABLE_NAME, then \"jesttesttable\".\n */\nexport function getDynamoDataService(\n tableName?: string,\n): DynamoDataServiceType {\n const resolved = tableName ?? defaultTableName;\n const service = new Service(dataPlaneEntities, {\n table: resolved,\n client: dynamoClient,\n });\n return {\n entities: service.entities,\n };\n}\n","import { Entity } from \"electrodb\";\n\n/**\n * Shared attributes for all data-plane FHIR entities (tenant-isolated, single-table store).\n * Used by all data-plane entities (Account, Patient, Encounter, Practitioner, etc.).\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md\n */\nexport const dataEntityAttributes = {\n /** Sort key. \"CURRENT\" for current version; version history in S3. */\n sk: {\n type: \"string\" as const,\n required: true,\n default: \"CURRENT\",\n },\n tenantId: {\n type: \"string\" as const,\n required: true,\n },\n workspaceId: {\n type: \"string\" as const,\n required: true,\n },\n /** FHIR Resource.id; logical id in URL and PK. */\n id: {\n type: \"string\" as const,\n required: true,\n },\n /** FHIR resource as JSON string. JSON.stringify(resource) on write; JSON.parse(item.resource) on read. */\n resource: {\n type: \"string\" as const,\n required: true,\n },\n /** Version id (e.g. ULID). Tracks current version; S3 history key. */\n vid: {\n type: \"string\" as const,\n required: true,\n },\n lastUpdated: {\n type: \"string\" as const,\n required: true,\n },\n deleted: {\n type: \"boolean\" as const,\n required: false,\n },\n bundleId: {\n type: \"string\" as const,\n required: false,\n },\n msgId: {\n type: \"string\" as const,\n required: false,\n },\n};\n\n/** Data-plane entity names (model.entity and key segment). Single source of truth for allowed values. Keys are UPPER_SNAKE for consistency. */\nexport const DATA_ENTITY_NAMES = {\n ACCOUNT: \"account\",\n ACTIVITY_DEFINITION: \"activitydefinition\",\n ADVERSE_EVENT: \"adverseevent\",\n ALLERGY_INTOLERANCE: \"allergyintolerance\",\n APPOINTMENT: \"appointment\",\n APPOINTMENT_RESPONSE: \"appointmentresponse\",\n AUDIT_EVENT: \"auditevent\",\n BASIC: \"basic\",\n BIOLOGICALLY_DERIVED_PRODUCT: \"biologicallyderivedproduct\",\n BODY_STRUCTURE: \"bodystructure\",\n CARE_PLAN: \"careplan\",\n CARE_TEAM: \"careteam\",\n CATALOG_ENTRY: \"catalogentry\",\n CHARGE_ITEM: \"chargeitem\",\n CHARGE_ITEM_DEFINITION: \"chargeitemdefinition\",\n CLAIM: \"claim\",\n CLAIM_RESPONSE: \"claimresponse\",\n CLINICAL_IMPRESSION: \"clinicalimpression\",\n COMMUNICATION: \"communication\",\n COMMUNICATION_REQUEST: \"communicationrequest\",\n COMPOSITION: \"composition\",\n CONDITION: \"condition\",\n CONSENT: \"consent\",\n CONTRACT: \"contract\",\n COVERAGE: \"coverage\",\n COVERAGE_ELIGIBILITY_REQUEST: \"coverageeligibilityrequest\",\n COVERAGE_ELIGIBILITY_RESPONSE: \"coverageeligibilityresponse\",\n DETECTED_ISSUE: \"detectedissue\",\n DEVICE: \"device\",\n DEVICE_DEFINITION: \"devicedefinition\",\n DEVICE_METRIC: \"devicemetric\",\n DEVICE_REQUEST: \"devicerequest\",\n DEVICE_USE_STATEMENT: \"deviceusestatement\",\n DIAGNOSTIC_REPORT: \"diagnosticreport\",\n DOCUMENT_MANIFEST: \"documentmanifest\",\n DOCUMENT_REFERENCE: \"documentreference\",\n EFFECT_EVIDENCE_SYNTHESIS: \"effectevidencesynthesis\",\n ENCOUNTER: \"encounter\",\n ENDPOINT: \"endpoint\",\n ENROLLMENT_REQUEST: \"enrollmentrequest\",\n ENROLLMENT_RESPONSE: \"enrollmentresponse\",\n EPISODE_OF_CARE: \"episodeofcare\",\n EVENT_DEFINITION: \"eventdefinition\",\n EVIDENCE: \"evidence\",\n EVIDENCE_VARIABLE: \"evidencevariable\",\n EXPLANATION_OF_BENEFIT: \"explanationofbenefit\",\n FAMILY_MEMBER_HISTORY: \"familymemberhistory\",\n FLAG: \"flag\",\n GOAL: \"goal\",\n GROUP: \"group\",\n GUIDANCE_RESPONSE: \"guidanceresponse\",\n HEALTHCARE_SERVICE: \"healthcareservice\",\n IMAGING_STUDY: \"imagingstudy\",\n IMMUNIZATION: \"immunization\",\n IMMUNIZATION_EVALUATION: \"immunizationevaluation\",\n IMMUNIZATION_RECOMMENDATION: \"immunizationrecommendation\",\n INSURANCE_PLAN: \"insuranceplan\",\n INVOICE: \"invoice\",\n LIBRARY: \"library\",\n LINKAGE: \"linkage\",\n LIST: \"list\",\n LOCATION: \"location\",\n MEASURE: \"measure\",\n MEASURE_REPORT: \"measurereport\",\n MEDIA: \"media\",\n MEDICATION: \"medication\",\n MEDICATION_ADMINISTRATION: \"medicationadministration\",\n MEDICATION_DISPENSE: \"medicationdispense\",\n MEDICATION_KNOWLEDGE: \"medicationknowledge\",\n MEDICATION_REQUEST: \"medicationrequest\",\n MEDICATION_STATEMENT: \"medicationstatement\",\n MESSAGE_HEADER: \"messageheader\",\n MOLECULAR_SEQUENCE: \"molecularsequence\",\n NUTRITION_ORDER: \"nutritionorder\",\n OBSERVATION: \"observation\",\n ORGANIZATION: \"organization\",\n ORGANIZATION_AFFILIATION: \"organizationaffiliation\",\n PATIENT: \"patient\",\n PAYMENT_NOTICE: \"paymentnotice\",\n PAYMENT_RECONCILIATION: \"paymentreconciliation\",\n PERSON: \"person\",\n PLAN_DEFINITION: \"plandefinition\",\n PRACTITIONER: \"practitioner\",\n PRACTITIONER_ROLE: \"practitionerrole\",\n PROCEDURE: \"procedure\",\n PROVENANCE: \"provenance\",\n QUESTIONNAIRE: \"questionnaire\",\n QUESTIONNAIRE_RESPONSE: \"questionnaireresponse\",\n RELATED_PERSON: \"relatedperson\",\n REQUEST_GROUP: \"requestgroup\",\n RESEARCH_STUDY: \"researchstudy\",\n RESEARCH_SUBJECT: \"researchsubject\",\n RISK_ASSESSMENT: \"riskassessment\",\n RISK_EVIDENCE_SYNTHESIS: \"riskevidencesynthesis\",\n SCHEDULE: \"schedule\",\n SERVICE_REQUEST: \"servicerequest\",\n SLOT: \"slot\",\n SPECIMEN: \"specimen\",\n SUBSTANCE: \"substance\",\n SUBSCRIPTION: \"subscription\",\n SUPPLY_DELIVERY: \"supplydelivery\",\n SUPPLY_REQUEST: \"supplyrequest\",\n TASK: \"task\",\n VERIFICATION_RESULT: \"verificationresult\",\n VISION_PRESCRIPTION: \"visionprescription\",\n} as const;\n\n/** Data-plane entity name (model.entity and key segment). */\nexport type DataEntityName =\n (typeof DATA_ENTITY_NAMES)[keyof typeof DATA_ENTITY_NAMES];\n\n/**\n * Creates an ElectroDB Entity for a data-plane FHIR resource with the common model, attributes,\n * base-table index, and GSI4 (Resource Type Index) for list-by-type-in-workspace.\n * PK template uses resourceTypeLabel in the key (e.g. RT#Encounter#ID#...).\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md — GSI4, List by type in workspace (no scan)\n */\nexport function createDataEntity(\n entity: DataEntityName,\n resourceTypeLabel: string,\n) {\n return new Entity({\n model: {\n entity,\n service: \"data\",\n version: \"01\",\n },\n attributes: dataEntityAttributes,\n indexes: {\n /** Base table: PK, SK (data store key names). PK is built from tenantId, workspaceId, id. */\n record: {\n pk: {\n field: \"PK\",\n composite: [\"tenantId\", \"workspaceId\", \"id\"],\n template: `TID#\\${tenantId}#WID#\\${workspaceId}#RT#${resourceTypeLabel}#ID#\\${id}`,\n },\n sk: {\n field: \"SK\",\n composite: [\"sk\"],\n },\n },\n /** GSI4 — Resource Type Index: list all resources of this type in a workspace (no scan). Used by list operations (e.g. GET /Patient). */\n gsi4: {\n index: \"GSI4\",\n pk: {\n field: \"GSI4PK\",\n composite: [\"tenantId\", \"workspaceId\"],\n template: `TID#\\${tenantId}#WID#\\${workspaceId}#RT#${resourceTypeLabel}`,\n },\n sk: {\n field: \"GSI4SK\",\n composite: [\"id\"],\n template: `ID#\\${id}`,\n },\n },\n },\n });\n}\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Account data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Account#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const AccountEntity = createDataEntity(\"account\", \"Account\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ActivityDefinition data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ActivityDefinition#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ActivityDefinitionEntity = createDataEntity(\n \"activitydefinition\",\n \"ActivityDefinition\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * AdverseEvent data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#AdverseEvent#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const AdverseEventEntity = createDataEntity(\n \"adverseevent\",\n \"AdverseEvent\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * AllergyIntolerance data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#AllergyIntolerance#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const AllergyIntoleranceEntity = createDataEntity(\n \"allergyintolerance\",\n \"AllergyIntolerance\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Appointment data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Appointment#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const AppointmentEntity = createDataEntity(\"appointment\", \"Appointment\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * AppointmentResponse data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#AppointmentResponse#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const AppointmentResponseEntity = createDataEntity(\n \"appointmentresponse\",\n \"AppointmentResponse\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * AuditEvent data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#AuditEvent#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const AuditEventEntity = createDataEntity(\"auditevent\", \"AuditEvent\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Basic data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Basic#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const BasicEntity = createDataEntity(\"basic\", \"Basic\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * BiologicallyDerivedProduct data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#BiologicallyDerivedProduct#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const BiologicallyDerivedProductEntity = createDataEntity(\n \"biologicallyderivedproduct\",\n \"BiologicallyDerivedProduct\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * BodyStructure data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#BodyStructure#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const BodyStructureEntity = createDataEntity(\n \"bodystructure\",\n \"BodyStructure\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * CarePlan data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#CarePlan#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const CarePlanEntity = createDataEntity(\"careplan\", \"CarePlan\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * CareTeam data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#CareTeam#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const CareTeamEntity = createDataEntity(\"careteam\", \"CareTeam\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * CatalogEntry data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#CatalogEntry#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const CatalogEntryEntity = createDataEntity(\n \"catalogentry\",\n \"CatalogEntry\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ChargeItemDefinition data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ChargeItemDefinition#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ChargeItemDefinitionEntity = createDataEntity(\n \"chargeitemdefinition\",\n \"ChargeItemDefinition\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ChargeItem data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ChargeItem#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ChargeItemEntity = createDataEntity(\"chargeitem\", \"ChargeItem\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Claim data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Claim#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ClaimEntity = createDataEntity(\"claim\", \"Claim\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ClaimResponse data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ClaimResponse#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ClaimResponseEntity = createDataEntity(\n \"claimresponse\",\n \"ClaimResponse\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ClinicalImpression data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ClinicalImpression#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ClinicalImpressionEntity = createDataEntity(\n \"clinicalimpression\",\n \"ClinicalImpression\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Communication data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Communication#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const CommunicationEntity = createDataEntity(\n \"communication\",\n \"Communication\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * CommunicationRequest data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#CommunicationRequest#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const CommunicationRequestEntity = createDataEntity(\n \"communicationrequest\",\n \"CommunicationRequest\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Composition data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Composition#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const CompositionEntity = createDataEntity(\"composition\", \"Composition\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Condition data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Condition#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ConditionEntity = createDataEntity(\"condition\", \"Condition\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Consent data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Consent#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ConsentEntity = createDataEntity(\"consent\", \"Consent\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Contract data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Contract#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ContractEntity = createDataEntity(\"contract\", \"Contract\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * CoverageEligibilityRequest data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#CoverageEligibilityRequest#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const CoverageEligibilityRequestEntity = createDataEntity(\n \"coverageeligibilityrequest\",\n \"CoverageEligibilityRequest\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * CoverageEligibilityResponse data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#CoverageEligibilityResponse#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const CoverageEligibilityResponseEntity = createDataEntity(\n \"coverageeligibilityresponse\",\n \"CoverageEligibilityResponse\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Coverage data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Coverage#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const CoverageEntity = createDataEntity(\"coverage\", \"Coverage\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * DetectedIssue data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#DetectedIssue#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const DetectedIssueEntity = createDataEntity(\n \"detectedissue\",\n \"DetectedIssue\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * DeviceDefinition data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#DeviceDefinition#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const DeviceDefinitionEntity = createDataEntity(\n \"devicedefinition\",\n \"DeviceDefinition\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Device data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Device#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const DeviceEntity = createDataEntity(\"device\", \"Device\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * DeviceMetric data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#DeviceMetric#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const DeviceMetricEntity = createDataEntity(\n \"devicemetric\",\n \"DeviceMetric\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * DeviceRequest data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#DeviceRequest#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const DeviceRequestEntity = createDataEntity(\n \"devicerequest\",\n \"DeviceRequest\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * DeviceUseStatement data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#DeviceUseStatement#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const DeviceUseStatementEntity = createDataEntity(\n \"deviceusestatement\",\n \"DeviceUseStatement\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * DiagnosticReport data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#DiagnosticReport#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const DiagnosticReportEntity = createDataEntity(\n \"diagnosticreport\",\n \"DiagnosticReport\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * DocumentManifest data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#DocumentManifest#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const DocumentManifestEntity = createDataEntity(\n \"documentmanifest\",\n \"DocumentManifest\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * DocumentReference data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#DocumentReference#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const DocumentReferenceEntity = createDataEntity(\n \"documentreference\",\n \"DocumentReference\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * EffectEvidenceSynthesis data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#EffectEvidenceSynthesis#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const EffectEvidenceSynthesisEntity = createDataEntity(\n \"effectevidencesynthesis\",\n \"EffectEvidenceSynthesis\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Encounter data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Encounter#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with Patient and other domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entities/encounter.md\n */\nexport const EncounterEntity = createDataEntity(\"encounter\", \"Encounter\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Endpoint data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Endpoint#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const EndpointEntity = createDataEntity(\"endpoint\", \"Endpoint\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * EnrollmentRequest data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#EnrollmentRequest#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const EnrollmentRequestEntity = createDataEntity(\n \"enrollmentrequest\",\n \"EnrollmentRequest\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * EnrollmentResponse data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#EnrollmentResponse#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const EnrollmentResponseEntity = createDataEntity(\n \"enrollmentresponse\",\n \"EnrollmentResponse\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * EpisodeOfCare data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#EpisodeOfCare#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const EpisodeOfCareEntity = createDataEntity(\n \"episodeofcare\",\n \"EpisodeOfCare\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * EventDefinition data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#EventDefinition#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const EventDefinitionEntity = createDataEntity(\n \"eventdefinition\",\n \"EventDefinition\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Evidence data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Evidence#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const EvidenceEntity = createDataEntity(\"evidence\", \"Evidence\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * EvidenceVariable data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#EvidenceVariable#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const EvidenceVariableEntity = createDataEntity(\n \"evidencevariable\",\n \"EvidenceVariable\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ExplanationOfBenefit data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ExplanationOfBenefit#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ExplanationOfBenefitEntity = createDataEntity(\n \"explanationofbenefit\",\n \"ExplanationOfBenefit\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * FamilyMemberHistory data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#FamilyMemberHistory#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const FamilyMemberHistoryEntity = createDataEntity(\n \"familymemberhistory\",\n \"FamilyMemberHistory\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Flag data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Flag#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const FlagEntity = createDataEntity(\"flag\", \"Flag\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Goal data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Goal#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const GoalEntity = createDataEntity(\"goal\", \"Goal\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Group data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Group#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const GroupEntity = createDataEntity(\"group\", \"Group\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * GuidanceResponse data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#GuidanceResponse#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const GuidanceResponseEntity = createDataEntity(\n \"guidanceresponse\",\n \"GuidanceResponse\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * HealthcareService data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#HealthcareService#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const HealthcareServiceEntity = createDataEntity(\n \"healthcareservice\",\n \"HealthcareService\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ImagingStudy data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ImagingStudy#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ImagingStudyEntity = createDataEntity(\n \"imagingstudy\",\n \"ImagingStudy\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Immunization data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Immunization#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ImmunizationEntity = createDataEntity(\n \"immunization\",\n \"Immunization\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ImmunizationEvaluation data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ImmunizationEvaluation#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ImmunizationEvaluationEntity = createDataEntity(\n \"immunizationevaluation\",\n \"ImmunizationEvaluation\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ImmunizationRecommendation data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ImmunizationRecommendation#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ImmunizationRecommendationEntity = createDataEntity(\n \"immunizationrecommendation\",\n \"ImmunizationRecommendation\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * InsurancePlan data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#InsurancePlan#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const InsurancePlanEntity = createDataEntity(\n \"insuranceplan\",\n \"InsurancePlan\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Invoice data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Invoice#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const InvoiceEntity = createDataEntity(\"invoice\", \"Invoice\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Library data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Library#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const LibraryEntity = createDataEntity(\"library\", \"Library\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Linkage data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Linkage#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const LinkageEntity = createDataEntity(\"linkage\", \"Linkage\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * List data-store entity based on FHIR R4 (single-table store).\n * Represents the FHIR List resource (curated list of items).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#List#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ListEntity = createDataEntity(\"list\", \"List\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Location data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Location#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const LocationEntity = createDataEntity(\"location\", \"Location\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Measure data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Measure#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MeasureEntity = createDataEntity(\"measure\", \"Measure\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * MeasureReport data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#MeasureReport#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MeasureReportEntity = createDataEntity(\n \"measurereport\",\n \"MeasureReport\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Media data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Media#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MediaEntity = createDataEntity(\"media\", \"Media\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * MedicationAdministration data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#MedicationAdministration#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MedicationAdministrationEntity = createDataEntity(\n \"medicationadministration\",\n \"MedicationAdministration\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * MedicationDispense data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#MedicationDispense#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MedicationDispenseEntity = createDataEntity(\n \"medicationdispense\",\n \"MedicationDispense\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Medication data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Medication#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MedicationEntity = createDataEntity(\"medication\", \"Medication\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * MedicationKnowledge data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#MedicationKnowledge#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MedicationKnowledgeEntity = createDataEntity(\n \"medicationknowledge\",\n \"MedicationKnowledge\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * MedicationRequest data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#MedicationRequest#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MedicationRequestEntity = createDataEntity(\n \"medicationrequest\",\n \"MedicationRequest\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * MedicationStatement data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#MedicationStatement#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MedicationStatementEntity = createDataEntity(\n \"medicationstatement\",\n \"MedicationStatement\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * MessageHeader data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#MessageHeader#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MessageHeaderEntity = createDataEntity(\n \"messageheader\",\n \"MessageHeader\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * MolecularSequence data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#MolecularSequence#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const MolecularSequenceEntity = createDataEntity(\n \"molecularsequence\",\n \"MolecularSequence\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * NutritionOrder data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#NutritionOrder#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const NutritionOrderEntity = createDataEntity(\n \"nutritionorder\",\n \"NutritionOrder\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Observation data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Observation#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ObservationEntity = createDataEntity(\"observation\", \"Observation\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * OrganizationAffiliation data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#OrganizationAffiliation#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const OrganizationAffiliationEntity = createDataEntity(\n \"organizationaffiliation\",\n \"OrganizationAffiliation\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Organization data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Organization#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const OrganizationEntity = createDataEntity(\n \"organization\",\n \"Organization\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Patient data-store entity based on FHIR (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Patient#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) are documented in the Data-Store Entity Standards (FHIR).\n * Audit is in FHIR resource meta (meta.extension), not item attributes. See entity-standards.md.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entities/patient.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const PatientEntity = createDataEntity(\"patient\", \"Patient\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * PaymentNotice data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#PaymentNotice#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const PaymentNoticeEntity = createDataEntity(\n \"paymentnotice\",\n \"PaymentNotice\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * PaymentReconciliation data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#PaymentReconciliation#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const PaymentReconciliationEntity = createDataEntity(\n \"paymentreconciliation\",\n \"PaymentReconciliation\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Person data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Person#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const PersonEntity = createDataEntity(\"person\", \"Person\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * PlanDefinition data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#PlanDefinition#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const PlanDefinitionEntity = createDataEntity(\n \"plandefinition\",\n \"PlanDefinition\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Practitioner data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Practitioner#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with Patient, Encounter, and entity standards.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entities/practitioner.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const PractitionerEntity = createDataEntity(\n \"practitioner\",\n \"Practitioner\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * PractitionerRole data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#PractitionerRole#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const PractitionerRoleEntity = createDataEntity(\n \"practitionerrole\",\n \"PractitionerRole\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Procedure data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Procedure#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ProcedureEntity = createDataEntity(\"procedure\", \"Procedure\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Provenance data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Provenance#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ProvenanceEntity = createDataEntity(\"provenance\", \"Provenance\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Questionnaire data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Questionnaire#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const QuestionnaireEntity = createDataEntity(\n \"questionnaire\",\n \"Questionnaire\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * QuestionnaireResponse data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#QuestionnaireResponse#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const QuestionnaireResponseEntity = createDataEntity(\n \"questionnaireresponse\",\n \"QuestionnaireResponse\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * RelatedPerson data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#RelatedPerson#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const RelatedPersonEntity = createDataEntity(\n \"relatedperson\",\n \"RelatedPerson\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * RequestGroup data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#RequestGroup#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const RequestGroupEntity = createDataEntity(\n \"requestgroup\",\n \"RequestGroup\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ResearchStudy data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ResearchStudy#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ResearchStudyEntity = createDataEntity(\n \"researchstudy\",\n \"ResearchStudy\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ResearchSubject data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ResearchSubject#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ResearchSubjectEntity = createDataEntity(\n \"researchsubject\",\n \"ResearchSubject\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * RiskAssessment data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#RiskAssessment#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const RiskAssessmentEntity = createDataEntity(\n \"riskassessment\",\n \"RiskAssessment\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * RiskEvidenceSynthesis data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#RiskEvidenceSynthesis#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const RiskEvidenceSynthesisEntity = createDataEntity(\n \"riskevidencesynthesis\",\n \"RiskEvidenceSynthesis\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Schedule data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Schedule#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ScheduleEntity = createDataEntity(\"schedule\", \"Schedule\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * ServiceRequest data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#ServiceRequest#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const ServiceRequestEntity = createDataEntity(\n \"servicerequest\",\n \"ServiceRequest\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Slot data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Slot#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const SlotEntity = createDataEntity(\"slot\", \"Slot\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Specimen data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Specimen#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const SpecimenEntity = createDataEntity(\"specimen\", \"Specimen\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Subscription data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Subscription#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const SubscriptionEntity = createDataEntity(\n \"subscription\",\n \"Subscription\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Substance data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Substance#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const SubstanceEntity = createDataEntity(\"substance\", \"Substance\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * SupplyDelivery data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#SupplyDelivery#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const SupplyDeliveryEntity = createDataEntity(\n \"supplydelivery\",\n \"SupplyDelivery\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * SupplyRequest data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#SupplyRequest#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const SupplyRequestEntity = createDataEntity(\n \"supplyrequest\",\n \"SupplyRequest\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * Task data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#Task#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const TaskEntity = createDataEntity(\"task\", \"Task\");\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * VerificationResult data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#VerificationResult#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const VerificationResultEntity = createDataEntity(\n \"verificationresult\",\n \"VerificationResult\",\n);\n","import { createDataEntity } from \"../data-entity-common\";\n\n/**\n * VisionPrescription data-store entity based on FHIR R4 (single-table store).\n *\n * **Classification (ADR 2026-03-03-01):** Tenant-isolated, data plane. Strict isolation: tenantId and\n * workspaceId are required (no defaults, no sentinels). No crossover between tenants or workspaces.\n *\n * Key structure: PK = TID#<tenantId>#WID#<workspaceId>#RT#VisionPrescription#ID#<id>, SK = CURRENT.\n * Standard attributes (FHIR source and entity purpose) align with other data-plane domain resources.\n *\n * @see sites/www-docs/content/architecture/adr/2026-03-03-01-tenant-isolated-vs-non-tenant-isolated-entities.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entity-standards.md — Standard attributes (all FHIR domain resources)\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/single-table-design.md\n */\nexport const VisionPrescriptionEntity = createDataEntity(\n \"visionprescription\",\n \"VisionPrescription\",\n);\n","import type { Meta } from \"@openhi/types\";\nimport { compressResource, decompressResource } from \"../../lib/compression\";\nimport { mergeAuditIntoMeta, type MetaWithExtensions } from \"../audit-meta\";\nimport { NotFoundError } from \"../errors\";\nimport type { OpenHiContext } from \"../openhi-context\";\n\n/**\n * Sort key for the current record version. Matches Dynamo record index SK default.\n * Use this in get/update/delete (and create where applicable) for data-plane entities.\n */\nexport const DATA_ENTITY_SK = \"CURRENT\" as const;\n\n/** Base params for data-entity operations: context and optional table override. */\nexport interface BaseDataEntityParams {\n context: OpenHiContext;\n /** Optional table name override; resolved by data service from DYNAMO_TABLE_NAME when omitted. */\n tableName?: string;\n}\n\n/** Params for get-by-id and delete (context + id + optional tableName). */\nexport interface GetByIdParams extends BaseDataEntityParams {\n id: string;\n}\n\n/** Params for list (context + optional tableName). */\nexport type ListParams = BaseDataEntityParams;\n\n/** Result for create / get-by-id / update: single resource. */\nexport interface SingleResourceResult<T> {\n id: string;\n resource: T;\n}\n\n/** Entry shape for list results. */\nexport interface ListEntry<T> {\n id: string;\n resource: T;\n}\n\n/** Result for list: entries array. */\nexport interface ListResult<T> {\n entries: Array<ListEntry<T>>;\n}\n\n/** Minimal entity shape for get (used by getDataEntityById). */\ninterface EntityWithGet {\n get(params: {\n tenantId: string;\n workspaceId: string;\n id: string;\n sk: string;\n }): { go(): Promise<{ data: { id: string; resource: string } | null }> };\n}\n\n/** Minimal entity shape for delete (used by deleteDataEntityById). */\ninterface EntityWithDelete {\n delete(params: {\n tenantId: string;\n workspaceId: string;\n id: string;\n sk: string;\n }): { go(): Promise<unknown> };\n}\n\n/** Minimal entity shape for list via GSI4 (used by listDataEntitiesByWorkspace). */\ninterface EntityWithGsi4Query {\n query: {\n gsi4(params: { tenantId: string; workspaceId: string }): {\n go(): Promise<{ data: Array<{ id: string; resource: string }> | null }>;\n };\n };\n}\n\n/** Minimal entity shape for put (used by createDataEntityRecord). */\ninterface EntityWithPut {\n put(attrs: {\n sk: string;\n tenantId: string;\n workspaceId: string;\n id: string;\n resource: string;\n vid: string;\n lastUpdated: string;\n }): { go(): Promise<unknown> };\n}\n\n/** Minimal entity shape for patch (used by updateDataEntityById). */\ninterface EntityWithPatch {\n get(params: {\n tenantId: string;\n workspaceId: string;\n id: string;\n sk: string;\n }): { go(): Promise<{ data: { id: string; resource: string } | null }> };\n patch(params: {\n tenantId: string;\n workspaceId: string;\n id: string;\n sk: string;\n }): {\n set(attrs: { resource: string; lastUpdated: string }): {\n go(): Promise<unknown>;\n };\n };\n}\n\n/**\n * Get a single data-entity record by id. Decompresses and parses resource; throws NotFoundError if missing.\n * Use from get-by-id operations with the appropriate entity and resource type.\n */\nexport async function getDataEntityById<T>(\n entity: EntityWithGet,\n tenantId: string,\n workspaceId: string,\n id: string,\n resourceLabel: string,\n): Promise<SingleResourceResult<T>> {\n const result = await entity\n .get({\n tenantId,\n workspaceId,\n id,\n sk: DATA_ENTITY_SK,\n })\n .go();\n\n if (!result.data) {\n throw new NotFoundError(`${resourceLabel} ${id} not found`, {\n details: { id },\n });\n }\n\n const parsed = JSON.parse(decompressResource(result.data.resource)) as T & {\n id?: string;\n };\n return {\n id: result.data.id,\n resource: { ...parsed, id: result.data.id } as T,\n };\n}\n\n/**\n * Delete a data-entity record by id. Idempotent (no-op if not found).\n * Use from delete operations with the appropriate entity.\n */\nexport async function deleteDataEntityById(\n entity: EntityWithDelete,\n tenantId: string,\n workspaceId: string,\n id: string,\n): Promise<void> {\n await entity\n .delete({\n tenantId,\n workspaceId,\n id,\n sk: DATA_ENTITY_SK,\n })\n .go();\n}\n\n/**\n * List data-entity records in a workspace via GSI4. Decompresses and parses each resource.\n * Use from list operations with the appropriate entity and resource type.\n */\nexport async function listDataEntitiesByWorkspace<T>(\n entity: EntityWithGsi4Query,\n tenantId: string,\n workspaceId: string,\n): Promise<ListResult<T>> {\n const result = await entity.query.gsi4({ tenantId, workspaceId }).go();\n\n const items = result.data ?? [];\n const entries: Array<ListEntry<T>> = items.map((item) => {\n const parsed = JSON.parse(decompressResource(item.resource)) as T & {\n id?: string;\n };\n return {\n id: item.id,\n resource: { ...parsed, id: item.id } as T,\n };\n });\n\n return { entries };\n}\n\n/**\n * Create a data-entity record with put. Computes vid from lastUpdated (from resource meta or fallback).\n * Use from create operations (e.g. Practitioner, Encounter) that build the resource with audit in meta.\n */\nexport async function createDataEntityRecord<T>(\n entity: EntityWithPut,\n tenantId: string,\n workspaceId: string,\n id: string,\n resourceWithAudit: T & { meta?: { lastUpdated?: string } },\n fallbackDate: string,\n): Promise<SingleResourceResult<T>> {\n const lastUpdated =\n resourceWithAudit.meta?.lastUpdated ??\n fallbackDate ??\n new Date().toISOString();\n const vid =\n lastUpdated.replace(/[-:T.Z]/g, \"\").slice(0, 12) || Date.now().toString(36);\n\n await entity\n .put({\n sk: DATA_ENTITY_SK,\n tenantId,\n workspaceId,\n id,\n resource: compressResource(JSON.stringify(resourceWithAudit)),\n vid,\n lastUpdated,\n })\n .go();\n\n return {\n id,\n resource: resourceWithAudit as T,\n };\n}\n\n/**\n * Build an updated resource with audit in meta for use with updateDataEntityById.\n * Parses existing resource string for existing meta, merges body with id/resourceType/meta (versionId \"2\"),\n * then merges modified audit (modifiedDate, modifiedById, modifiedByName) into meta.\n * Use from update operations (Patient, Encounter, Practitioner) to avoid duplicating this logic.\n */\nexport function buildUpdatedResourceWithAudit<T extends { meta?: Meta }>(\n body: T,\n id: string,\n date: string,\n actorId: string,\n actorName: string,\n existingResourceStr: string,\n resourceType: string,\n): {\n resource: T & { id: string; meta: MetaWithExtensions };\n lastUpdated: string;\n} {\n const existingMeta: MetaWithExtensions | undefined = (\n JSON.parse(existingResourceStr) as { meta?: MetaWithExtensions }\n ).meta;\n\n const bodyWithMeta = body as T & { id?: string; meta?: Meta };\n const resourceWithVersion: T & { id: string; meta?: Meta } = {\n ...body,\n resourceType: resourceType as T[\"resourceType\"],\n id,\n meta: {\n ...(bodyWithMeta.meta ?? {}),\n lastUpdated: date,\n versionId: \"2\",\n },\n };\n\n const resourceWithAudit: T & { id: string; meta: MetaWithExtensions } = {\n ...resourceWithVersion,\n meta: mergeAuditIntoMeta(resourceWithVersion.meta ?? existingMeta, {\n modifiedDate: date,\n modifiedById: actorId,\n modifiedByName: actorName,\n }),\n };\n\n return {\n resource: resourceWithAudit,\n lastUpdated: date,\n };\n}\n\n/**\n * Update a data-entity record by id: get existing, throw if not found, then call builder with\n * decompressed existing resource string; builder returns { resource, lastUpdated }; then patch.\n * Use from update operations with the appropriate entity and resource type.\n */\nexport async function updateDataEntityById<T>(\n entity: EntityWithPatch,\n tenantId: string,\n workspaceId: string,\n id: string,\n resourceLabel: string,\n context: OpenHiContext,\n buildPatched: (existingResourceStr: string) => {\n resource: unknown;\n lastUpdated: string;\n },\n): Promise<SingleResourceResult<T>> {\n const existing = await entity\n .get({\n tenantId,\n workspaceId,\n id,\n sk: DATA_ENTITY_SK,\n })\n .go();\n\n if (!existing.data) {\n throw new NotFoundError(`${resourceLabel} ${id} not found`, {\n details: { id },\n });\n }\n\n const existingStr = decompressResource(existing.data.resource);\n const { resource, lastUpdated } = buildPatched(existingStr);\n\n await entity\n .patch({\n tenantId,\n workspaceId,\n id,\n sk: DATA_ENTITY_SK,\n })\n .set({\n resource: compressResource(JSON.stringify(resource)),\n lastUpdated,\n })\n .go();\n\n return {\n id,\n resource: resource as T,\n };\n}\n","import type { Encounter } from \"@openhi/types\";\nimport type { Request, Response } from \"express\";\nimport { createEncounterOperation } from \"../../../../operations/data/encounter/encounter-create-operation\";\nimport {\n BASE_PATH,\n requireJsonBodyAs,\n sendOperationOutcome500,\n} from \"../../common\";\n\n/** POST /Encounter — create: accepts Encounter in body, persists via data layer, returns 201. */\nexport async function createEncounterRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const bodyResult = requireJsonBodyAs<Encounter>(req, res);\n if (\"errorResponse\" in bodyResult) return bodyResult.errorResponse;\n\n const ctx = req.openhiContext!;\n const body = bodyResult.body;\n const encounter: Encounter = {\n ...body,\n resourceType: \"Encounter\",\n } as Encounter;\n\n try {\n const result = await createEncounterOperation({\n context: ctx,\n body: encounter,\n });\n return res\n .status(201)\n .location(`${BASE_PATH.ENCOUNTER}/${result.id}`)\n .json(result.resource);\n } catch (err: unknown) {\n return sendOperationOutcome500(res, err, \"POST Encounter error:\");\n }\n}\n","import { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type BaseDataEntityParams,\n deleteDataEntityById,\n} from \"../../data-operations-common\";\n\n/**\n * Delete an Encounter by id. No-op if the item does not exist (ElectroDB delete is idempotent).\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport interface DeleteEncounterParams extends BaseDataEntityParams {\n id: string;\n}\n\n/**\n * Deletes the current version of an Encounter. Does not throw when the encounter does not exist.\n * Throws on service errors; adapters map to HTTP/GraphQL.\n */\nexport async function deleteEncounterOperation(\n params: DeleteEncounterParams,\n): Promise<void> {\n const { context, id, tableName } = params;\n const { tenantId, workspaceId } = context;\n const service = getDynamoDataService(tableName);\n await deleteDataEntityById(\n service.entities.encounter as Parameters<typeof deleteDataEntityById>[0],\n tenantId,\n workspaceId,\n id,\n );\n}\n","import type { Request, Response } from \"express\";\nimport { deleteEncounterOperation } from \"../../../../operations/data/encounter/encounter-delete-operation\";\nimport { sendOperationOutcome500 } from \"../../common\";\n\n/** DELETE /Encounter/:id — delete: removes from data store, returns 204. */\nexport async function deleteEncounterRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n\n try {\n await deleteEncounterOperation({ context: ctx, id });\n return res.status(204).send();\n } catch (err: unknown) {\n return sendOperationOutcome500(res, err, \"DELETE Encounter error:\");\n }\n}\n","import type { Encounter } from \"@openhi/types\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type GetByIdParams,\n getDataEntityById,\n type SingleResourceResult,\n} from \"../../data-operations-common\";\n\n/**\n * Get a single Encounter by id. Throws NotFoundError if not found.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport type GetEncounterByIdParams = GetByIdParams;\n\nexport type GetEncounterByIdResult = SingleResourceResult<Encounter>;\n\n/**\n * Returns the current version of an Encounter. Throws NotFoundError when the encounter does not exist.\n */\nexport async function getEncounterByIdOperation(\n params: GetEncounterByIdParams,\n): Promise<GetEncounterByIdResult> {\n const { context, id, tableName } = params;\n const { tenantId, workspaceId } = context;\n const service = getDynamoDataService(tableName);\n return getDataEntityById<Encounter>(\n service.entities.encounter as Parameters<typeof getDataEntityById>[0],\n tenantId,\n workspaceId,\n id,\n \"Encounter\",\n );\n}\n","import type { Request, Response } from \"express\";\nimport { NotFoundError, domainErrorToHttpStatus } from \"../../../../errors\";\nimport { getEncounterByIdOperation } from \"../../../../operations/data/encounter/encounter-get-by-id-operation\";\nimport { sendOperationOutcome404, sendOperationOutcome500 } from \"../../common\";\n\n/** GET /Encounter/:id — read: returns a single Encounter resource from the data store or 404. */\nexport async function getEncounterByIdRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n\n try {\n const result = await getEncounterByIdOperation({ context: ctx, id });\n return res.json(result.resource);\n } catch (err: unknown) {\n const status = domainErrorToHttpStatus(err);\n if (status === 404) {\n const diagnostics =\n err instanceof NotFoundError\n ? err.message\n : `Encounter ${id} not found`;\n return sendOperationOutcome404(res, diagnostics);\n }\n return sendOperationOutcome500(res, err, \"GET Encounter error:\");\n }\n}\n","import type { Encounter } from \"@openhi/types\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type ListParams,\n listDataEntitiesByWorkspace,\n type ListResult,\n type ListEntry,\n} from \"../../data-operations-common\";\n\n/**\n * List encounters in a workspace (GSI4). Returns domain result for adapters to map to FHIR Bundle or other formats.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport type ListEncountersParams = ListParams;\n\nexport type EncounterListEntry = ListEntry<Encounter>;\n\nexport type ListEncountersResult = ListResult<Encounter>;\n\n/**\n * Lists all Encounters in the workspace. Uses GSI4 (Resource Type Index).\n * Throws on service errors; adapters map to HTTP/GraphQL/Step Function.\n */\nexport async function listEncountersOperation(\n params: ListEncountersParams,\n): Promise<ListEncountersResult> {\n const { context, tableName } = params;\n const { tenantId, workspaceId } = context;\n const service = getDynamoDataService(tableName);\n return listDataEntitiesByWorkspace<Encounter>(\n service.entities.encounter as Parameters<\n typeof listDataEntitiesByWorkspace\n >[0],\n tenantId,\n workspaceId,\n );\n}\n","import type { Request, Response } from \"express\";\nimport { listEncountersOperation } from \"../../../../operations/data/encounter/encounter-list-operation\";\nimport {\n BASE_PATH,\n buildSearchsetBundle,\n sendOperationOutcome500,\n} from \"../../common\";\n\n/**\n * GET /Encounter — search/list: returns a FHIR Bundle (searchset) from the data store.\n * Uses GSI4 (Resource Type Index) to list all Encounters in the workspace without a table scan.\n */\nexport async function listEncountersRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const ctx = req.openhiContext!;\n\n try {\n const result = await listEncountersOperation({ context: ctx });\n const bundle = buildSearchsetBundle(BASE_PATH.ENCOUNTER, result.entries);\n return res.json(bundle);\n } catch (err: unknown) {\n return sendOperationOutcome500(res, err, \"GET /Encounter list error:\");\n }\n}\n","import type { Encounter } from \"@openhi/types\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type BaseDataEntityParams,\n buildUpdatedResourceWithAudit,\n updateDataEntityById,\n type SingleResourceResult,\n} from \"../../data-operations-common\";\n\n/**\n * Update an Encounter by id. Throws NotFoundError if the encounter does not exist.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport interface UpdateEncounterParams extends BaseDataEntityParams {\n id: string;\n /** FHIR Encounter body (resourceType, id, meta optional). */\n body: Encounter;\n}\n\nexport type UpdateEncounterResult = SingleResourceResult<Encounter>;\n\n/**\n * Updates the current version of an Encounter. Merges audit from context into meta.\n * Throws NotFoundError when the encounter does not exist.\n */\nexport async function updateEncounterOperation(\n params: UpdateEncounterParams,\n): Promise<UpdateEncounterResult> {\n const { context, id, body, tableName } = params;\n const { tenantId, workspaceId, date, actorId, actorName } = context;\n const service = getDynamoDataService(tableName);\n\n return updateDataEntityById<Encounter>(\n service.entities.encounter as Parameters<typeof updateDataEntityById>[0],\n tenantId,\n workspaceId,\n id,\n \"Encounter\",\n context,\n (existingResourceStr) =>\n buildUpdatedResourceWithAudit<Encounter>(\n body,\n id,\n date,\n actorId,\n actorName,\n existingResourceStr,\n \"Encounter\",\n ),\n );\n}\n","import type { Encounter } from \"@openhi/types\";\nimport type { Request, Response } from \"express\";\nimport { NotFoundError, domainErrorToHttpStatus } from \"../../../../errors\";\nimport { updateEncounterOperation } from \"../../../../operations/data/encounter/encounter-update-operation\";\nimport {\n requireJsonBodyAs,\n sendOperationOutcome404,\n sendOperationOutcome500,\n} from \"../../common\";\n\n/** PUT /Encounter/:id — update: accepts Encounter in body, persists via data layer, returns 200. */\nexport async function updateEncounterRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const bodyResult = requireJsonBodyAs<Encounter>(req, res);\n if (\"errorResponse\" in bodyResult) return bodyResult.errorResponse;\n\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n const body = bodyResult.body;\n const encounter: Encounter = {\n ...body,\n resourceType: \"Encounter\",\n id,\n meta: {\n ...((body?.meta as object) ?? {}),\n lastUpdated: ctx.date,\n versionId: \"2\",\n },\n } as Encounter;\n\n try {\n const result = await updateEncounterOperation({\n context: ctx,\n id,\n body: encounter,\n });\n return res.json(result.resource);\n } catch (err: unknown) {\n const status = domainErrorToHttpStatus(err);\n if (status === 404) {\n const diagnostics =\n err instanceof NotFoundError\n ? err.message\n : `Encounter ${id} not found`;\n return sendOperationOutcome404(res, diagnostics);\n }\n return sendOperationOutcome500(res, err, \"PUT Encounter error:\");\n }\n}\n","import express from \"express\";\nimport { createPatientRoute } from \"./patient-create-route\";\nimport { deletePatientRoute } from \"./patient-delete-route\";\nimport { getPatientByIdRoute } from \"./patient-get-by-id-route\";\nimport { listPatientsRoute } from \"./patient-list-route\";\nimport { updatePatientRoute } from \"./patient-update-route\";\n\n/**\n * Patient REST router: /Patient\n * @see sites/www-docs/content/packages/@openhi/constructs/data/rest-api/routes/patient.md\n */\nconst router: express.Router = express.Router();\n\nrouter.get(\"/\", listPatientsRoute);\nrouter.get(\"/:id\", getPatientByIdRoute);\nrouter.post(\"/\", createPatientRoute);\nrouter.put(\"/:id\", updatePatientRoute);\nrouter.delete(\"/:id\", deletePatientRoute);\n\nexport { router as patientRouter };\n","import type { Meta, Patient } from \"@openhi/types\";\nimport { ulid } from \"ulid\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n patientToPutAttrs,\n type ImportPatientOptions,\n} from \"../../../import-patient\";\nimport type { OpenHiContext } from \"../../../openhi-context\";\n\n/**\n * Create a Patient. Accepts FHIR-like body and OpenHI context; returns created resource.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/operations/patient/patient-create.md\n */\nexport interface CreatePatientParams {\n context: OpenHiContext;\n /** FHIR Patient body (resourceType, id optional, meta optional). */\n body: Patient;\n /** Optional table name override; resolved by data service from DYNAMO_TABLE_NAME when omitted. */\n tableName?: string;\n}\n\nexport interface CreatePatientResult {\n id: string;\n resource: Patient;\n}\n\n/**\n * Creates a Patient. Uses patientToPutAttrs and ElectroDB put.\n * Throws on service/validation errors; adapters map to HTTP/GraphQL.\n */\nexport async function createPatientOperation(\n params: CreatePatientParams,\n): Promise<CreatePatientResult> {\n const { context, body } = params;\n const { tenantId, workspaceId, date, actorId, actorName } = context;\n const id = body.id ?? ulid();\n\n const meta: Meta = {\n ...(body.meta ?? {}),\n lastUpdated: date,\n versionId: \"1\",\n };\n\n const patient: Patient & { id: string } = {\n ...body,\n resourceType: \"Patient\",\n id,\n meta,\n };\n\n const options: ImportPatientOptions = {\n tenantId,\n workspaceId,\n createdDate: date,\n createdById: actorId,\n createdByName: actorName,\n modifiedDate: date,\n modifiedById: actorId,\n modifiedByName: actorName,\n };\n\n const service = getDynamoDataService(params.tableName);\n const attrs = patientToPutAttrs(patient, options);\n await service.entities.patient\n .put(attrs as unknown as Parameters<typeof service.entities.patient.put>[0])\n .go();\n\n return {\n id,\n resource: patient,\n };\n}\n","import { readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type { Meta } from \"@openhi/types\";\nimport { mergeAuditIntoMeta, type AuditFields } from \"./audit-meta\";\nimport { compressResource } from \"../lib/compression\";\nimport { getDynamoDataService } from \"./dynamo/dynamo-data-service\";\n\n/**\n * @see sites/www-docs/content/packages/@openhi/constructs/data/import-patient.md\n */\n\n/** Minimal FHIR Patient shape needed for import (id and resourceType required). */\ninterface FhirPatientLike {\n resourceType: string;\n id: string;\n meta?: Meta | Record<string, unknown>;\n}\n\n/** FHIR Bundle entry (e.g. Synthea transaction bundle). */\ninterface BundleEntry {\n fullUrl?: string;\n resource?: {\n resourceType?: string;\n id?: string;\n meta?: { lastUpdated?: string };\n };\n}\n\n/**\n * Extracts a Patient from parsed JSON. Accepts either:\n * - A standalone Patient resource (root has resourceType \"Patient\"), or\n * - A FHIR Bundle (e.g. Synthea transaction) — uses the first entry whose resource is a Patient.\n */\nfunction extractPatient(parsed: unknown): FhirPatientLike {\n if (parsed && typeof parsed === \"object\" && \"resourceType\" in parsed) {\n const root = parsed as {\n resourceType?: string;\n id?: string;\n meta?: { lastUpdated?: string };\n };\n if (root.resourceType === \"Patient\" && root.id) {\n return root as FhirPatientLike;\n }\n if (root.resourceType === \"Bundle\" && \"entry\" in parsed) {\n const entries = (parsed as { entry?: Array<BundleEntry> }).entry;\n if (Array.isArray(entries)) {\n const patientEntry = entries.find(\n (e) => e?.resource?.resourceType === \"Patient\" && e.resource.id,\n );\n if (patientEntry?.resource) {\n return patientEntry.resource as FhirPatientLike;\n }\n }\n }\n }\n throw new Error(\n \"File must be a FHIR Patient resource or a Bundle containing at least one Patient entry\",\n );\n}\n\nconst SK = \"CURRENT\";\n\n/** Default audit values for create/modify when importing. */\nconst defaultAudit = {\n createdDate: new Date().toISOString(),\n createdById: \"import\",\n createdByName: \"Bulk import\",\n modifiedDate: new Date().toISOString(),\n modifiedById: \"import\",\n modifiedByName: \"Bulk import\",\n};\n\nexport interface ImportPatientOptions {\n tenantId: string;\n workspaceId: string;\n tableName?: string;\n /** Audit fields at same level as tenantId/workspaceId; merged with defaults. */\n createdDate?: string;\n createdById?: string;\n createdByName?: string;\n modifiedDate?: string;\n modifiedById?: string;\n modifiedByName?: string;\n}\n\n/**\n * Maps a FHIR Patient (from JSON) to the attributes required for Patient.put().\n * Uses placeholder GSI2/GSI3 fields so ElectroDB index conditions are satisfied.\n */\nexport function patientToPutAttrs(\n patient: FhirPatientLike,\n options: ImportPatientOptions,\n): Record<string, unknown> {\n const {\n tenantId,\n workspaceId,\n createdDate,\n createdById,\n createdByName,\n modifiedDate,\n modifiedById,\n modifiedByName,\n } = options;\n const lastUpdated =\n (patient.meta?.lastUpdated as string | undefined) ??\n modifiedDate ??\n defaultAudit.modifiedDate ??\n new Date().toISOString();\n const auditMerged: AuditFields = {\n ...defaultAudit,\n ...(createdDate != null && { createdDate }),\n ...(createdById != null && { createdById }),\n ...(createdByName != null && { createdByName }),\n ...(modifiedDate != null && { modifiedDate }),\n ...(modifiedById != null && { modifiedById }),\n ...(modifiedByName != null && { modifiedByName }),\n };\n\n const patientWithMeta = {\n ...patient,\n meta: mergeAuditIntoMeta(patient.meta, auditMerged),\n };\n if (lastUpdated && !patientWithMeta.meta.lastUpdated) {\n (patientWithMeta.meta as Record<string, unknown>).lastUpdated = lastUpdated;\n }\n\n return {\n sk: SK,\n tenantId,\n workspaceId,\n id: patient.id,\n resource: compressResource(JSON.stringify(patientWithMeta)),\n vid:\n lastUpdated.replace(/[-:T.Z]/g, \"\").slice(0, 12) ||\n Date.now().toString(36),\n lastUpdated,\n identifierSystem: \"\",\n identifierValue: \"\",\n facilityId: \"\",\n normalizedName: \"\",\n };\n}\n\n/**\n * Reads a single Patient JSON file and imports it into the FHIR store.\n * Table name: options.tableName is passed through; data service resolves from DYNAMO_TABLE_NAME when omitted.\n */\nexport async function importPatientFromFile(\n filePath: string,\n options: ImportPatientOptions,\n): Promise<{ id: string; tenantId: string; workspaceId: string }> {\n const resolved = resolve(filePath);\n const raw = readFileSync(resolved, \"utf-8\");\n const parsed: unknown = JSON.parse(raw);\n const patient = extractPatient(parsed);\n\n const service = getDynamoDataService(options.tableName);\n const attrs = patientToPutAttrs(patient, options);\n\n const result = await service.entities.patient\n .put(attrs as unknown as Parameters<typeof service.entities.patient.put>[0])\n .go();\n\n const data = (\n result as { data?: { id: string; tenantId: string; workspaceId: string } }\n ).data;\n if (!data) {\n throw new Error(`Put failed for Patient ${patient.id}`);\n }\n\n return {\n id: data.id,\n tenantId: data.tenantId,\n workspaceId: data.workspaceId,\n };\n}\n\n/** Run as script: node/ts-node import-patient.ts <path-to-patient.json> [tenantId] [workspaceId] */\nasync function main(): Promise<void> {\n const [, , fileArg, tenantId = \"tenant-1\", workspaceId = \"ws-1\"] =\n process.argv;\n\n if (!fileArg) {\n console.error(\n \"Usage: import-patient.ts <path-to-patient.json> [tenantId] [workspaceId]\",\n );\n process.exit(1);\n }\n\n try {\n const result = await importPatientFromFile(fileArg, {\n tenantId,\n workspaceId,\n });\n console.log(\n `Imported Patient ${result.id} (tenant=${result.tenantId}, workspace=${result.workspaceId})`,\n );\n } catch (err) {\n console.error(err);\n process.exit(1);\n }\n}\n\nif (require.main === module) {\n void main();\n}\n","import type { Patient } from \"@openhi/types\";\nimport type { Request, Response } from \"express\";\nimport { createPatientOperation } from \"../../../../operations/data/patient/patient-create-operation\";\nimport {\n BASE_PATH,\n requireJsonBodyAs,\n sendOperationOutcome500,\n} from \"../../common\";\n\n/** POST /Patient — create: accepts Patient in body, persists via data layer, returns 201. */\nexport async function createPatientRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const bodyResult = requireJsonBodyAs<Patient>(req, res);\n if (\"errorResponse\" in bodyResult) return bodyResult.errorResponse;\n\n const ctx = req.openhiContext!;\n const body = bodyResult.body;\n const patient: Patient = {\n ...body,\n resourceType: \"Patient\",\n } as Patient;\n\n try {\n const result = await createPatientOperation({\n context: ctx,\n body: patient,\n });\n return res\n .status(201)\n .location(`${BASE_PATH.PATIENT}/${result.id}`)\n .json(result.resource);\n } catch (err: unknown) {\n return sendOperationOutcome500(res, err, \"POST Patient error:\");\n }\n}\n","import { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type BaseDataEntityParams,\n deleteDataEntityById,\n} from \"../../data-operations-common\";\n\n/**\n * Delete a Patient by id. No-op if the item does not exist (ElectroDB delete is idempotent).\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport interface DeletePatientParams extends BaseDataEntityParams {\n id: string;\n}\n\n/**\n * Deletes the current version of a Patient. Does not throw when the patient does not exist.\n * Throws on service errors; adapters map to HTTP/GraphQL.\n */\nexport async function deletePatientOperation(\n params: DeletePatientParams,\n): Promise<void> {\n const { context, id, tableName } = params;\n const { tenantId, workspaceId } = context;\n const service = getDynamoDataService(tableName);\n await deleteDataEntityById(\n service.entities.patient as Parameters<typeof deleteDataEntityById>[0],\n tenantId,\n workspaceId,\n id,\n );\n}\n","import type { Request, Response } from \"express\";\nimport { deletePatientOperation } from \"../../../../operations/data/patient/patient-delete-operation\";\nimport { sendOperationOutcome500 } from \"../../common\";\n\n/** DELETE /Patient/:id — delete: removes from data store, returns 204. */\nexport async function deletePatientRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n\n try {\n await deletePatientOperation({ context: ctx, id });\n return res.status(204).send();\n } catch (err: unknown) {\n return sendOperationOutcome500(res, err, \"DELETE Patient error:\");\n }\n}\n","import type { Patient } from \"@openhi/types\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type GetByIdParams,\n getDataEntityById,\n type SingleResourceResult,\n} from \"../../data-operations-common\";\n\n/**\n * Get a single Patient by id. Throws NotFoundError if not found.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport type GetPatientByIdParams = GetByIdParams;\n\nexport type GetPatientByIdResult = SingleResourceResult<Patient>;\n\n/**\n * Returns the current version of a Patient. Throws NotFoundError when the patient does not exist.\n */\nexport async function getPatientByIdOperation(\n params: GetPatientByIdParams,\n): Promise<GetPatientByIdResult> {\n const { context, id, tableName } = params;\n const { tenantId, workspaceId } = context;\n const service = getDynamoDataService(tableName);\n return getDataEntityById<Patient>(\n service.entities.patient as Parameters<typeof getDataEntityById>[0],\n tenantId,\n workspaceId,\n id,\n \"Patient\",\n );\n}\n","import type { Request, Response } from \"express\";\nimport { NotFoundError, domainErrorToHttpStatus } from \"../../../../errors\";\nimport { getPatientByIdOperation } from \"../../../../operations/data/patient/patient-get-by-id-operation\";\nimport { sendOperationOutcome404, sendOperationOutcome500 } from \"../../common\";\n\n/** GET /Patient/:id — read: returns a single Patient resource from the data store or 404. */\nexport async function getPatientByIdRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n\n try {\n const result = await getPatientByIdOperation({ context: ctx, id });\n return res.json(result.resource);\n } catch (err: unknown) {\n const status = domainErrorToHttpStatus(err);\n if (status === 404) {\n const diagnostics =\n err instanceof NotFoundError ? err.message : `Patient ${id} not found`;\n return sendOperationOutcome404(res, diagnostics);\n }\n return sendOperationOutcome500(res, err, \"GET Patient error:\");\n }\n}\n","import type { Patient } from \"@openhi/types\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type ListParams,\n listDataEntitiesByWorkspace,\n type ListResult,\n type ListEntry,\n} from \"../../data-operations-common\";\n\n/**\n * List patients in a workspace (GSI4). Returns domain result for adapters to map to FHIR Bundle or other formats.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport type ListPatientsParams = ListParams;\n\nexport type PatientListEntry = ListEntry<Patient>;\n\nexport type ListPatientsResult = ListResult<Patient>;\n\n/**\n * Lists all Patients in the workspace. Uses GSI4 (Resource Type Index).\n * Throws on service errors; adapters map to HTTP/GraphQL/Step Function.\n */\nexport async function listPatientsOperation(\n params: ListPatientsParams,\n): Promise<ListPatientsResult> {\n const { context, tableName } = params;\n const { tenantId, workspaceId } = context;\n const service = getDynamoDataService(tableName);\n return listDataEntitiesByWorkspace<Patient>(\n service.entities.patient as Parameters<\n typeof listDataEntitiesByWorkspace\n >[0],\n tenantId,\n workspaceId,\n );\n}\n","import type { Request, Response } from \"express\";\nimport { listPatientsOperation } from \"../../../../operations/data/patient/patient-list-operation\";\nimport {\n BASE_PATH,\n buildSearchsetBundle,\n sendOperationOutcome500,\n} from \"../../common\";\n\n/**\n * GET /Patient — search/list: returns a FHIR Bundle (searchset) from the data store.\n * Uses GSI4 (Resource Type Index) to list all Patients in the workspace without a table scan.\n */\nexport async function listPatientsRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const ctx = req.openhiContext!;\n\n try {\n const result = await listPatientsOperation({ context: ctx });\n const bundle = buildSearchsetBundle(BASE_PATH.PATIENT, result.entries);\n return res.json(bundle);\n } catch (err: unknown) {\n return sendOperationOutcome500(res, err, \"GET /Patient list error:\");\n }\n}\n","import type { Patient } from \"@openhi/types\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type BaseDataEntityParams,\n buildUpdatedResourceWithAudit,\n updateDataEntityById,\n type SingleResourceResult,\n} from \"../../data-operations-common\";\n\n/**\n * Update a Patient by id. Throws NotFoundError if the patient does not exist.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport interface UpdatePatientParams extends BaseDataEntityParams {\n id: string;\n /** FHIR Patient body (resourceType, id, meta optional). */\n body: Patient;\n}\n\nexport type UpdatePatientResult = SingleResourceResult<Patient>;\n\n/**\n * Updates the current version of a Patient. Merges audit from context into meta.\n * Throws NotFoundError when the patient does not exist.\n */\nexport async function updatePatientOperation(\n params: UpdatePatientParams,\n): Promise<UpdatePatientResult> {\n const { context, id, body, tableName } = params;\n const { tenantId, workspaceId, date, actorId, actorName } = context;\n const service = getDynamoDataService(tableName);\n\n return updateDataEntityById<Patient>(\n service.entities.patient as Parameters<typeof updateDataEntityById>[0],\n tenantId,\n workspaceId,\n id,\n \"Patient\",\n context,\n (existingResourceStr) =>\n buildUpdatedResourceWithAudit<Patient>(\n body,\n id,\n date,\n actorId,\n actorName,\n existingResourceStr,\n \"Patient\",\n ),\n );\n}\n","import type { Patient } from \"@openhi/types\";\nimport type { Request, Response } from \"express\";\nimport { NotFoundError, domainErrorToHttpStatus } from \"../../../../errors\";\nimport { updatePatientOperation } from \"../../../../operations/data/patient/patient-update-operation\";\nimport {\n requireJsonBodyAs,\n sendOperationOutcome404,\n sendOperationOutcome500,\n} from \"../../common\";\n\n/** PUT /Patient/:id — update: accepts Patient in body, persists via data store, returns 200. */\nexport async function updatePatientRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const bodyResult = requireJsonBodyAs<Patient>(req, res);\n if (\"errorResponse\" in bodyResult) return bodyResult.errorResponse;\n\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n const body = bodyResult.body;\n const patient: Patient = {\n ...body,\n resourceType: \"Patient\",\n id,\n } as Patient;\n\n try {\n const result = await updatePatientOperation({\n context: ctx,\n id,\n body: patient,\n });\n return res.json(result.resource);\n } catch (err: unknown) {\n const status = domainErrorToHttpStatus(err);\n if (status === 404) {\n const diagnostics =\n err instanceof NotFoundError ? err.message : `Patient ${id} not found`;\n return sendOperationOutcome404(res, diagnostics);\n }\n return sendOperationOutcome500(res, err, \"PUT Patient error:\");\n }\n}\n","import express from \"express\";\nimport { createPractitionerRoute } from \"./practitioner-create-route\";\nimport { deletePractitionerRoute } from \"./practitioner-delete-route\";\nimport { getPractitionerByIdRoute } from \"./practitioner-get-by-id-route\";\nimport { listPractitionersRoute } from \"./practitioner-list-route\";\nimport { updatePractitionerRoute } from \"./practitioner-update-route\";\n\n/**\n * Practitioner REST router: /Practitioner\n * FHIR R4 Practitioner resource; same pattern as Patient and Encounter routes.\n */\nconst router: express.Router = express.Router();\n\nrouter.get(\"/\", listPractitionersRoute);\nrouter.get(\"/:id\", getPractitionerByIdRoute);\nrouter.post(\"/\", createPractitionerRoute);\nrouter.put(\"/:id\", updatePractitionerRoute);\nrouter.delete(\"/:id\", deletePractitionerRoute);\n\nexport { router as practitionerRouter };\n","import type { Meta, Practitioner } from \"@openhi/types\";\nimport { ulid } from \"ulid\";\nimport {\n mergeAuditIntoMeta,\n type MetaWithExtensions,\n} from \"../../../audit-meta\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport type { OpenHiContext } from \"../../../openhi-context\";\nimport {\n createDataEntityRecord,\n type SingleResourceResult,\n} from \"../../data-operations-common\";\n\n/**\n * Create a Practitioner. Accepts FHIR-like body and OpenHI context; returns created resource.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n * @see sites/www-docs/content/packages/@openhi/constructs/data/dynamo/entities/practitioner.md\n */\nexport interface CreatePractitionerParams {\n context: OpenHiContext;\n /** FHIR Practitioner body (resourceType, id optional, meta optional). */\n body: Practitioner;\n /** Optional table name override; resolved by data service from DYNAMO_TABLE_NAME when omitted. */\n tableName?: string;\n}\n\nexport type CreatePractitionerResult = SingleResourceResult<Practitioner>;\n\n/**\n * Creates a Practitioner. Builds put attrs with audit in meta, then ElectroDB put.\n * Throws on service/validation errors; adapters map to HTTP/GraphQL.\n */\nexport async function createPractitionerOperation(\n params: CreatePractitionerParams,\n): Promise<CreatePractitionerResult> {\n const { context, body, tableName } = params;\n const { tenantId, workspaceId, date, actorId, actorName } = context;\n const id = body.id ?? ulid();\n\n const meta: Meta = {\n ...(body.meta ?? {}),\n lastUpdated: date,\n versionId: \"1\",\n };\n\n const practitionerWithAudit: Practitioner & {\n id: string;\n meta: MetaWithExtensions;\n } = {\n ...body,\n resourceType: \"Practitioner\",\n id,\n meta: mergeAuditIntoMeta(meta, {\n createdDate: date,\n createdById: actorId,\n createdByName: actorName,\n modifiedDate: date,\n modifiedById: actorId,\n modifiedByName: actorName,\n }),\n };\n\n const service = getDynamoDataService(tableName);\n return createDataEntityRecord<Practitioner>(\n service.entities.practitioner as Parameters<\n typeof createDataEntityRecord\n >[0],\n tenantId,\n workspaceId,\n id,\n practitionerWithAudit,\n date,\n );\n}\n","import type { Practitioner } from \"@openhi/types\";\nimport type { Request, Response } from \"express\";\nimport { createPractitionerOperation } from \"../../../../operations/data/practitioner/practitioner-create-operation\";\nimport {\n BASE_PATH,\n requireJsonBodyAs,\n sendOperationOutcome500,\n} from \"../../common\";\n\n/** POST /Practitioner — create: accepts Practitioner in body, persists via data layer, returns 201. */\nexport async function createPractitionerRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const bodyResult = requireJsonBodyAs<Practitioner>(req, res);\n if (\"errorResponse\" in bodyResult) return bodyResult.errorResponse;\n\n const ctx = req.openhiContext!;\n const body = bodyResult.body;\n const practitioner: Practitioner = {\n ...body,\n resourceType: \"Practitioner\",\n } as Practitioner;\n\n try {\n const result = await createPractitionerOperation({\n context: ctx,\n body: practitioner,\n });\n return res\n .status(201)\n .location(`${BASE_PATH.PRACTITIONER}/${result.id}`)\n .json(result.resource);\n } catch (err: unknown) {\n return sendOperationOutcome500(res, err, \"POST Practitioner error:\");\n }\n}\n","import { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type BaseDataEntityParams,\n deleteDataEntityById,\n} from \"../../data-operations-common\";\n\n/**\n * Delete a Practitioner by id. No-op if the item does not exist (ElectroDB delete is idempotent).\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport interface DeletePractitionerParams extends BaseDataEntityParams {\n id: string;\n}\n\n/**\n * Deletes the current version of a Practitioner. Does not throw when the practitioner does not exist.\n * Throws on service errors; adapters map to HTTP/GraphQL.\n */\nexport async function deletePractitionerOperation(\n params: DeletePractitionerParams,\n): Promise<void> {\n const { context, id, tableName } = params;\n const { tenantId, workspaceId } = context;\n const service = getDynamoDataService(tableName);\n await deleteDataEntityById(\n service.entities.practitioner as Parameters<typeof deleteDataEntityById>[0],\n tenantId,\n workspaceId,\n id,\n );\n}\n","import type { Request, Response } from \"express\";\nimport { deletePractitionerOperation } from \"../../../../operations/data/practitioner/practitioner-delete-operation\";\nimport { sendOperationOutcome500 } from \"../../common\";\n\n/** DELETE /Practitioner/:id — delete: removes from data store, returns 204. */\nexport async function deletePractitionerRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n\n try {\n await deletePractitionerOperation({ context: ctx, id });\n return res.status(204).send();\n } catch (err: unknown) {\n return sendOperationOutcome500(res, err, \"DELETE Practitioner error:\");\n }\n}\n","import type { Practitioner } from \"@openhi/types\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type GetByIdParams,\n getDataEntityById,\n type SingleResourceResult,\n} from \"../../data-operations-common\";\n\n/**\n * Get a single Practitioner by id. Throws NotFoundError if not found.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport type GetPractitionerByIdParams = GetByIdParams;\n\nexport type GetPractitionerByIdResult = SingleResourceResult<Practitioner>;\n\n/**\n * Returns the current version of a Practitioner. Throws NotFoundError when the practitioner does not exist.\n */\nexport async function getPractitionerByIdOperation(\n params: GetPractitionerByIdParams,\n): Promise<GetPractitionerByIdResult> {\n const { context, id, tableName } = params;\n const { tenantId, workspaceId } = context;\n const service = getDynamoDataService(tableName);\n return getDataEntityById<Practitioner>(\n service.entities.practitioner as Parameters<typeof getDataEntityById>[0],\n tenantId,\n workspaceId,\n id,\n \"Practitioner\",\n );\n}\n","import type { Request, Response } from \"express\";\nimport { NotFoundError, domainErrorToHttpStatus } from \"../../../../errors\";\nimport { getPractitionerByIdOperation } from \"../../../../operations/data/practitioner/practitioner-get-by-id-operation\";\nimport { sendOperationOutcome404, sendOperationOutcome500 } from \"../../common\";\n\n/** GET /Practitioner/:id — read: returns a single Practitioner resource from the data store or 404. */\nexport async function getPractitionerByIdRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n\n try {\n const result = await getPractitionerByIdOperation({ context: ctx, id });\n return res.json(result.resource);\n } catch (err: unknown) {\n const status = domainErrorToHttpStatus(err);\n if (status === 404) {\n const diagnostics =\n err instanceof NotFoundError\n ? err.message\n : `Practitioner ${id} not found`;\n return sendOperationOutcome404(res, diagnostics);\n }\n return sendOperationOutcome500(res, err, \"GET Practitioner error:\");\n }\n}\n","import type { Practitioner } from \"@openhi/types\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type ListParams,\n listDataEntitiesByWorkspace,\n type ListResult,\n type ListEntry,\n} from \"../../data-operations-common\";\n\n/**\n * List practitioners in a workspace (GSI4). Returns domain result for adapters to map to FHIR Bundle or other formats.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport type ListPractitionersParams = ListParams;\n\nexport type PractitionerListEntry = ListEntry<Practitioner>;\n\nexport type ListPractitionersResult = ListResult<Practitioner>;\n\n/**\n * Lists all Practitioners in the workspace. Uses GSI4 (Resource Type Index).\n * Throws on service errors; adapters map to HTTP/GraphQL/Step Function.\n */\nexport async function listPractitionersOperation(\n params: ListPractitionersParams,\n): Promise<ListPractitionersResult> {\n const { context, tableName } = params;\n const { tenantId, workspaceId } = context;\n const service = getDynamoDataService(tableName);\n return listDataEntitiesByWorkspace<Practitioner>(\n service.entities.practitioner as Parameters<\n typeof listDataEntitiesByWorkspace\n >[0],\n tenantId,\n workspaceId,\n );\n}\n","import type { Request, Response } from \"express\";\nimport { listPractitionersOperation } from \"../../../../operations/data/practitioner/practitioner-list-operation\";\nimport {\n BASE_PATH,\n buildSearchsetBundle,\n sendOperationOutcome500,\n} from \"../../common\";\n\n/**\n * GET /Practitioner — search/list: returns a FHIR Bundle (searchset) from the data store.\n * Uses GSI4 (Resource Type Index) to list all Practitioners in the workspace without a table scan.\n */\nexport async function listPractitionersRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const ctx = req.openhiContext!;\n\n try {\n const result = await listPractitionersOperation({ context: ctx });\n const bundle = buildSearchsetBundle(BASE_PATH.PRACTITIONER, result.entries);\n return res.json(bundle);\n } catch (err: unknown) {\n return sendOperationOutcome500(res, err, \"GET /Practitioner list error:\");\n }\n}\n","import type { Practitioner } from \"@openhi/types\";\nimport { getDynamoDataService } from \"../../../dynamo/dynamo-data-service\";\nimport {\n type BaseDataEntityParams,\n buildUpdatedResourceWithAudit,\n updateDataEntityById,\n type SingleResourceResult,\n} from \"../../data-operations-common\";\n\n/**\n * Update a Practitioner by id. Throws NotFoundError if the practitioner does not exist.\n *\n * @see sites/www-docs/content/packages/@openhi/constructs/data/shared-data-layer-layout.md\n */\nexport interface UpdatePractitionerParams extends BaseDataEntityParams {\n id: string;\n /** FHIR Practitioner body (resourceType, id, meta optional). */\n body: Practitioner;\n}\n\nexport type UpdatePractitionerResult = SingleResourceResult<Practitioner>;\n\n/**\n * Updates the current version of a Practitioner. Merges audit from context into meta.\n * Throws NotFoundError when the practitioner does not exist.\n */\nexport async function updatePractitionerOperation(\n params: UpdatePractitionerParams,\n): Promise<UpdatePractitionerResult> {\n const { context, id, body, tableName } = params;\n const { tenantId, workspaceId, date, actorId, actorName } = context;\n const service = getDynamoDataService(tableName);\n\n return updateDataEntityById<Practitioner>(\n service.entities.practitioner as Parameters<typeof updateDataEntityById>[0],\n tenantId,\n workspaceId,\n id,\n \"Practitioner\",\n context,\n (existingResourceStr) =>\n buildUpdatedResourceWithAudit<Practitioner>(\n body,\n id,\n date,\n actorId,\n actorName,\n existingResourceStr,\n \"Practitioner\",\n ),\n );\n}\n","import type { Practitioner } from \"@openhi/types\";\nimport type { Request, Response } from \"express\";\nimport { NotFoundError, domainErrorToHttpStatus } from \"../../../../errors\";\nimport { updatePractitionerOperation } from \"../../../../operations/data/practitioner/practitioner-update-operation\";\nimport {\n requireJsonBodyAs,\n sendOperationOutcome404,\n sendOperationOutcome500,\n} from \"../../common\";\n\n/** PUT /Practitioner/:id — update: accepts Practitioner in body, persists via data layer, returns 200. */\nexport async function updatePractitionerRoute(\n req: Request,\n res: Response,\n): Promise<Response> {\n const bodyResult = requireJsonBodyAs<Practitioner>(req, res);\n if (\"errorResponse\" in bodyResult) return bodyResult.errorResponse;\n\n const id = String(req.params.id);\n const ctx = req.openhiContext!;\n const body = bodyResult.body;\n const practitioner: Practitioner = {\n ...body,\n resourceType: \"Practitioner\",\n id,\n meta: {\n ...((body?.meta as object) ?? {}),\n lastUpdated: ctx.date,\n versionId: \"2\",\n },\n } as Practitioner;\n\n try {\n const result = await updatePractitionerOperation({\n context: ctx,\n id,\n body: practitioner,\n });\n return res.json(result.resource);\n } catch (err: unknown) {\n const status = domainErrorToHttpStatus(err);\n if (status === 404) {\n const diagnostics =\n err instanceof NotFoundError\n ? err.message\n : `Practitioner ${id} not found`;\n return sendOperationOutcome404(res, diagnostics);\n }\n return sendOperationOutcome500(res, err, \"PUT Practitioner error:\");\n }\n}\n"],"mappings":"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","names":["import_serverless_express","import_node_path","import_express","envelope","import_electrodb","SK","SK","BASE_PATH","SK","express","import_express","import_electrodb","import_electrodb","router","express","import_express","import_ulid","SK","router","express","import_express","import_ulid","router","express","express","path","router","serverlessExpress"]}
|