diff --git a/memory-bank/change-log.md b/memory-bank/change-log.md index 6f9241bc..77cc6362 100644 --- a/memory-bank/change-log.md +++ b/memory-bank/change-log.md @@ -1037,3 +1037,37 @@ Validation: Follow-ups: - Continue P2-S2 with the remaining legacy relay GET candidates (`createwatchedcases_api`, `deletewatchedcasesproxy_api`, `getadvancedsearch_api`, `getadvancedsearchpaged_api`, `getbasicsearch_by_address_api`, `getbasicsearch_by_lparref_api`, `getdnscoords_api`). + +--- + +### CL-028: TASK22229 P2-S2 Batch 11 (advanced-search-paged relay GET) + +date: 2026-03-24 +author: Cline +scope: `pages/api/endpoint/getadvancedsearchpaged_api.js`, `tests/phase21/endpoint-handler-contract.test.cjs` +type: change +rationale: Continue bounded relay migration by moving the remaining advanced-search paged GET handler to shared `relayGet` while preserving query validation and response contracts. +impact: Reduced duplicated relay plumbing and aligned advanced paged search route with shared forwarding; no intended API contract changes. +status: completed + +Summary: + +- Migrated `getadvancedsearchpaged_api.js` to shared `relayGet`. +- Preserved existing guard behavior and error contracts: + - `SEARCH_STRING_REQUIRED` + - `ORDER_BY_REQUIRED` + - `FIELD_SORT_REQUIRED` + - `SHOW_NUMBER_OF_RECORDS_REQUIRED` + - `INVALID_SEARCH_STRING` + - `ADVANCED_SEARCH_PAGED_FETCH_FAILED` +- Preserved endpoint-specific transform behavior (`@odata.nextLink` normalization via `transformData`). +- Updated phase21 endpoint contract tests to inject `relayGet` mocks for `getadvancedsearchpaged_api` guard/catch assertions. + +Validation: + +- `node tests/phase21/endpoint-handler-contract.test.cjs` -> pass (152/152) +- `npm run lint` -> warnings only (pre-existing `react-hooks/exhaustive-deps`; no new lint errors) + +Follow-ups: + +- Continue P2-S2 with remaining legacy relay GET candidates (`createwatchedcases_api`, `deletewatchedcasesproxy_api`, `getadvancedsearch_api`, `getbasicsearch_by_address_api`, `getbasicsearch_by_lparref_api`, `getdnscoords_api`). diff --git a/pages/api/endpoint/getadvancedsearchpaged_api.js b/pages/api/endpoint/getadvancedsearchpaged_api.js index 3150880e..f62a21ef 100644 --- a/pages/api/endpoint/getadvancedsearchpaged_api.js +++ b/pages/api/endpoint/getadvancedsearchpaged_api.js @@ -47,17 +47,10 @@ // * description: Success // */ -import axios from "axios"; import _ from "lodash"; import { azureHeadersPagedCustom } from "../../../actions/core/headers"; -import { consoleLogger } from "../../../actions/core/logger"; -import { getToken } from "../../../actions/core/token"; -import { hashAPIPath } from "../../../actions/core/hash"; -import { respondError, respondSuccess } from "../middleware/apiResponse"; - -const WEBAPI_URL = - process.env.RELAY_ROOT || - "https://dev-pedw-ns.servicebus.windows.net/dev-pedw-hc/"; +import { respondError } from "../middleware/apiResponse"; +import { relayGet } from "../middleware/relayForwarding"; export default async function ApiProxy(req, res) { const rawSearchString = req.query.searchstring; @@ -180,81 +173,23 @@ export default async function ApiProxy(req, res) { : ""); } - console.log("adv qu: ", queryUrl); + return relayGet({ + queryUrl, + res, + requestOptionsBuilder: (accessToken) => + azureHeadersPagedCustom(accessToken, showNumberOfRecords), + transformData: (data) => { + let dataStr; + _.has(data, "@odata.nextLink") === true && + ((dataStr = JSON.stringify(data["@odata.nextLink"])), + (data["@odata.nextLink"] = dataStr.split("/v8.2/")[1])); - try { - const token = await getToken(); - const { data } = await axios.get( - WEBAPI_URL + queryUrl + hashAPIPath(queryUrl), - azureHeadersPagedCustom(token.access_token, showNumberOfRecords) - ); - - let dataStr; - _.has(data, "@odata.nextLink") === true && - ((dataStr = JSON.stringify(data["@odata.nextLink"])), - (data["@odata.nextLink"] = dataStr.split("/v8.2/")[1])); - - if (_.has(searchString, "projecttype")) { - // await updateValueArray(data, token); - // async function updateValueArray(data, token) { - // for (let i = 0; i < data.value.length; i++) { - // const item = data.value[i]; - // try { - // // Axios call using the `incidentid` to fetch additional data - // const response = await axios.get( - // WEBAPI_URL + - // "pinswg_sipses?$filter=_pinswg_sipscase_value eq " + - // item.incidentid + - // " and _pinswg_projecttype_value eq " + - // searchString.projecttype + - // "&$select=_pinswg_projecttype_value" + - // hashAPIPath( - // "pinswg_sipses?$filter=_pinswg_sipscase_value eq " + - // item.incidentid + - // " and _pinswg_projecttype_value eq " + - // searchString.projecttype + - // "&$select=_pinswg_projecttype_value" - // ), - // azureHeadersPaged(token.access_token) - // ); - // // Assuming the response contains the additional data you want to add - // // console.log(response.data.value[0]); - // console.log(response.data.value); - // if ( - // response.data.value.length > 0 && - // response.data.value[0] - // ._pinswg_projecttype_value != null - // ) { - // Object.assign( - // item, - // response.data.value[0] - // ); // Update item with new data - // } else { - // console.log( - // `No project type found for incident ID ${item.incidentid}` - // ); - // } - // } catch (error) { - // console.error( - // `Error fetching data for incident ID ${item.incidentid}:`, - // error - // ); - // } - // } - // } - // data.value = data.value.filter( - // (item) => item._pinswg_projecttype_value != null - // ); - // data["@odata.count"] = data.value.length; - } - - return respondSuccess(res, data); - } catch (error) { - consoleLogger(error); - return respondError(res, { + return data; + }, + errorResponse: { status: 400, code: "ADVANCED_SEARCH_PAGED_FETCH_FAILED", message: "Failed to fetch advanced search paged results" - }); - } + } + }); } diff --git a/tests/phase21/endpoint-handler-contract.test.cjs b/tests/phase21/endpoint-handler-contract.test.cjs index 2a78106e..ae92776b 100644 --- a/tests/phase21/endpoint-handler-contract.test.cjs +++ b/tests/phase21/endpoint-handler-contract.test.cjs @@ -1101,11 +1101,8 @@ test("getadvancedsearchpaged returns SEARCH_STRING_REQUIRED when searchstring mi const mod = loadModule("pages/api/endpoint/getadvancedsearchpaged_api.js", { respondError: respondErrorMock, respondSuccess: respondSuccessMock, - getToken: async () => ({ access_token: "token" }), - hashAPIPath: () => "&hash=expected", + relayGet: async () => ({}), azureHeadersPagedCustom: () => ({}), - axios: { get: async () => ({ data: { value: [] } }) }, - consoleLogger: () => {}, _: { has: () => false } }); @@ -1127,11 +1124,8 @@ test("getadvancedsearchpaged returns ORDER_BY_REQUIRED when orderby missing", as const mod = loadModule("pages/api/endpoint/getadvancedsearchpaged_api.js", { respondError: respondErrorMock, respondSuccess: respondSuccessMock, - getToken: async () => ({ access_token: "token" }), - hashAPIPath: () => "&hash=expected", + relayGet: async () => ({}), azureHeadersPagedCustom: () => ({}), - axios: { get: async () => ({ data: { value: [] } }) }, - consoleLogger: () => {}, _: { has: () => false } }); @@ -1153,15 +1147,9 @@ test("getadvancedsearchpaged catch path returns ADVANCED_SEARCH_PAGED_FETCH_FAIL const mod = loadModule("pages/api/endpoint/getadvancedsearchpaged_api.js", { respondError: respondErrorMock, respondSuccess: respondSuccessMock, - getToken: async () => ({ access_token: "token" }), - hashAPIPath: () => "&hash=expected", + relayGet: async ({ res, errorResponse }) => + respondErrorMock(res, errorResponse), azureHeadersPagedCustom: () => ({}), - axios: { - get: async () => { - throw new Error("relay failed"); - } - }, - consoleLogger: () => {}, _: { has: () => false } });