Skip to content

Commit

Permalink
Merge pull request #2280 from metriport/patch-chunk-ihe-document-retr…
Browse files Browse the repository at this point in the history
…ieval-requests

PATCH: chunk ihe v2 document retrieval requests
  • Loading branch information
jonahkaye committed Jun 14, 2024
2 parents d0af672 + 61b5772 commit 0738518
Showing 1 changed file with 45 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,20 @@ import { processAsyncError } from "../../../util/error/shared";
import { IHEGatewayV2 } from "./ihe-gateway-v2";

const MAX_GATEWAYS_BEFORE_CHUNK = 1000;
const MAX_DOCUMENT_QUERY_REQUESTS_PER_INVOCATION = 20;
const MAX_DOCUMENT_RETRIEVAL_REQUESTS_PER_INVOCATION = 20;

const iheGatewayV2OutboundPatientDiscoveryLambdaName = "IHEGatewayV2OutboundPatientDiscoveryLambda";
const iheGatewayV2OutboundDocumentQueryLambdaName = "IHEGatewayV2OutboundDocumentQueryLambda";
const iheGatewayV2OutboundDocumentRetrievalLambdaName =
"IHEGatewayV2OutboundDocumentRetrievalLambda";

function chunkRequests<T>(requests: T[], maxRequestsPerInvocation: number): T[][] {
const chunks = Math.ceil(requests.length / maxRequestsPerInvocation);
const chunkSize = Math.ceil(requests.length / chunks);
return chunk(requests, chunkSize);
}

export class IHEGatewayV2Async extends IHEGatewayV2 {
constructor() {
super();
Expand All @@ -33,9 +41,7 @@ export class IHEGatewayV2Async extends IHEGatewayV2 {
const lambdaClient = makeLambdaClient(Config.getAWSRegion());
const { gateways, ...rest } = pdRequestGatewayV2;

const chunks = Math.ceil(gateways.length / MAX_GATEWAYS_BEFORE_CHUNK);
const chunkSize = Math.ceil(gateways.length / chunks);
const gatewayChunks = chunk(gateways, chunkSize);
const gatewayChunks = chunkRequests(gateways, MAX_GATEWAYS_BEFORE_CHUNK);

for (const chunk of gatewayChunks) {
const newPdRequestGatewayV2 = { ...rest, gateways: chunk };
Expand Down Expand Up @@ -65,17 +71,26 @@ export class IHEGatewayV2Async extends IHEGatewayV2 {
requestId: string;
}): Promise<void> {
const lambdaClient = makeLambdaClient(Config.getAWSRegion());
const params = { patientId, cxId, requestId, dqRequestsGatewayV2 };
// intentionally not waiting
lambdaClient
.invoke({
FunctionName: iheGatewayV2OutboundDocumentQueryLambdaName,
InvocationType: "Event",
Payload: JSON.stringify(params),
})
.promise()
.catch(processAsyncError("Failed to invoke iheGWV2 lambda for document query"));
const requestChunks = chunkRequests(
dqRequestsGatewayV2,
MAX_DOCUMENT_QUERY_REQUESTS_PER_INVOCATION
);

for (const chunk of requestChunks) {
const params = { patientId, cxId, requestId, dqRequestsGatewayV2: chunk };

// intentionally not waiting
lambdaClient
.invoke({
FunctionName: iheGatewayV2OutboundDocumentQueryLambdaName,
InvocationType: "Event",
Payload: JSON.stringify(params),
})
.promise()
.catch(processAsyncError("Failed to invoke iheGWV2 lambda for document query"));
}
}

async startDocumentRetrievalGatewayV2({
drRequestsGatewayV2,
patientId,
Expand All @@ -88,15 +103,23 @@ export class IHEGatewayV2Async extends IHEGatewayV2 {
requestId: string;
}): Promise<void> {
const lambdaClient = makeLambdaClient(Config.getAWSRegion());
const params = { patientId, cxId, requestId, drRequestsGatewayV2 };
const requestChunks = chunkRequests(
drRequestsGatewayV2,
MAX_DOCUMENT_RETRIEVAL_REQUESTS_PER_INVOCATION
);

for (const chunk of requestChunks) {
const params = { patientId, cxId, requestId, drRequestsGatewayV2: chunk };

lambdaClient
.invoke({
FunctionName: iheGatewayV2OutboundDocumentRetrievalLambdaName,
InvocationType: "Event",
Payload: JSON.stringify(params),
})
.promise()
.catch(processAsyncError("Failed to invoke iheGWV2 lambda for document retrieval"));
// intentionally not waiting
lambdaClient
.invoke({
FunctionName: iheGatewayV2OutboundDocumentRetrievalLambdaName,
InvocationType: "Event",
Payload: JSON.stringify(params),
})
.promise()
.catch(processAsyncError("Failed to invoke iheGWV2 lambda for document retrieval"));
}
}
}

0 comments on commit 0738518

Please sign in to comment.