From 427ab872eb6f8831b9c7e18a5e320407fcca9957 Mon Sep 17 00:00:00 2001 From: Michael Puzon Date: Wed, 4 Mar 2026 17:06:43 +0800 Subject: [PATCH] [FEATURE]: add wrapResponse utility and update handlers to use it --- src/handlers/osAutoSuggestHandler.js | 52 +++++------ src/handlers/osSearchHandler.js | 128 +++++++++++++-------------- src/lib/wrap-response.js | 26 ++++++ 3 files changed, 109 insertions(+), 97 deletions(-) create mode 100644 src/lib/wrap-response.js diff --git a/src/handlers/osAutoSuggestHandler.js b/src/handlers/osAutoSuggestHandler.js index 688227b..ffbaf17 100644 --- a/src/handlers/osAutoSuggestHandler.js +++ b/src/handlers/osAutoSuggestHandler.js @@ -1,41 +1,35 @@ const { getOpenSearchClient } = require("../lib/opensearch-client"); +const { wrapResponse } = require("../lib/wrap-response"); const client = getOpenSearchClient(); const { buildAutoSuggestQuery } = require("../utils/esHelpers"); module.exports.index = async (event) => { - try { - const body = event.queryStringParameters; - const queryText = body.query || body.q || ""; - const index = body.index; - const size = 10; - const langId = body.langId ? parseInt(body.langId, 10) : 1; - if (!queryText) { - return { - statusCode: 400, - body: JSON.stringify({ error: "Missing query parameter" }), - }; - } + return wrapResponse(async () => { + try { + const body = event.queryStringParameters; + const queryText = body.query || body.q || ""; + const index = body.index; + const size = 10; + const langId = body.langId ? parseInt(body.langId, 10) : 1; + if (!queryText) { + throw new Error("Missing query parameter"); + } - // Use the new buildAutoSuggestQuery for powerful autosuggestion - const suggestQuery = buildAutoSuggestQuery(queryText, langId, size); - console.log("suggestQuery", suggestQuery); + // Use the new buildAutoSuggestQuery for powerful autosuggestion + const suggestQuery = buildAutoSuggestQuery(queryText, langId, size); + console.log("suggestQuery", suggestQuery); - const results = await client.search(index, suggestQuery, 0, size); - const suggestions = results.results.map((hit) => hit._source); + const results = await client.search(index, suggestQuery, 0, size); + const suggestions = results.results.map((hit) => hit._source); - return { - statusCode: 200, - body: JSON.stringify({ + return { suggestions, total: results.total, - }), - }; - } catch (error) { - console.error("AutoSuggest error:", error); - return { - statusCode: 500, - body: JSON.stringify({ error: error.message || "Internal Server Error" }), - }; - } + }; + } catch (error) { + console.error("AutoSuggest error:", error); + throw new Error("Error processing auto-suggest request"); + } + }); }; diff --git a/src/handlers/osSearchHandler.js b/src/handlers/osSearchHandler.js index 9ecf9ac..b09c0ce 100644 --- a/src/handlers/osSearchHandler.js +++ b/src/handlers/osSearchHandler.js @@ -1,79 +1,71 @@ -const OpenSearchClient = require('../engines/OpenSearch/openSearchClient'); -const { buildQuery } = require('../utils/esHelpers'); -const { getOpenSearchClient } = require('../lib/opensearch-client'); +const OpenSearchClient = require("../engines/OpenSearch/openSearchClient"); +const { buildQuery } = require("../utils/esHelpers"); +const { getOpenSearchClient } = require("../lib/opensearch-client"); +const { wrapResponse } = require("../lib/wrap-response"); const osClient = getOpenSearchClient(); module.exports.index = async (event) => { - let body; - if (event.body) { - try { - body = JSON.parse(event.body); - } catch (parseError) { - console.log('Invalid JSON in event.body:', parseError); - return { - statusCode: 400, - body: JSON.stringify({ error: 'Invalid JSON in request body' }), - }; - } - } else { - body = event; - } - const { index, query, project, filters, aggs, from, size, langId } = body; - console.log('Request body:', body); - - try { - if (!index) { - throw new Error('Index should be present'); + return wrapResponse(async () => { + let body; + if (event.body) { + try { + body = JSON.parse(event.body); + } catch (parseError) { + console.log("Invalid JSON in event.body:", parseError); + throw new Error("Invalid JSON in request body"); + } + } else { + body = event; } - const {query: builtQuery, ...rest} = buildQuery(query, project, langId); + const { index, query, project, filters, aggs, from, size, langId } = body; + console.log("Request body:", body); - const mustClause = [ - builtQuery - ] + try { + if (!index) { + throw new Error("Index should be present"); + } + const { query: builtQuery, ...rest } = buildQuery(query, project, langId); - if (filters && Object.keys(filters).length) { - const terms = Object.entries(filters).map(([field, value]) => ({ - term: { [field]: value } - })); - mustClause.push(...terms); - } - - const finalQuery = { - query: { - bool: { - must: [ - { - bool: { - must: mustClause - } - } - ] - } - }, - ...rest - } + const mustClause = [builtQuery]; - if (aggs && Object.keys(aggs).length) { - finalQuery.aggs = aggs; - } + if (filters && Object.keys(filters).length) { + const terms = Object.entries(filters).map(([field, value]) => ({ + term: { [field]: value }, + })); + mustClause.push(...terms); + } + + const finalQuery = { + query: { + bool: { + must: [ + { + bool: { + must: mustClause, + }, + }, + ], + }, + }, + ...rest, + }; - const results = await osClient.search( - index, - finalQuery, - parseInt(from, 10), - parseInt(size, 10) - ); + if (aggs && Object.keys(aggs).length) { + finalQuery.aggs = aggs; + } - return { - statusCode: 200, - body: JSON.stringify(results), - }; - } catch (error) { - console.log('OpenSearch index error:', error) - return { - statusCode: 500, - body: JSON.stringify({ error: error.message }), - }; - } + const results = await osClient.search( + index, + finalQuery, + parseInt(from, 10), + parseInt(size, 10), + ); + + return results; + } catch (error) { + console.log("OpenSearch index error:", error); + throw error; + } + }); }; diff --git a/src/lib/wrap-response.js b/src/lib/wrap-response.js new file mode 100644 index 0000000..30a5fcd --- /dev/null +++ b/src/lib/wrap-response.js @@ -0,0 +1,26 @@ +const wrapResponse = async (handler) => { + try { + const result = await handler(); + return { + statusCode: result.statusCode || 200, + body: JSON.stringify(result), + headers: { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Credentials": true, + }, + }; + } catch (error) { + console.error("Error in wrapResponse:", error); + return { + statusCode: 500, + body: JSON.stringify({ + message: "Internal Server Error", + }), + headers: { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Credentials": true, + }, + }; + } +}; +module.exports = { wrapResponse };