Skip to content

Commit

Permalink
Support multiple targets in search route
Browse files Browse the repository at this point in the history
  • Loading branch information
kdid committed Aug 8, 2022
1 parent 34dcbf7 commit f9de9b9
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 5 deletions.
4 changes: 2 additions & 2 deletions src/api/opensearch.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,13 @@ function isVisible(doc) {
}
}

async function search(body) {
async function search(targets, body) {
const endpoint = new AWS.Endpoint(elasticsearchEndpoint);
const request = new AWS.HttpRequest(endpoint, region);

request.method = "POST";
request.body = body;
request.path += prefix("dc-v2-work") + `/_search`;
request.path += `${targets}/_search`;
request.headers["host"] = elasticsearchEndpoint;
request.headers["Content-Type"] = "application/json";

Expand Down
38 changes: 36 additions & 2 deletions src/handlers/search.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
const { prefix } = require("../aws/environment");
const { search } = require("../api/opensearch");
const opensearchResponse = require("../api/response/opensearch");
const RequestPipeline = require("../api/request/pipeline.js");
Expand All @@ -7,9 +8,42 @@ const RequestPipeline = require("../api/request/pipeline.js");
*/
exports.handler = async (event) => {
const eventBody = event.body;
console.log("RequestPipeline", RequestPipeline);

const requestedModels =
event.pathParameters?.models == null
? ["works"]
: event.pathParameters.models.split(",");

if (!validModels(requestedModels)) {
return {
statusCode: 400,
body: JSON.stringify({
message: `Invalid models requested: ${requestedModels}`,
}),
};
}

const filteredBody = new RequestPipeline(eventBody).authFilter().toJson();
let esResponse = await search(filteredBody);
let esResponse = await search(modelsToTargets(requestedModels), filteredBody);
let transformedResponse = opensearchResponse.transform(esResponse);
return transformedResponse;
};

function validModels(models) {
const validModels = models.filter((model) => isAllowed(model));
return validModels.length > 0;
}

function isAllowed(model) {
allowedModels = ["works", "file-sets", "collections"];
return allowedModels.includes(model);
}

function modelsToTargets(models) {
const mapTargets = {
works: "dc-v2-work",
"file-sets": "dc-v2-file-set",
collections: "dc-v2-collection",
};
return String(models.map((model) => prefix(mapTargets[model])));
}
8 changes: 7 additions & 1 deletion template.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -145,12 +145,18 @@ Resources:
ENV_PREFIX: !Ref EnvironmentPrefix
ELASTICSEARCH_ENDPOINT: !Ref ElasticsearchEndpoint
Events:
Api:
SearchApi:
Type: Api
Properties:
RestApiId: !Ref dcApi
Path: /search
Method: POST
SearchWithModelsApi:
Type: Api
Properties:
RestApiId: !Ref dcApi
Path: /search/{models}
Method: POST
dcApi:
Type: AWS::Serverless::Api
Properties:
Expand Down

0 comments on commit f9de9b9

Please sign in to comment.