@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.
- package/lib/chunk-LZOMFHX3.mjs +38 -0
- package/lib/chunk-LZOMFHX3.mjs.map +1 -0
- package/lib/index.d.mts +788 -0
- package/lib/index.d.ts +869 -3
- package/lib/index.js +1318 -19
- package/lib/index.js.map +1 -0
- package/lib/index.mjs +1303 -0
- package/lib/index.mjs.map +1 -0
- package/lib/rest-api-lambda.handler.d.mts +6 -0
- package/lib/rest-api-lambda.handler.d.ts +6 -0
- package/lib/rest-api-lambda.handler.js +677 -0
- package/lib/rest-api-lambda.handler.js.map +1 -0
- package/lib/rest-api-lambda.handler.mjs +646 -0
- package/lib/rest-api-lambda.handler.mjs.map +1 -0
- package/package.json +37 -28
- package/lib/app/index.d.ts +0 -4
- package/lib/app/index.js +0 -21
- package/lib/app/open-hi-app.d.ts +0 -85
- package/lib/app/open-hi-app.js +0 -127
- package/lib/app/open-hi-environment.d.ts +0 -59
- package/lib/app/open-hi-environment.js +0 -72
- package/lib/app/open-hi-service.d.ts +0 -169
- package/lib/app/open-hi-service.js +0 -195
- package/lib/app/open-hi-stage.d.ts +0 -71
- package/lib/app/open-hi-stage.js +0 -70
- package/lib/components/acm/root-wildcard-certificate.d.ts +0 -15
- package/lib/components/acm/root-wildcard-certificate.js +0 -35
- package/lib/components/api-gateway/core-http-api.d.ts +0 -10
- package/lib/components/api-gateway/core-http-api.js +0 -44
- package/lib/components/api-gateway/http-lambda-integration-no-permissions.d.ts +0 -18
- package/lib/components/api-gateway/http-lambda-integration-no-permissions.js +0 -26
- package/lib/components/app-sync/core-graphql-api.d.ts +0 -12
- package/lib/components/app-sync/core-graphql-api.js +0 -54
- package/lib/components/auth.d.ts +0 -75
- package/lib/components/auth.js +0 -100
- package/lib/components/cognito/core-user-pool-client.d.ts +0 -10
- package/lib/components/cognito/core-user-pool-client.js +0 -47
- package/lib/components/cognito/core-user-pool-domain.d.ts +0 -10
- package/lib/components/cognito/core-user-pool-domain.js +0 -41
- package/lib/components/cognito/core-user-pool-kms-key.d.ts +0 -10
- package/lib/components/cognito/core-user-pool-kms-key.js +0 -37
- package/lib/components/cognito/core-user-pool.d.ts +0 -10
- package/lib/components/cognito/core-user-pool.js +0 -54
- package/lib/components/core.d.ts +0 -102
- package/lib/components/core.js +0 -79
- package/lib/components/dynamodb/dynamo-db-data-store.d.ts +0 -33
- package/lib/components/dynamodb/dynamo-db-data-store.js +0 -107
- package/lib/components/event-bridge/data-event-bus.d.ts +0 -19
- package/lib/components/event-bridge/data-event-bus.js +0 -34
- package/lib/components/event-bridge/ops-event-bus.d.ts +0 -19
- package/lib/components/event-bridge/ops-event-bus.js +0 -34
- package/lib/components/global.d.ts +0 -36
- package/lib/components/global.js +0 -63
- package/lib/components/index.d.ts +0 -1
- package/lib/components/index.js +0 -18
- package/lib/components/route-53/child-hosted-zone.d.ts +0 -20
- package/lib/components/route-53/child-hosted-zone.js +0 -48
- package/lib/components/route-53/root-hosted-zone.d.ts +0 -10
- package/lib/components/route-53/root-hosted-zone.js +0 -20
- package/lib/components/ssm/discoverable-string-parameter.d.ts +0 -59
- package/lib/components/ssm/discoverable-string-parameter.js +0 -50
- package/lib/components/ssm/index.d.ts +0 -1
- package/lib/components/ssm/index.js +0 -18
- package/lib/data/dynamo/ehr/r4/Patient.d.ts +0 -180
- package/lib/data/dynamo/ehr/r4/Patient.js +0 -192
- package/lib/data/dynamo/ehr/r4/ehr-r4-data-service.d.ts +0 -162
- package/lib/data/dynamo/ehr/r4/ehr-r4-data-service.js +0 -37
- package/lib/data/hello-world.d.ts +0 -39
- package/lib/data/hello-world.js +0 -59
- package/lib/data/import-patient-with-dynalite.d.ts +0 -1
- package/lib/data/import-patient-with-dynalite.js +0 -87
- package/lib/data/import-patient.d.ts +0 -47
- package/lib/data/import-patient.js +0 -158
- package/lib/data/lambda/rest-api-lambda.d.ts +0 -13
- package/lib/data/lambda/rest-api-lambda.handler.d.ts +0 -1
- package/lib/data/lambda/rest-api-lambda.handler.js +0 -10
- package/lib/data/lambda/rest-api-lambda.js +0 -22
- package/lib/data/middleware/open-hi-context.d.ts +0 -13
- package/lib/data/middleware/open-hi-context.js +0 -31
- package/lib/data/rest-api/ehr/r4/Patient.d.ts +0 -16
- package/lib/data/rest-api/ehr/r4/Patient.js +0 -234
- package/lib/data/rest-api/rest-api-local.d.ts +0 -1
- package/lib/data/rest-api/rest-api-local.js +0 -8
- package/lib/data/rest-api/rest-api-mockdata.d.ts +0 -7
- package/lib/data/rest-api/rest-api-mockdata.js +0 -585
- package/lib/data/rest-api/rest-api.d.ts +0 -3
- package/lib/data/rest-api/rest-api.js +0 -26
- package/lib/lib/compression.d.ts +0 -27
- package/lib/lib/compression.js +0 -87
- package/lib/services/index.d.ts +0 -5
- package/lib/services/index.js +0 -22
- package/lib/services/open-hi-auth-service.d.ts +0 -31
- package/lib/services/open-hi-auth-service.js +0 -31
- package/lib/services/open-hi-core-service.d.ts +0 -15
- package/lib/services/open-hi-core-service.js +0 -38
- package/lib/services/open-hi-data-service.d.ts +0 -18
- package/lib/services/open-hi-data-service.js +0 -18
- package/lib/services/open-hi-global-service.d.ts +0 -15
- package/lib/services/open-hi-global-service.js +0 -44
- package/lib/services/open-hi-rest-api-service.d.ts +0 -17
- 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
|