@openhi/constructs 0.0.0 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/lib/chunk-LZOMFHX3.mjs +38 -0
  2. package/lib/chunk-LZOMFHX3.mjs.map +1 -0
  3. package/lib/index.d.mts +788 -0
  4. package/lib/index.d.ts +869 -3
  5. package/lib/index.js +1318 -19
  6. package/lib/index.js.map +1 -0
  7. package/lib/index.mjs +1303 -0
  8. package/lib/index.mjs.map +1 -0
  9. package/lib/rest-api-lambda.handler.d.mts +6 -0
  10. package/lib/rest-api-lambda.handler.d.ts +6 -0
  11. package/lib/rest-api-lambda.handler.js +677 -0
  12. package/lib/rest-api-lambda.handler.js.map +1 -0
  13. package/lib/rest-api-lambda.handler.mjs +646 -0
  14. package/lib/rest-api-lambda.handler.mjs.map +1 -0
  15. package/package.json +37 -28
  16. package/lib/app/index.d.ts +0 -4
  17. package/lib/app/index.js +0 -21
  18. package/lib/app/open-hi-app.d.ts +0 -85
  19. package/lib/app/open-hi-app.js +0 -127
  20. package/lib/app/open-hi-environment.d.ts +0 -59
  21. package/lib/app/open-hi-environment.js +0 -72
  22. package/lib/app/open-hi-service.d.ts +0 -169
  23. package/lib/app/open-hi-service.js +0 -195
  24. package/lib/app/open-hi-stage.d.ts +0 -71
  25. package/lib/app/open-hi-stage.js +0 -70
  26. package/lib/components/acm/root-wildcard-certificate.d.ts +0 -15
  27. package/lib/components/acm/root-wildcard-certificate.js +0 -35
  28. package/lib/components/api-gateway/core-http-api.d.ts +0 -10
  29. package/lib/components/api-gateway/core-http-api.js +0 -44
  30. package/lib/components/api-gateway/http-lambda-integration-no-permissions.d.ts +0 -18
  31. package/lib/components/api-gateway/http-lambda-integration-no-permissions.js +0 -26
  32. package/lib/components/app-sync/core-graphql-api.d.ts +0 -12
  33. package/lib/components/app-sync/core-graphql-api.js +0 -54
  34. package/lib/components/auth.d.ts +0 -75
  35. package/lib/components/auth.js +0 -100
  36. package/lib/components/cognito/core-user-pool-client.d.ts +0 -10
  37. package/lib/components/cognito/core-user-pool-client.js +0 -47
  38. package/lib/components/cognito/core-user-pool-domain.d.ts +0 -10
  39. package/lib/components/cognito/core-user-pool-domain.js +0 -41
  40. package/lib/components/cognito/core-user-pool-kms-key.d.ts +0 -10
  41. package/lib/components/cognito/core-user-pool-kms-key.js +0 -37
  42. package/lib/components/cognito/core-user-pool.d.ts +0 -10
  43. package/lib/components/cognito/core-user-pool.js +0 -54
  44. package/lib/components/core.d.ts +0 -102
  45. package/lib/components/core.js +0 -79
  46. package/lib/components/dynamodb/dynamo-db-data-store.d.ts +0 -33
  47. package/lib/components/dynamodb/dynamo-db-data-store.js +0 -107
  48. package/lib/components/event-bridge/data-event-bus.d.ts +0 -19
  49. package/lib/components/event-bridge/data-event-bus.js +0 -34
  50. package/lib/components/event-bridge/ops-event-bus.d.ts +0 -19
  51. package/lib/components/event-bridge/ops-event-bus.js +0 -34
  52. package/lib/components/global.d.ts +0 -36
  53. package/lib/components/global.js +0 -63
  54. package/lib/components/index.d.ts +0 -1
  55. package/lib/components/index.js +0 -18
  56. package/lib/components/route-53/child-hosted-zone.d.ts +0 -20
  57. package/lib/components/route-53/child-hosted-zone.js +0 -48
  58. package/lib/components/route-53/root-hosted-zone.d.ts +0 -10
  59. package/lib/components/route-53/root-hosted-zone.js +0 -20
  60. package/lib/components/ssm/discoverable-string-parameter.d.ts +0 -59
  61. package/lib/components/ssm/discoverable-string-parameter.js +0 -50
  62. package/lib/components/ssm/index.d.ts +0 -1
  63. package/lib/components/ssm/index.js +0 -18
  64. package/lib/data/dynamo/ehr/r4/Patient.d.ts +0 -180
  65. package/lib/data/dynamo/ehr/r4/Patient.js +0 -192
  66. package/lib/data/dynamo/ehr/r4/ehr-r4-data-service.d.ts +0 -162
  67. package/lib/data/dynamo/ehr/r4/ehr-r4-data-service.js +0 -37
  68. package/lib/data/hello-world.d.ts +0 -39
  69. package/lib/data/hello-world.js +0 -59
  70. package/lib/data/import-patient-with-dynalite.d.ts +0 -1
  71. package/lib/data/import-patient-with-dynalite.js +0 -87
  72. package/lib/data/import-patient.d.ts +0 -47
  73. package/lib/data/import-patient.js +0 -158
  74. package/lib/data/lambda/rest-api-lambda.d.ts +0 -13
  75. package/lib/data/lambda/rest-api-lambda.handler.d.ts +0 -1
  76. package/lib/data/lambda/rest-api-lambda.handler.js +0 -10
  77. package/lib/data/lambda/rest-api-lambda.js +0 -22
  78. package/lib/data/middleware/open-hi-context.d.ts +0 -13
  79. package/lib/data/middleware/open-hi-context.js +0 -31
  80. package/lib/data/rest-api/ehr/r4/Patient.d.ts +0 -16
  81. package/lib/data/rest-api/ehr/r4/Patient.js +0 -234
  82. package/lib/data/rest-api/rest-api-local.d.ts +0 -1
  83. package/lib/data/rest-api/rest-api-local.js +0 -8
  84. package/lib/data/rest-api/rest-api-mockdata.d.ts +0 -7
  85. package/lib/data/rest-api/rest-api-mockdata.js +0 -585
  86. package/lib/data/rest-api/rest-api.d.ts +0 -3
  87. package/lib/data/rest-api/rest-api.js +0 -26
  88. package/lib/lib/compression.d.ts +0 -27
  89. package/lib/lib/compression.js +0 -87
  90. package/lib/services/index.d.ts +0 -5
  91. package/lib/services/index.js +0 -22
  92. package/lib/services/open-hi-auth-service.d.ts +0 -31
  93. package/lib/services/open-hi-auth-service.js +0 -31
  94. package/lib/services/open-hi-core-service.d.ts +0 -15
  95. package/lib/services/open-hi-core-service.js +0 -38
  96. package/lib/services/open-hi-data-service.d.ts +0 -18
  97. package/lib/services/open-hi-data-service.js +0 -18
  98. package/lib/services/open-hi-global-service.d.ts +0 -15
  99. package/lib/services/open-hi-global-service.js +0 -44
  100. package/lib/services/open-hi-rest-api-service.d.ts +0 -17
  101. package/lib/services/open-hi-rest-api-service.js +0 -107
