TASK22211: normalize dns basic search endpoint contracts

This commit is contained in:
2026-03-23 11:26:56 +00:00
parent b880364e51
commit a106dea6c9
5 changed files with 348 additions and 100 deletions
+21 -17
View File
@@ -17,37 +17,41 @@
*/ */
import axios from "axios"; import axios from "axios";
import CryptoJS from "crypto-js";
import _ from "lodash"; import _ from "lodash";
import { azureHeadersPaged } from "../../../actions/core/headers"; import { azureHeadersPaged } from "../../../actions/core/headers";
import { consoleLogger } from "../../../actions/core/logger"; import { consoleLogger } from "../../../actions/core/logger";
import { getToken } from "../../../actions/core/token"; import { getToken } from "../../../actions/core/token";
import { hashAPIPath } from "../../../actions/core/hash"; import { hashAPIPath } from "../../../actions/core/hash";
import { respondError, respondSuccess } from "../middleware/apiResponse";
const WEBAPI_URL = const WEBAPI_URL =
process.env.RELAY_ROOT || process.env.RELAY_ROOT ||
"https://dev-pedw-ns.servicebus.windows.net/dev-pedw-hc/"; "https://dev-pedw-ns.servicebus.windows.net/dev-pedw-hc/";
export default async function ApiProxy(req, res) { export default async function ApiProxy(req, res) {
var token = await getToken(); try {
const token = await getToken();
var queryUrl = const queryUrl =
"incidents?$select=pinswg_environmentalstatementlocation,pinswg_caseaddress,modifiedon,description,numberofchildincidents,_accountid_value,_customerid_value,_pinswg_associatedlpa_value,_ownerid_value,pinswg_appealcasetype,statuscode,ticketnumber,title, _primarycontactid_value,pinswg_lpareference&$expand=primarycontactid($select=fullname)&$filter=(pinswg_appealcasetype eq 846040011 or pinswg_appealcasetype eq 846040002)and pinswg_publishtoweb eq true&$orderby=createdon desc&$count=true"; "incidents?$select=pinswg_environmentalstatementlocation,pinswg_caseaddress,modifiedon,description,numberofchildincidents,_accountid_value,_customerid_value,_pinswg_associatedlpa_value,_ownerid_value,pinswg_appealcasetype,statuscode,ticketnumber,title, _primarycontactid_value,pinswg_lpareference&$expand=primarycontactid($select=fullname)&$filter=(pinswg_appealcasetype eq 846040011 or pinswg_appealcasetype eq 846040002)and pinswg_publishtoweb eq true&$orderby=createdon desc&$count=true";
return axios const { data } = await axios.get(
.get(
WEBAPI_URL + queryUrl + hashAPIPath(queryUrl), WEBAPI_URL + queryUrl + hashAPIPath(queryUrl),
azureHeadersPaged(token.access_token) azureHeadersPaged(token.access_token)
) );
.then(({ data }) => {
var dataStr; if (_.has(data, "@odata.nextLink") === true) {
_.has(data, "@odata.nextLink") == true && const dataStr = JSON.stringify(data["@odata.nextLink"]);
((dataStr = JSON.stringify(data["@odata.nextLink"])), data["@odata.nextLink"] = dataStr.split("/v8.2/")[1];
(data["@odata.nextLink"] = dataStr.split("/v8.2/")[1])); }
res.status(200).json(data);
}) return respondSuccess(res, data);
.catch((error) => { } catch (error) {
consoleLogger(error); consoleLogger(error);
res.status(400).json(error); return respondError(res, {
status: 400,
code: "BASIC_DNS_SEARCH_FETCH_FAILED",
message: "Failed to fetch basic DNS search results"
}); });
}
} }
@@ -11,45 +11,54 @@
*/ */
import axios from "axios"; import axios from "axios";
import CryptoJS from "crypto-js";
import _ from "lodash"; import _ from "lodash";
import { azureHeaders } from "../../../actions/core/headers";
import { consoleLogger } from "../../../actions/core/logger"; import { consoleLogger } from "../../../actions/core/logger";
import { getToken } from "../../../actions/core/token"; import { getToken } from "../../../actions/core/token";
import { getSelectQuery } from "../../../actions/selectQueryTypes"; import { getSelectQuery } from "../../../actions/selectQueryTypes";
import { hashAPIPath } from "../../../actions/core/hash"; import { hashAPIPath } from "../../../actions/core/hash";
import { respondError, respondSuccess } from "../middleware/apiResponse";
const WEBAPI_URL = const WEBAPI_URL =
process.env.RELAY_ROOT || process.env.RELAY_ROOT ||
"https://dev-pedw-ns.servicebus.windows.net/dev-pedw-hc/"; "https://dev-pedw-ns.servicebus.windows.net/dev-pedw-hc/";
export default async function ApiProxy(req, res) { export default async function ApiProxy(req, res) {
var caseReference = req.query.caseReference; const caseReference = req.query.caseReference;
var token = await getToken();
var queryUrl = if (
"pinswg_dnses?$filter=pinswg_name eq '" + typeof caseReference !== "string" ||
caseReference + caseReference.trim().length === 0
"&$count=true"; ) {
//" and statuscode eq 1&$count=true"; return respondError(res, {
status: 400,
code: "CASE_REFERENCE_REQUIRED",
message: "caseReference is required"
});
}
queryUrl = queryUrl + getSelectQuery("pinswg_dnses"); try {
const token = await getToken();
var apiResponse = _.isEmpty(req.query) let queryUrl =
? res.status(400).json() "pinswg_dnses?$filter=pinswg_name eq '" +
: typeof caseReference != "undefined" && caseReference.length > 0 caseReference +
? axios "&$count=true";
.get(
WEBAPI_URL + queryUrl + hashAPIPath(queryUrl),
azureHeaders(token.access_token)
)
.then(({ data }) => {
res.status(200).json(data);
})
.catch((error) => {
consoleLogger(error);
res.status(400).json(error);
})
: res.status(400).json();
return apiResponse; queryUrl = queryUrl + getSelectQuery("pinswg_dnses");
const { data } = await axios.get(
WEBAPI_URL + queryUrl + hashAPIPath(queryUrl),
azureHeaders(token.access_token)
);
return respondSuccess(res, data);
} catch (error) {
consoleLogger(error);
return respondError(res, {
status: 400,
code: "BASIC_DNS_SEARCH_DETAILS_FETCH_FAILED",
message: "Failed to fetch basic DNS search details"
});
}
} }
@@ -10,50 +10,59 @@
* description: Success * description: Success
*/ */
import axios from "axios"; import axios from "axios";
import CryptoJS from "crypto-js";
import _ from "lodash"; import _ from "lodash";
import { azureHeadersPaged } from "../../../actions/core/headers"; import { azureHeadersPaged } from "../../../actions/core/headers";
import { consoleLogger } from "../../../actions/core/logger"; import { consoleLogger } from "../../../actions/core/logger";
import { getToken } from "../../../actions/core/token"; import { getToken } from "../../../actions/core/token";
import { getSelectQuery } from "../../../actions/selectQueryTypes"; import { getSelectQuery } from "../../../actions/selectQueryTypes";
import { hashAPIPath } from "../../../actions/core/hash"; import { hashAPIPath } from "../../../actions/core/hash";
import { respondError, respondSuccess } from "../middleware/apiResponse";
const WEBAPI_URL = const WEBAPI_URL =
process.env.RELAY_ROOT || process.env.RELAY_ROOT ||
"https://dev-pedw-ns.servicebus.windows.net/dev-pedw-hc/"; "https://dev-pedw-ns.servicebus.windows.net/dev-pedw-hc/";
export default async function ApiProxy(req, res) { export default async function ApiProxy(req, res) {
var caseReference = req.query.caseReference; const caseReference = req.query.caseReference;
var token = await getToken();
var queryUrl = if (
"pinswg_dnses?$filter=pinswg_name eq '" + typeof caseReference !== "string" ||
caseReference + caseReference.trim().length === 0
"&$count=true"; ) {
//" and statuscode eq 1&$count=true"; return respondError(res, {
status: 400,
code: "CASE_REFERENCE_REQUIRED",
message: "caseReference is required"
});
}
queryUrl = queryUrl + getSelectQuery("pinswg_dnses"); try {
const token = await getToken();
var apiResponse = _.isEmpty(req.query) let queryUrl =
? res.status(400).json() "pinswg_dnses?$filter=pinswg_name eq '" +
: typeof caseReference != "undefined" && caseReference.length > 0 caseReference +
? axios "&$count=true";
.get(
WEBAPI_URL + queryUrl + hashAPIPath(queryUrl),
azureHeadersPaged(token.access_token)
)
.then(({ data }) => {
var dataStr;
_.has(data, "@odata.nextLink") == true &&
((dataStr = JSON.stringify(data["@odata.nextLink"])),
(data["@odata.nextLink"] = dataStr.split("/v8.2/")[1]));
return res.status(200).json(data);
})
.catch((error) => {
consoleLogger(error);
res.status(400).json(error);
})
: res.status(400).json();
return apiResponse; queryUrl = queryUrl + getSelectQuery("pinswg_dnses");
const { data } = await axios.get(
WEBAPI_URL + queryUrl + hashAPIPath(queryUrl),
azureHeadersPaged(token.access_token)
);
if (_.has(data, "@odata.nextLink") === true) {
const dataStr = JSON.stringify(data["@odata.nextLink"]);
data["@odata.nextLink"] = dataStr.split("/v8.2/")[1];
}
return respondSuccess(res, data);
} catch (error) {
consoleLogger(error);
return respondError(res, {
status: 400,
code: "BASIC_DNS_SEARCH_DETAILS_PAGED_FETCH_FAILED",
message: "Failed to fetch paged basic DNS search details"
});
}
} }
@@ -48,43 +48,75 @@ import { azureHeadersPagedCustom } from "../../../actions/core/headers";
import { getToken } from "../../../actions/core/token"; import { getToken } from "../../../actions/core/token";
import { consoleLogger } from "../../../actions/core/logger"; import { consoleLogger } from "../../../actions/core/logger";
import { hashAPIPath } from "../../../actions/core/hash"; import { hashAPIPath } from "../../../actions/core/hash";
import { respondError, respondSuccess } from "../middleware/apiResponse";
const WEBAPI_URL = const WEBAPI_URL =
process.env.RELAY_ROOT || process.env.RELAY_ROOT ||
"https://dev-pedw-ns.servicebus.windows.net/dev-pedw-hc/"; "https://dev-pedw-ns.servicebus.windows.net/dev-pedw-hc/";
export default async function ApiProxy(req, res) { export default async function ApiProxy(req, res) {
var pageNumber = req.query.pageNumber; const pageNumber = req.query.pageNumber;
var token = await getToken(); const orderby = req.query.orderby;
const fieldSort = req.query.fieldSort;
const showNumberOfRecords = req.query.showNumberOfRecords;
var orderby = req.query.orderby; if (typeof orderby !== "string" || orderby.trim().length === 0) {
var fieldSort = req.query.fieldSort; return respondError(res, {
var showNumberOfRecords = req.query.showNumberOfRecords; status: 400,
code: "ORDER_BY_REQUIRED",
message: "orderby is required"
});
}
var queryUrl = if (typeof fieldSort !== "string" || fieldSort.trim().length === 0) {
"incidents?$select=pinswg_environmentalstatementlocation,pinswg_caseaddress,modifiedon,description,numberofchildincidents,_accountid_value,_customerid_value,_pinswg_associatedlpa_value,_ownerid_value,pinswg_appealcasetype,statuscode,ticketnumber,title, _primarycontactid_value,pinswg_lpareference&$expand=primarycontactid($select=fullname)&$filter=(pinswg_appealcasetype eq 846040011 or pinswg_appealcasetype eq 846040002) and pinswg_publishtoweb eq true&$orderby=" + return respondError(res, {
orderby + status: 400,
" " + code: "FIELD_SORT_REQUIRED",
fieldSort + message: "fieldSort is required"
"&$count=true" + });
(typeof pageNumber != "undefined" }
? "&$skiptoken=" + '<cookie pagenumber="' + pageNumber + '" />'
: "");
return axios if (
.get( typeof showNumberOfRecords !== "string" ||
showNumberOfRecords.trim().length === 0
) {
return respondError(res, {
status: 400,
code: "SHOW_NUMBER_OF_RECORDS_REQUIRED",
message: "showNumberOfRecords is required"
});
}
try {
const token = await getToken();
const queryUrl =
"incidents?$select=pinswg_environmentalstatementlocation,pinswg_caseaddress,modifiedon,description,numberofchildincidents,_accountid_value,_customerid_value,_pinswg_associatedlpa_value,_ownerid_value,pinswg_appealcasetype,statuscode,ticketnumber,title, _primarycontactid_value,pinswg_lpareference&$expand=primarycontactid($select=fullname)&$filter=(pinswg_appealcasetype eq 846040011 or pinswg_appealcasetype eq 846040002) and pinswg_publishtoweb eq true&$orderby=" +
orderby +
" " +
fieldSort +
"&$count=true" +
(typeof pageNumber != "undefined"
? "&$skiptoken=" + '<cookie pagenumber="' + pageNumber + '" />'
: "");
const { data } = await axios.get(
WEBAPI_URL + queryUrl + hashAPIPath(queryUrl), WEBAPI_URL + queryUrl + hashAPIPath(queryUrl),
azureHeadersPagedCustom(token.access_token, showNumberOfRecords) azureHeadersPagedCustom(token.access_token, showNumberOfRecords)
) );
.then(({ data }) => {
var dataStr; if (_.has(data, "@odata.nextLink") === true) {
_.has(data, "@odata.nextLink") == true && const dataStr = JSON.stringify(data["@odata.nextLink"]);
((dataStr = JSON.stringify(data["@odata.nextLink"])), data["@odata.nextLink"] = dataStr.split("/v8.2/")[1];
(data["@odata.nextLink"] = dataStr.split("/v8.2/")[1])); }
return res.status(200).json(data);
}) return respondSuccess(res, data);
.catch((error) => { } catch (error) {
consoleLogger(error); consoleLogger(error);
res.status(400).json(error); return respondError(res, {
status: 400,
code: "BASIC_DNS_SEARCH_PAGED_FETCH_FAILED",
message: "Failed to fetch paged basic DNS search results"
}); });
}
} }
@@ -1773,6 +1773,200 @@ test("getbasicsearch_by_lparref catch path returns BASIC_SEARCH_LPA_REF_FETCH_FA
); );
}); });
test("getbasicdnssearch catch path returns BASIC_DNS_SEARCH_FETCH_FAILED", async () => {
const mod = loadModule("pages/api/endpoint/getbasicdnssearch_api.js", {
respondError: respondErrorMock,
respondSuccess: respondSuccessMock,
getToken: async () => ({ access_token: "token" }),
hashAPIPath: () => "&hash=expected",
azureHeadersPaged: () => ({}),
axios: {
get: async () => {
throw new Error("relay failed");
}
},
consoleLogger: () => {},
_: { has: () => false }
});
const req = { query: {} };
const res = createRes();
await mod.default(req, res);
assert.strictEqual(res.state.statusCode, 400);
assert.strictEqual(
res.state.jsonBody.error.code,
"BASIC_DNS_SEARCH_FETCH_FAILED"
);
});
test("getbasicdnssearchpaged returns ORDER_BY_REQUIRED when orderby missing", async () => {
const mod = loadModule("pages/api/endpoint/getbasicdnssearchpaged_api.js", {
respondError: respondErrorMock,
respondSuccess: respondSuccessMock,
getToken: async () => ({ access_token: "token" }),
hashAPIPath: () => "&hash=expected",
azureHeadersPagedCustom: () => ({}),
axios: { get: async () => ({ data: { value: [] } }) },
consoleLogger: () => {},
_: { has: () => false }
});
const req = { query: { fieldSort: "asc", showNumberOfRecords: "10" } };
const res = createRes();
await mod.default(req, res);
assert.strictEqual(res.state.statusCode, 400);
assert.strictEqual(res.state.jsonBody.error.code, "ORDER_BY_REQUIRED");
});
test("getbasicdnssearchpaged catch path returns BASIC_DNS_SEARCH_PAGED_FETCH_FAILED", async () => {
const mod = loadModule("pages/api/endpoint/getbasicdnssearchpaged_api.js", {
respondError: respondErrorMock,
respondSuccess: respondSuccessMock,
getToken: async () => ({ access_token: "token" }),
hashAPIPath: () => "&hash=expected",
azureHeadersPagedCustom: () => ({}),
axios: {
get: async () => {
throw new Error("relay failed");
}
},
consoleLogger: () => {},
_: { has: () => false }
});
const req = {
query: {
orderby: "createdon",
fieldSort: "asc",
showNumberOfRecords: "10"
}
};
const res = createRes();
await mod.default(req, res);
assert.strictEqual(res.state.statusCode, 400);
assert.strictEqual(
res.state.jsonBody.error.code,
"BASIC_DNS_SEARCH_PAGED_FETCH_FAILED"
);
});
test("getbasicdnssearchdetails returns CASE_REFERENCE_REQUIRED when caseReference missing", async () => {
const mod = loadModule(
"pages/api/endpoint/getbasicdnssearchdetails_api.js",
{
respondError: respondErrorMock,
respondSuccess: respondSuccessMock,
getToken: async () => ({ access_token: "token" }),
getSelectQuery: () => "&$select=pinswg_name",
hashAPIPath: () => "&hash=expected",
azureHeaders: () => ({}),
axios: { get: async () => ({ data: { value: [] } }) },
consoleLogger: () => {}
}
);
const req = { query: {} };
const res = createRes();
await mod.default(req, res);
assert.strictEqual(res.state.statusCode, 400);
assert.strictEqual(
res.state.jsonBody.error.code,
"CASE_REFERENCE_REQUIRED"
);
});
test("getbasicdnssearchdetails catch path returns BASIC_DNS_SEARCH_DETAILS_FETCH_FAILED", async () => {
const mod = loadModule(
"pages/api/endpoint/getbasicdnssearchdetails_api.js",
{
respondError: respondErrorMock,
respondSuccess: respondSuccessMock,
getToken: async () => ({ access_token: "token" }),
getSelectQuery: () => "&$select=pinswg_name",
hashAPIPath: () => "&hash=expected",
azureHeaders: () => ({}),
axios: {
get: async () => {
throw new Error("relay failed");
}
},
consoleLogger: () => {}
}
);
const req = { query: { caseReference: "DNS-001" } };
const res = createRes();
await mod.default(req, res);
assert.strictEqual(res.state.statusCode, 400);
assert.strictEqual(
res.state.jsonBody.error.code,
"BASIC_DNS_SEARCH_DETAILS_FETCH_FAILED"
);
});
test("getbasicdnssearchdetailspaged returns CASE_REFERENCE_REQUIRED when caseReference missing", async () => {
const mod = loadModule(
"pages/api/endpoint/getbasicdnssearchdetailspaged_api.js",
{
respondError: respondErrorMock,
respondSuccess: respondSuccessMock,
getToken: async () => ({ access_token: "token" }),
getSelectQuery: () => "&$select=pinswg_name",
hashAPIPath: () => "&hash=expected",
azureHeadersPaged: () => ({}),
axios: { get: async () => ({ data: { value: [] } }) },
consoleLogger: () => {},
_: { has: () => false }
}
);
const req = { query: {} };
const res = createRes();
await mod.default(req, res);
assert.strictEqual(res.state.statusCode, 400);
assert.strictEqual(
res.state.jsonBody.error.code,
"CASE_REFERENCE_REQUIRED"
);
});
test("getbasicdnssearchdetailspaged catch path returns BASIC_DNS_SEARCH_DETAILS_PAGED_FETCH_FAILED", async () => {
const mod = loadModule(
"pages/api/endpoint/getbasicdnssearchdetailspaged_api.js",
{
respondError: respondErrorMock,
respondSuccess: respondSuccessMock,
getToken: async () => ({ access_token: "token" }),
getSelectQuery: () => "&$select=pinswg_name",
hashAPIPath: () => "&hash=expected",
azureHeadersPaged: () => ({}),
axios: {
get: async () => {
throw new Error("relay failed");
}
},
consoleLogger: () => {},
_: { has: () => false }
}
);
const req = { query: { caseReference: "DNS-001" } };
const res = createRes();
await mod.default(req, res);
assert.strictEqual(res.state.statusCode, 400);
assert.strictEqual(
res.state.jsonBody.error.code,
"BASIC_DNS_SEARCH_DETAILS_PAGED_FETCH_FAILED"
);
});
const run = async () => { const run = async () => {
let passed = 0; let passed = 0;
for (const currentTest of tests) { for (const currentTest of tests) {