@@ -1,10 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.handler = void 0;
7
- const serverless_express_1 = __importDefault(require("@codegenie/serverless-express"));
8
- const rest_api_1 = require("../rest-api/rest-api");
9
- exports.handler = (0, serverless_express_1.default)({ app: rest_api_1.app });
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC1hcGktbGFtYmRhLmhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YS9sYW1iZGEvcmVzdC1hcGktbGFtYmRhLmhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsdUZBQThEO0FBQzlELG1EQUEyQztBQUU5QixRQUFBLE9BQU8sR0FBRyxJQUFBLDRCQUFpQixFQUFDLEVBQUUsR0FBRyxFQUFILGNBQUcsRUFBRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2VydmVybGVzc0V4cHJlc3MgZnJvbSBcIkBjb2RlZ2VuaWUvc2VydmVybGVzcy1leHByZXNzXCI7XG5pbXBvcnQgeyBhcHAgfSBmcm9tIFwiLi4vcmVzdC1hcGkvcmVzdC1hcGlcIjtcblxuZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSBzZXJ2ZXJsZXNzRXhwcmVzcyh7IGFwcCB9KTtcbiJdfQ==
@@ -1,22 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RestApiLambda = void 0;
4
- const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
5
- const aws_lambda_nodejs_1 = require("aws-cdk-lib/aws-lambda-nodejs");
6
- const constructs_1 = require("constructs");
7
- class RestApiLambda extends constructs_1.Construct {
8
- constructor(scope, props) {
9
- super(scope, "rest-api-lambda");
10
- /**
11
- * Create a Lambda function
12
- */
13
- this.lambda = new aws_lambda_nodejs_1.NodejsFunction(this, "handler", {
14
- runtime: aws_lambda_1.Runtime.NODEJS_LATEST,
15
- environment: {
16
- DYNAMO_TABLE_NAME: props.dynamoTableName,
17
- },
18
- });
19
- }
20
- }
21
- exports.RestApiLambda = RestApiLambda;
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC1hcGktbGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RhdGEvbGFtYmRhL3Jlc3QtYXBpLWxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1REFBaUQ7QUFDakQscUVBQStEO0FBQy9ELDJDQUF1QztBQVV2QyxNQUFhLGFBQWMsU0FBUSxzQkFBUztJQUcxQyxZQUFZLEtBQWdCLEVBQUUsS0FBeUI7UUFDckQsS0FBSyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBRWhDOztXQUVHO1FBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGtDQUFjLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRTtZQUNoRCxPQUFPLEVBQUUsb0JBQU8sQ0FBQyxhQUFhO1lBQzlCLFdBQVcsRUFBRTtnQkFDWCxpQkFBaUIsRUFBRSxLQUFLLENBQUMsZUFBZTthQUN6QztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQWhCRCxzQ0FnQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSdW50aW1lIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7IE5vZGVqc0Z1bmN0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RBcGlMYW1iZGFQcm9wcyB7XG4gIC8qKlxuICAgKiBEeW5hbW9EQiB0YWJsZSBuYW1lIGZvciB0aGUgZGF0YSBzdG9yZS4gVGhlIExhbWJkYSByZWNlaXZlcyBpdCBhcyB0aGVcbiAgICogZW52aXJvbm1lbnQgdmFyaWFibGUgRFlOQU1PX1RBQkxFX05BTUUgYXQgcnVudGltZS5cbiAgICovXG4gIHJlYWRvbmx5IGR5bmFtb1RhYmxlTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUmVzdEFwaUxhbWJkYSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyByZWFkb25seSBsYW1iZGE6IE5vZGVqc0Z1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIHByb3BzOiBSZXN0QXBpTGFtYmRhUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgXCJyZXN0LWFwaS1sYW1iZGFcIik7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBMYW1iZGEgZnVuY3Rpb25cbiAgICAgKi9cbiAgICB0aGlzLmxhbWJkYSA9IG5ldyBOb2RlanNGdW5jdGlvbih0aGlzLCBcImhhbmRsZXJcIiwge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfTEFURVNULFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgRFlOQU1PX1RBQkxFX05BTUU6IHByb3BzLmR5bmFtb1RhYmxlTmFtZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -1,13 +0,0 @@
1
- import type { Request, Response, NextFunction } from "express";
2
- /**
3
- * Express middleware that sets req.openhiContext for /ehr (and other domain API)
4
- * routes. Context includes tenantId, workspaceId, and the three standard audit
5
- * fields (date, userId, username) for audit records and for merging into FHIR
6
- * data on mutations.
7
- *
8
- * **TODO: A future task will populate context from JWT claims** (e.g. after
9
- * verifying the token). For now, static values are used.
10
- *
11
- * @see sites/www-docs/content/packages/@openhi/constructs/rest-api.md — Middleware
12
- */
13
- export declare function openHiContextMiddleware(req: Request, _res: Response, next: NextFunction): void;
@@ -1,31 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.openHiContextMiddleware = openHiContextMiddleware;
4
- /** Static context used until JWT claims are implemented. */
5
- const STATIC_TENANT_ID = "tenant-1";
6
- const STATIC_WORKSPACE_ID = "ws-1";
7
- const STATIC_USER_ID = "rest-api";
8
- const STATIC_USER_NAME = "REST API";
9
- /**
10
- * Express middleware that sets req.openhiContext for /ehr (and other domain API)
11
- * routes. Context includes tenantId, workspaceId, and the three standard audit
12
- * fields (date, userId, username) for audit records and for merging into FHIR
13
- * data on mutations.
14
- *
15
- * **TODO: A future task will populate context from JWT claims** (e.g. after
16
- * verifying the token). For now, static values are used.
17
- *
18
- * @see sites/www-docs/content/packages/@openhi/constructs/rest-api.md — Middleware
19
- */
20
- function openHiContextMiddleware(req, _res, next) {
21
- const now = new Date().toISOString();
22
- req.openhiContext = {
23
- tenantId: STATIC_TENANT_ID,
24
- workspaceId: STATIC_WORKSPACE_ID,
25
- date: now,
26
- userId: STATIC_USER_ID,
27
- username: STATIC_USER_NAME,
28
- };
29
- next();
30
- }
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Blbi1oaS1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RhdGEvbWlkZGxld2FyZS9vcGVuLWhpLWNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFtQkEsMERBY0M7QUEvQkQsNERBQTREO0FBQzVELE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDO0FBQ3BDLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDO0FBQ25DLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQztBQUNsQyxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQztBQUVwQzs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IsdUJBQXVCLENBQ3JDLEdBQVksRUFDWixJQUFjLEVBQ2QsSUFBa0I7SUFFbEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQyxHQUFHLENBQUMsYUFBYSxHQUFHO1FBQ2xCLFFBQVEsRUFBRSxnQkFBZ0I7UUFDMUIsV0FBVyxFQUFFLG1CQUFtQjtRQUNoQyxJQUFJLEVBQUUsR0FBRztRQUNULE1BQU0sRUFBRSxjQUFjO1FBQ3RCLFFBQVEsRUFBRSxnQkFBZ0I7S0FDM0IsQ0FBQztJQUNGLElBQUksRUFBRSxDQUFDO0FBQ1QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UsIE5leHRGdW5jdGlvbiB9IGZyb20gXCJleHByZXNzXCI7XG5cbi8qKiBTdGF0aWMgY29udGV4dCB1c2VkIHVudGlsIEpXVCBjbGFpbXMgYXJlIGltcGxlbWVudGVkLiAqL1xuY29uc3QgU1RBVElDX1RFTkFOVF9JRCA9IFwidGVuYW50LTFcIjtcbmNvbnN0IFNUQVRJQ19XT1JLU1BBQ0VfSUQgPSBcIndzLTFcIjtcbmNvbnN0IFNUQVRJQ19VU0VSX0lEID0gXCJyZXN0LWFwaVwiO1xuY29uc3QgU1RBVElDX1VTRVJfTkFNRSA9IFwiUkVTVCBBUElcIjtcblxuLyoqXG4gKiBFeHByZXNzIG1pZGRsZXdhcmUgdGhhdCBzZXRzIHJlcS5vcGVuaGlDb250ZXh0IGZvciAvZWhyIChhbmQgb3RoZXIgZG9tYWluIEFQSSlcbiAqIHJvdXRlcy4gQ29udGV4dCBpbmNsdWRlcyB0ZW5hbnRJZCwgd29ya3NwYWNlSWQsIGFuZCB0aGUgdGhyZWUgc3RhbmRhcmQgYXVkaXRcbiAqIGZpZWxkcyAoZGF0ZSwgdXNlcklkLCB1c2VybmFtZSkgZm9yIGF1ZGl0IHJlY29yZHMgYW5kIGZvciBtZXJnaW5nIGludG8gRkhJUlxuICogZGF0YSBvbiBtdXRhdGlvbnMuXG4gKlxuICogKipUT0RPOiBBIGZ1dHVyZSB0YXNrIHdpbGwgcG9wdWxhdGUgY29udGV4dCBmcm9tIEpXVCBjbGFpbXMqKiAoZS5nLiBhZnRlclxuICogdmVyaWZ5aW5nIHRoZSB0b2tlbikuIEZvciBub3csIHN0YXRpYyB2YWx1ZXMgYXJlIHVzZWQuXG4gKlxuICogQHNlZSBzaXRlcy93d3ctZG9jcy9jb250ZW50L3BhY2thZ2VzL0BvcGVuaGkvY29uc3RydWN0cy9yZXN0LWFwaS5tZCDigJQgTWlkZGxld2FyZVxuICovXG5leHBvcnQgZnVuY3Rpb24gb3BlbkhpQ29udGV4dE1pZGRsZXdhcmUoXG4gIHJlcTogUmVxdWVzdCxcbiAgX3JlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IHZvaWQge1xuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gIHJlcS5vcGVuaGlDb250ZXh0ID0ge1xuICAgIHRlbmFudElkOiBTVEFUSUNfVEVOQU5UX0lELFxuICAgIHdvcmtzcGFjZUlkOiBTVEFUSUNfV09SS1NQQUNFX0lELFxuICAgIGRhdGU6IG5vdyxcbiAgICB1c2VySWQ6IFNUQVRJQ19VU0VSX0lELFxuICAgIHVzZXJuYW1lOiBTVEFUSUNfVVNFUl9OQU1FLFxuICB9O1xuICBuZXh0KCk7XG59XG4iXX0=
@@ -1,16 +0,0 @@
1
- import express, { Request, Response } from "express";
2
- declare const router: express.Router;
3
- /**
4
- * GET /ehr/r4/Patient — search/list: returns a FHIR Bundle (searchset) from the data store.
5
- * Uses GSI4 (Resource Type Index) to list all Patients in the workspace without a table scan.
6
- * @see {@link https://github.com/codedrifters/openhi/blob/main/sites/www-docs/content/architecture/dynamodb-single-table-design.md | DynamoDB Single-Table Design} — GSI4, Query and Access Rules (no scans).
7
- */
8
- export declare function listPatients(req: Request, res: Response): Promise<Response>;
9
- export declare function getPatientById(req: Request, res: Response): Promise<Response>;
10
- /** POST /ehr/r4/Patient — create: accepts Patient in body, persists via data store, returns 201. */
11
- export declare function createPatient(req: Request, res: Response): Promise<Response>;
12
- /** PUT /ehr/r4/Patient/:id — update: accepts Patient in body, persists via data store, returns 200. */
13
- export declare function updatePatient(req: Request, res: Response): Promise<Response>;
14
- /** DELETE /ehr/r4/Patient/:id — delete: removes from data store, returns 204. */
15
- export declare function deletePatient(req: Request, res: Response): Promise<Response>;
16
- export { router as patientRouter };
@@ -1,234 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.patientRouter = void 0;
7
- exports.listPatients = listPatients;
8
- exports.getPatientById = getPatientById;
9
- exports.createPatient = createPatient;
10
- exports.updatePatient = updatePatient;
11
- exports.deletePatient = deletePatient;
12
- const express_1 = __importDefault(require("express"));
13
- const compression_1 = require("../../../../lib/compression");
14
- const ehr_r4_data_service_1 = require("../../../dynamo/ehr/r4/ehr-r4-data-service");
15
- const import_patient_1 = require("../../../import-patient");
16
- const BASE_PATH = "/ehr/r4/Patient";
17
- const router = express_1.default.Router();
18
- exports.patientRouter = router;
19
- const SK = "CURRENT";
20
- const TABLE_NAME = process.env.DYNAMO_TABLE_NAME ?? "jesttesttable";
21
- /**
22
- * GET /ehr/r4/Patient — search/list: returns a FHIR Bundle (searchset) from the data store.
23
- * Uses GSI4 (Resource Type Index) to list all Patients in the workspace without a table scan.
24
- * @see {@link https://github.com/codedrifters/openhi/blob/main/sites/www-docs/content/architecture/dynamodb-single-table-design.md | DynamoDB Single-Table Design} — GSI4, Query and Access Rules (no scans).
25
- */
26
- async function listPatients(req, res) {
27
- const { tenantId, workspaceId } = req.openhiContext;
28
- const service = (0, ehr_r4_data_service_1.getEhrR4DataService)(TABLE_NAME);
29
- try {
30
- const result = await service.entities.patient.query
31
- .gsi4({ tenantId, workspaceId })
32
- .go();
33
- const entries = (result.data ?? []).map((item) => {
34
- const resource = JSON.parse((0, compression_1.decompressResource)(item.resource));
35
- return {
36
- fullUrl: `${BASE_PATH}/${item.id}`,
37
- resource: { ...resource, id: item.id },
38
- };
39
- });
40
- const bundle = {
41
- resourceType: "Bundle",
42
- type: "searchset",
43
- total: entries.length,
44
- link: [{ relation: "self", url: BASE_PATH }],
45
- entry: entries,
46
- };
47
- return res.json(bundle);
48
- }
49
- catch (err) {
50
- console.error("GET /Patient list error:", err);
51
- return res.status(500).json({
52
- resourceType: "OperationOutcome",
53
- issue: [
54
- {
55
- severity: "error",
56
- code: "exception",
57
- diagnostics: String(err),
58
- },
59
- ],
60
- });
61
- }
62
- }
63
- router.get("/", listPatients);
64
- async function getPatientById(req, res) {
65
- const id = String(req.params.id);
66
- const { tenantId, workspaceId } = req.openhiContext;
67
- const service = (0, ehr_r4_data_service_1.getEhrR4DataService)(TABLE_NAME);
68
- try {
69
- const result = await service.entities.patient
70
- .get({ tenantId, workspaceId, id, sk: "CURRENT" })
71
- .go();
72
- if (!result.data) {
73
- return res.status(404).json({
74
- resourceType: "OperationOutcome",
75
- issue: [
76
- {
77
- severity: "error",
78
- code: "not-found",
79
- diagnostics: `Patient ${id} not found`,
80
- },
81
- ],
82
- });
83
- }
84
- const resource = JSON.parse((0, compression_1.decompressResource)(result.data.resource));
85
- return res.json({ ...resource, id: result.data.id });
86
- }
87
- catch (err) {
88
- console.error("GET Patient error:", err);
89
- return res.status(500).json({
90
- resourceType: "OperationOutcome",
91
- issue: [
92
- {
93
- severity: "error",
94
- code: "exception",
95
- diagnostics: String(err),
96
- },
97
- ],
98
- });
99
- }
100
- }
101
- /** GET /ehr/r4/Patient/:id — read: returns a single Patient resource from the data store or 404. */
102
- router.get("/:id", getPatientById);
103
- /** POST /ehr/r4/Patient — create: accepts Patient in body, persists via data store, returns 201. */
104
- async function createPatient(req, res) {
105
- const ctx = req.openhiContext;
106
- const { tenantId, workspaceId, date, userId, username } = ctx;
107
- const body = req.body;
108
- const id = body?.id ?? `patient-${Date.now()}`;
109
- const patient = {
110
- ...body,
111
- resourceType: "Patient",
112
- id,
113
- meta: {
114
- ...(body?.meta ?? {}),
115
- lastUpdated: date,
116
- versionId: "1",
117
- },
118
- };
119
- const options = {
120
- tenantId,
121
- workspaceId,
122
- createdDate: date,
123
- createdById: userId,
124
- createdByName: username,
125
- modifiedDate: date,
126
- modifiedById: userId,
127
- modifiedByName: username,
128
- };
129
- const service = (0, ehr_r4_data_service_1.getEhrR4DataService)(TABLE_NAME);
130
- try {
131
- const attrs = (0, import_patient_1.patientToPutAttrs)(patient, options);
132
- await service.entities.patient
133
- .put(attrs)
134
- .go();
135
- return res.status(201).location(`${BASE_PATH}/${id}`).json(patient);
136
- }
137
- catch (err) {
138
- console.error("POST Patient error:", err);
139
- return res.status(500).json({
140
- resourceType: "OperationOutcome",
141
- issue: [
142
- { severity: "error", code: "exception", diagnostics: String(err) },
143
- ],
144
- });
145
- }
146
- }
147
- router.post("/", createPatient);
148
- /** PUT /ehr/r4/Patient/:id — update: accepts Patient in body, persists via data store, returns 200. */
149
- async function updatePatient(req, res) {
150
- const id = String(req.params.id);
151
- const ctx = req.openhiContext;
152
- const { tenantId, workspaceId, date, userId, username } = ctx;
153
- const body = req.body;
154
- const patient = {
155
- ...body,
156
- resourceType: "Patient",
157
- id,
158
- meta: {
159
- ...(body?.meta ?? {}),
160
- lastUpdated: date,
161
- versionId: "2",
162
- },
163
- };
164
- const service = (0, ehr_r4_data_service_1.getEhrR4DataService)(TABLE_NAME);
165
- try {
166
- const existing = await service.entities.patient
167
- .get({ tenantId, workspaceId, id, sk: SK })
168
- .go();
169
- if (!existing.data) {
170
- return res.status(404).json({
171
- resourceType: "OperationOutcome",
172
- issue: [
173
- {
174
- severity: "error",
175
- code: "not-found",
176
- diagnostics: `Patient ${id} not found`,
177
- },
178
- ],
179
- });
180
- }
181
- const existingMeta = existing.data.resource != null
182
- ? JSON.parse((0, compression_1.decompressResource)(existing.data.resource)).meta
183
- : undefined;
184
- const patientWithMeta = {
185
- ...patient,
186
- meta: (0, import_patient_1.mergeAuditIntoMeta)(patient.meta ?? existingMeta, {
187
- modifiedDate: date,
188
- modifiedById: userId,
189
- modifiedByName: username,
190
- }),
191
- };
192
- await service.entities.patient
193
- .patch({ tenantId, workspaceId, id, sk: SK })
194
- .set({
195
- resource: (0, compression_1.compressResource)(JSON.stringify(patientWithMeta)),
196
- lastUpdated: date,
197
- })
198
- .go();
199
- return res.json(patientWithMeta);
200
- }
201
- catch (err) {
202
- console.error("PUT Patient error:", err);
203
- return res.status(500).json({
204
- resourceType: "OperationOutcome",
205
- issue: [
206
- { severity: "error", code: "exception", diagnostics: String(err) },
207
- ],
208
- });
209
- }
210
- }
211
- router.put("/:id", updatePatient);
212
- /** DELETE /ehr/r4/Patient/:id — delete: removes from data store, returns 204. */
213
- async function deletePatient(req, res) {
214
- const id = String(req.params.id);
215
- const { tenantId, workspaceId } = req.openhiContext;
216
- const service = (0, ehr_r4_data_service_1.getEhrR4DataService)(TABLE_NAME);
217
- try {
218
- await service.entities.patient
219
- .delete({ tenantId, workspaceId, id, sk: SK })
220
- .go();
221
- return res.status(204).send();
222
- }
223
- catch (err) {
224
- console.error("DELETE Patient error:", err);
225
- return res.status(500).json({
226
- resourceType: "OperationOutcome",
227
- issue: [
228
- { severity: "error", code: "exception", diagnostics: String(err) },
229
- ],
230
- });
231
- }
232
- }
233
- router.delete("/:id", deletePatient);
234
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGF0aWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9kYXRhL3Jlc3QtYXBpL2Voci9yNC9QYXRpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQXVCQSxvQ0EyQ0M7QUFJRCx3Q0EyQ0M7QUFNRCxzQ0ErQ0M7QUFLRCxzQ0F3RUM7QUFLRCxzQ0FzQkM7QUE5UUQsc0RBQXFEO0FBQ3JELDZEQUdxQztBQUNyQyxvRkFBaUY7QUFDakYsNERBSWlDO0FBRWpDLE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDO0FBQ3BDLE1BQU0sTUFBTSxHQUFtQixpQkFBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBcVE3QiwrQkFBYTtBQXBRaEMsTUFBTSxFQUFFLEdBQUcsU0FBUyxDQUFDO0FBRXJCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksZUFBZSxDQUFDO0FBRXBFOzs7O0dBSUc7QUFDSSxLQUFLLFVBQVUsWUFBWSxDQUNoQyxHQUFZLEVBQ1osR0FBYTtJQUViLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLGFBQWMsQ0FBQztJQUNyRCxNQUFNLE9BQU8sR0FBRyxJQUFBLHlDQUFtQixFQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRWhELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSzthQUNoRCxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLENBQUM7YUFDL0IsRUFBRSxFQUFFLENBQUM7UUFFUixNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDL0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFBLGdDQUFrQixF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LE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLGFBQWMsQ0FBQztJQUNyRCxNQUFNLE9BQU8sR0FBRyxJQUFBLHlDQUFtQixFQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRWhELElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPO2FBQzNCLE1BQU0sQ0FBQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzthQUM3QyxFQUFFLEVBQUUsQ0FBQztRQUNSLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBQUMsT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUN0QixPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUIsWUFBWSxFQUFFLGtCQUFrQjtZQUNoQyxLQUFLLEVBQUU7Z0JBQ0wsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRTthQUNuRTtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZXhwcmVzcywgeyBSZXF1ZXN0LCBSZXNwb25zZSB9IGZyb20gXCJleHByZXNzXCI7XG5pbXBvcnQge1xuICBjb21wcmVzc1Jlc291cmNlLFxuICBkZWNvbXByZXNzUmVzb3VyY2UsXG59IGZyb20gXCIuLi8uLi8uLi8uLi9saWIvY29tcHJlc3Npb25cIjtcbmltcG9ydCB7IGdldEVoclI0RGF0YVNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vZHluYW1vL2Voci9yNC9laHItcjQtZGF0YS1zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICBtZXJnZUF1ZGl0SW50b01ldGEsXG4gIHBhdGllbnRUb1B1dEF0dHJzLFxuICB0eXBlIEltcG9ydFBhdGllbnRPcHRpb25zLFxufSBmcm9tIFwiLi4vLi4vLi4vaW1wb3J0LXBhdGllbnRcIjtcblxuY29uc3QgQkFTRV9QQVRIID0gXCIvZWhyL3I0L1BhdGllbnRcIjtcbmNvbnN0IHJvdXRlcjogZXhwcmVzcy5Sb3V0ZXIgPSBleHByZXNzLlJvdXRlcigpO1xuY29uc3QgU0sgPSBcIkNVUlJFTlRcIjtcblxuY29uc3QgVEFCTEVfTkFNRSA9IHByb2Nlc3MuZW52LkRZTkFNT19UQUJMRV9OQU1FID8/IFwiamVzdHRlc3R0YWJsZVwiO1xuXG4vKipcbiAqIEdFVCAvZWhyL3I0L1BhdGllbnQg4oCUIHNlYXJjaC9saXN0OiByZXR1cm5zIGEgRkhJUiBCdW5kbGUgKHNlYXJjaHNldCkgZnJvbSB0aGUgZGF0YSBzdG9yZS5cbiAqIFVzZXMgR1NJNCAoUmVzb3VyY2UgVHlwZSBJbmRleCkgdG8gbGlzdCBhbGwgUGF0aWVudHMgaW4gdGhlIHdvcmtzcGFjZSB3aXRob3V0IGEgdGFibGUgc2Nhbi5cbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlZHJpZnRlcnMvb3BlbmhpL2Jsb2IvbWFpbi9zaXRlcy93d3ctZG9jcy9jb250ZW50L2FyY2hpdGVjdHVyZS9keW5hbW9kYi1zaW5nbGUtdGFibGUtZGVzaWduLm1kIHwgRHluYW1vREIgU2luZ2xlLVRhYmxlIERlc2lnbn0g4oCUIEdTSTQsIFF1ZXJ5IGFuZCBBY2Nlc3MgUnVsZXMgKG5vIHNjYW5zKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RQYXRpZW50cyhcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCB7IHRlbmFudElkLCB3b3Jrc3BhY2VJZCB9ID0gcmVxLm9wZW5oaUNvbnRleHQhO1xuICBjb25zdCBzZXJ2aWNlID0gZ2V0RWhyUjREYXRhU2VydmljZShUQUJMRV9OQU1FKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlcnZpY2UuZW50aXRpZXMucGF0aWVudC5xdWVyeVxuICAgICAgLmdzaTQoeyB0ZW5hbnRJZCwgd29ya3NwYWNlSWQgfSlcbiAgICAgIC5nbygpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IChyZXN1bHQuZGF0YSA/PyBbXSkubWFwKChpdGVtKSA9PiB7XG4gICAgICBjb25zdCByZXNvdXJjZSA9IEpTT04ucGFyc2UoZGVjb21wcmVzc1Jlc291cmNlKGl0ZW0ucmVzb3VyY2UpKSBhcyBSZWNvcmQ8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgdW5rbm93blxuICAgICAgPjtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZ1bGxVcmw6IGAke0JBU0VfUEFUSH0vJHtpdGVtLmlkfWAsXG4gICAgICAgIHJlc291cmNlOiB7IC4uLnJlc291cmNlLCBpZDogaXRlbS5pZCB9LFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCBidW5kbGUgPSB7XG4gICAgICByZXNvdXJjZVR5cGU6IFwiQnVuZGxlXCIsXG4gICAgICB0eXBlOiBcInNlYXJjaHNldFwiLFxuICAgICAgdG90YWw6IGVudHJpZXMubGVuZ3RoLFxuICAgICAgbGluazogW3sgcmVsYXRpb246IFwic2VsZlwiLCB1cmw6IEJBU0VfUEFUSCB9XSxcbiAgICAgIGVudHJ5OiBlbnRyaWVzLFxuICAgIH07XG4gICAgcmV0dXJuIHJlcy5qc29uKGJ1bmRsZSk7XG4gIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJHRVQgL1BhdGllbnQgbGlzdCBlcnJvcjpcIiwgZXJyKTtcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgcmVzb3VyY2VUeXBlOiBcIk9wZXJhdGlvbk91dGNvbWVcIixcbiAgICAgIGlzc3VlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzZXZlcml0eTogXCJlcnJvclwiLFxuICAgICAgICAgIGNvZGU6IFwiZXhjZXB0aW9uXCIsXG4gICAgICAgICAgZGlhZ25vc3RpY3M6IFN0cmluZyhlcnIpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxufVxuXG5yb3V0ZXIuZ2V0KFwiL1wiLCBsaXN0UGF0aWVudHMpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UGF0aWVudEJ5SWQoXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgaWQgPSBTdHJpbmcocmVxLnBhcmFtcy5pZCk7XG4gIGNvbnN0IHsgdGVuYW50SWQsIHdvcmtzcGFjZUlkIH0gPSByZXEub3BlbmhpQ29udGV4dCE7XG4gIGNvbnN0IHNlcnZpY2UgPSBnZXRFaHJSNERhdGFTZXJ2aWNlKFRBQkxFX05BTUUpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmljZS5lbnRpdGllcy5wYXRpZW50XG4gICAgICAuZ2V0KHsgdGVuYW50SWQsIHdvcmtzcGFjZUlkLCBpZCwgc2s6IFwiQ1VSUkVOVFwiIH0pXG4gICAgICAuZ28oKTtcblxuICAgIGlmICghcmVzdWx0LmRhdGEpIHtcbiAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwNCkuanNvbih7XG4gICAgICAgIHJlc291cmNlVHlwZTogXCJPcGVyYXRpb25PdXRjb21lXCIsXG4gICAgICAgIGlzc3VlOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc2V2ZXJpdHk6IFwiZXJyb3JcIixcbiAgICAgICAgICAgIGNvZGU6IFwibm90LWZvdW5kXCIsXG4gICAgICAgICAgICBkaWFnbm9zdGljczogYFBhdGllbnQgJHtpZH0gbm90IGZvdW5kYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBKU09OLnBhcnNlKFxuICAgICAgZGVjb21wcmVzc1Jlc291cmNlKHJlc3VsdC5kYXRhLnJlc291cmNlKSxcbiAgICApIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHJldHVybiByZXMuanNvbih7IC4uLnJlc291cmNlLCBpZDogcmVzdWx0LmRhdGEuaWQgfSk7XG4gIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJHRVQgUGF0aWVudCBlcnJvcjpcIiwgZXJyKTtcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgcmVzb3VyY2VUeXBlOiBcIk9wZXJhdGlvbk91dGNvbWVcIixcbiAgICAgIGlzc3VlOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzZXZlcml0eTogXCJlcnJvclwiLFxuICAgICAgICAgIGNvZGU6IFwiZXhjZXB0aW9uXCIsXG4gICAgICAgICAgZGlhZ25vc3RpY3M6IFN0cmluZyhlcnIpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKiogR0VUIC9laHIvcjQvUGF0aWVudC86aWQg4oCUIHJlYWQ6IHJldHVybnMgYSBzaW5nbGUgUGF0aWVudCByZXNvdXJjZSBmcm9tIHRoZSBkYXRhIHN0b3JlIG9yIDQwNC4gKi9cbnJvdXRlci5nZXQoXCIvOmlkXCIsIGdldFBhdGllbnRCeUlkKTtcblxuLyoqIFBPU1QgL2Voci9yNC9QYXRpZW50IOKAlCBjcmVhdGU6IGFjY2VwdHMgUGF0aWVudCBpbiBib2R5LCBwZXJzaXN0cyB2aWEgZGF0YSBzdG9yZSwgcmV0dXJucyAyMDEuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUGF0aWVudChcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBjdHggPSByZXEub3BlbmhpQ29udGV4dCE7XG4gIGNvbnN0IHsgdGVuYW50SWQsIHdvcmtzcGFjZUlkLCBkYXRlLCB1c2VySWQsIHVzZXJuYW1lIH0gPSBjdHg7XG4gIGNvbnN0IGJvZHkgPSByZXEuYm9keSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgaWQgPSAoYm9keT8uaWQgYXMgc3RyaW5nKSA/PyBgcGF0aWVudC0ke0RhdGUubm93KCl9YDtcbiAgY29uc3QgcGF0aWVudCA9IHtcbiAgICAuLi5ib2R5LFxuICAgIHJlc291cmNlVHlwZTogXCJQYXRpZW50XCIsXG4gICAgaWQsXG4gICAgbWV0YToge1xuICAgICAgLi4uKChib2R5Py5tZXRhIGFzIG9iamVjdCkgPz8ge30pLFxuICAgICAgbGFzdFVwZGF0ZWQ6IGRhdGUsXG4gICAgICB2ZXJzaW9uSWQ6IFwiMVwiLFxuICAgIH0sXG4gIH0gYXMgeyByZXNvdXJjZVR5cGU6IHN0cmluZzsgaWQ6IHN0cmluZzsgbWV0YT86IHsgbGFzdFVwZGF0ZWQ/OiBzdHJpbmcgfSB9O1xuICBjb25zdCBvcHRpb25zOiBJbXBvcnRQYXRpZW50T3B0aW9ucyA9IHtcbiAgICB0ZW5hbnRJZCxcbiAgICB3b3Jrc3BhY2VJZCxcbiAgICBjcmVhdGVkRGF0ZTogZGF0ZSxcbiAgICBjcmVhdGVkQnlJZDogdXNlcklkLFxuICAgIGNyZWF0ZWRCeU5hbWU6IHVzZXJuYW1lLFxuICAgIG1vZGlmaWVkRGF0ZTogZGF0ZSxcbiAgICBtb2RpZmllZEJ5SWQ6IHVzZXJJZCxcbiAgICBtb2RpZmllZEJ5TmFtZTogdXNlcm5hbWUsXG4gIH07XG4gIGNvbnN0IHNlcnZpY2UgPSBnZXRFaHJSNERhdGFTZXJ2aWNlKFRBQkxFX05BTUUpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgYXR0cnMgPSBwYXRpZW50VG9QdXRBdHRycyhwYXRpZW50LCBvcHRpb25zKTtcbiAgICBhd2FpdCBzZXJ2aWNlLmVudGl0aWVzLnBhdGllbnRcbiAgICAgIC5wdXQoXG4gICAgICAgIGF0dHJzIGFzIHVua25vd24gYXMgUGFyYW1ldGVyczx0eXBlb2Ygc2VydmljZS5lbnRpdGllcy5wYXRpZW50LnB1dD5bMF0sXG4gICAgICApXG4gICAgICAuZ28oKTtcbiAgICByZXR1cm4gcmVzLnN0YXR1cygyMDEpLmxvY2F0aW9uKGAke0JBU0VfUEFUSH0vJHtpZH1gKS5qc29uKHBhdGllbnQpO1xuICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICBjb25zb2xlLmVycm9yKFwiUE9TVCBQYXRpZW50IGVycm9yOlwiLCBlcnIpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICByZXNvdXJjZVR5cGU6IFwiT3BlcmF0aW9uT3V0Y29tZVwiLFxuICAgICAgaXNzdWU6IFtcbiAgICAgICAgeyBzZXZlcml0eTogXCJlcnJvclwiLCBjb2RlOiBcImV4Y2VwdGlvblwiLCBkaWFnbm9zdGljczogU3RyaW5nKGVycikgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbn1cblxucm91dGVyLnBvc3QoXCIvXCIsIGNyZWF0ZVBhdGllbnQpO1xuXG4vKiogUFVUIC9laHIvcjQvUGF0aWVudC86aWQg4oCUIHVwZGF0ZTogYWNjZXB0cyBQYXRpZW50IGluIGJvZHksIHBlcnNpc3RzIHZpYSBkYXRhIHN0b3JlLCByZXR1cm5zIDIwMC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVQYXRpZW50KFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIGNvbnN0IGlkID0gU3RyaW5nKHJlcS5wYXJhbXMuaWQpO1xuICBjb25zdCBjdHggPSByZXEub3BlbmhpQ29udGV4dCE7XG4gIGNvbnN0IHsgdGVuYW50SWQsIHdvcmtzcGFjZUlkLCBkYXRlLCB1c2VySWQsIHVzZXJuYW1lIH0gPSBjdHg7XG4gIGNvbnN0IGJvZHkgPSByZXEuYm9keSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgcGF0aWVudCA9IHtcbiAgICAuLi5ib2R5LFxuICAgIHJlc291cmNlVHlwZTogXCJQYXRpZW50XCIsXG4gICAgaWQsXG4gICAgbWV0YToge1xuICAgICAgLi4uKChib2R5Py5tZXRhIGFzIG9iamVjdCkgPz8ge30pLFxuICAgICAgbGFzdFVwZGF0ZWQ6IGRhdGUsXG4gICAgICB2ZXJzaW9uSWQ6IFwiMlwiLFxuICAgIH0sXG4gIH07XG4gIGNvbnN0IHNlcnZpY2UgPSBnZXRFaHJSNERhdGFTZXJ2aWNlKFRBQkxFX05BTUUpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBzZXJ2aWNlLmVudGl0aWVzLnBhdGllbnRcbiAgICAgIC5nZXQoeyB0ZW5hbnRJZCwgd29ya3NwYWNlSWQsIGlkLCBzazogU0sgfSlcbiAgICAgIC5nbygpO1xuICAgIGlmICghZXhpc3RpbmcuZGF0YSkge1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA0KS5qc29uKHtcbiAgICAgICAgcmVzb3VyY2VUeXBlOiBcIk9wZXJhdGlvbk91dGNvbWVcIixcbiAgICAgICAgaXNzdWU6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzZXZlcml0eTogXCJlcnJvclwiLFxuICAgICAgICAgICAgY29kZTogXCJub3QtZm91bmRcIixcbiAgICAgICAgICAgIGRpYWdub3N0aWNzOiBgUGF0aWVudCAke2lkfSBub3QgZm91bmRgLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmdNZXRhID1cbiAgICAgIGV4aXN0aW5nLmRhdGEucmVzb3VyY2UgIT0gbnVsbFxuICAgICAgICA/IChcbiAgICAgICAgICAgIEpTT04ucGFyc2UoZGVjb21wcmVzc1Jlc291cmNlKGV4aXN0aW5nLmRhdGEucmVzb3VyY2UpKSBhcyB7XG4gICAgICAgICAgICAgIG1ldGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApLm1ldGFcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGF0aWVudFdpdGhNZXRhID0ge1xuICAgICAgLi4ucGF0aWVudCxcbiAgICAgIG1ldGE6IG1lcmdlQXVkaXRJbnRvTWV0YShcbiAgICAgICAgKHBhdGllbnQubWV0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCkgPz8gZXhpc3RpbmdNZXRhLFxuICAgICAgICB7XG4gICAgICAgICAgbW9kaWZpZWREYXRlOiBkYXRlLFxuICAgICAgICAgIG1vZGlmaWVkQnlJZDogdXNlcklkLFxuICAgICAgICAgIG1vZGlmaWVkQnlOYW1lOiB1c2VybmFtZSxcbiAgICAgICAgfSxcbiAgICAgICksXG4gICAgfTtcbiAgICBhd2FpdCBzZXJ2aWNlLmVudGl0aWVzLnBhdGllbnRcbiAgICAgIC5wYXRjaCh7IHRlbmFudElkLCB3b3Jrc3BhY2VJZCwgaWQsIHNrOiBTSyB9KVxuICAgICAgLnNldCh7XG4gICAgICAgIHJlc291cmNlOiBjb21wcmVzc1Jlc291cmNlKEpTT04uc3RyaW5naWZ5KHBhdGllbnRXaXRoTWV0YSkpLFxuICAgICAgICBsYXN0VXBkYXRlZDogZGF0ZSxcbiAgICAgIH0pXG4gICAgICAuZ28oKTtcbiAgICByZXR1cm4gcmVzLmpzb24ocGF0aWVudFdpdGhNZXRhKTtcbiAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgY29uc29sZS5lcnJvcihcIlBVVCBQYXRpZW50IGVycm9yOlwiLCBlcnIpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICByZXNvdXJjZVR5cGU6IFwiT3BlcmF0aW9uT3V0Y29tZVwiLFxuICAgICAgaXNzdWU6IFtcbiAgICAgICAgeyBzZXZlcml0eTogXCJlcnJvclwiLCBjb2RlOiBcImV4Y2VwdGlvblwiLCBkaWFnbm9zdGljczogU3RyaW5nKGVycikgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbn1cblxucm91dGVyLnB1dChcIi86aWRcIiwgdXBkYXRlUGF0aWVudCk7XG5cbi8qKiBERUxFVEUgL2Voci9yNC9QYXRpZW50LzppZCDigJQgZGVsZXRlOiByZW1vdmVzIGZyb20gZGF0YSBzdG9yZSwgcmV0dXJucyAyMDQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlUGF0aWVudChcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBpZCA9IFN0cmluZyhyZXEucGFyYW1zLmlkKTtcbiAgY29uc3QgeyB0ZW5hbnRJZCwgd29ya3NwYWNlSWQgfSA9IHJlcS5vcGVuaGlDb250ZXh0ITtcbiAgY29uc3Qgc2VydmljZSA9IGdldEVoclI0RGF0YVNlcnZpY2UoVEFCTEVfTkFNRSk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBzZXJ2aWNlLmVudGl0aWVzLnBhdGllbnRcbiAgICAgIC5kZWxldGUoeyB0ZW5hbnRJZCwgd29ya3NwYWNlSWQsIGlkLCBzazogU0sgfSlcbiAgICAgIC5nbygpO1xuICAgIHJldHVybiByZXMuc3RhdHVzKDIwNCkuc2VuZCgpO1xuICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICBjb25zb2xlLmVycm9yKFwiREVMRVRFIFBhdGllbnQgZXJyb3I6XCIsIGVycik7XG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgIHJlc291cmNlVHlwZTogXCJPcGVyYXRpb25PdXRjb21lXCIsXG4gICAgICBpc3N1ZTogW1xuICAgICAgICB7IHNldmVyaXR5OiBcImVycm9yXCIsIGNvZGU6IFwiZXhjZXB0aW9uXCIsIGRpYWdub3N0aWNzOiBTdHJpbmcoZXJyKSB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxufVxuXG5yb3V0ZXIuZGVsZXRlKFwiLzppZFwiLCBkZWxldGVQYXRpZW50KTtcblxuZXhwb3J0IHsgcm91dGVyIGFzIHBhdGllbnRSb3V0ZXIgfTtcbiJdfQ==
@@ -1 +0,0 @@
1
- export {};
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const rest_api_1 = require("./rest-api");
4
- const port = 3000;
5
- rest_api_1.app.listen(port, () => {
6
- console.log(`POC app listening at http://localhost:${port}`);
7
- });
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC1hcGktbG9jYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZGF0YS9yZXN0LWFwaS9yZXN0LWFwaS1sb2NhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlDQUFpQztBQUVqQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7QUFFbEIsY0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFO0lBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMseUNBQXlDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDL0QsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhcHAgfSBmcm9tIFwiLi9yZXN0LWFwaVwiO1xuXG5jb25zdCBwb3J0ID0gMzAwMDtcblxuYXBwLmxpc3Rlbihwb3J0LCAoKSA9PiB7XG4gIGNvbnNvbGUubG9nKGBQT0MgYXBwIGxpc3RlbmluZyBhdCBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH1gKTtcbn0pO1xuIl19
@@ -1,7 +0,0 @@
1
- interface Dictionary {
2
- [key: string]: object;
3
- }
4
- declare const patientsMock: Dictionary;
5
- declare const careTeamParticipantsMock: Dictionary;
6
- declare const organizationsMock: Dictionary;
7
- export { patientsMock, careTeamParticipantsMock, organizationsMock };