Merged in feature/IO-3638-Reynolds-OpenSearch (pull request #3184)
feature/IO-3638-Reynolds-OpenSearch - Add Search on DMS id in Reynolds shops
This commit is contained in:
@@ -32,6 +32,7 @@ async function OpenSearchUpdateHandler(req, res) {
|
|||||||
clm_no
|
clm_no
|
||||||
clm_total
|
clm_total
|
||||||
comment
|
comment
|
||||||
|
dms_id
|
||||||
ins_co_nm
|
ins_co_nm
|
||||||
owner_owing
|
owner_owing
|
||||||
ownr_co_nm
|
ownr_co_nm
|
||||||
|
|||||||
@@ -2442,6 +2442,9 @@ exports.ACTIVE_SHOP_BY_USER = `query ACTIVE_SHOP_BY_USER($user: String) {
|
|||||||
associations(where: {active: {_eq: true}, useremail: {_eq: $user}}) {
|
associations(where: {active: {_eq: true}, useremail: {_eq: $user}}) {
|
||||||
id
|
id
|
||||||
shopid
|
shopid
|
||||||
|
bodyshop {
|
||||||
|
rr_dealerid
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}`;
|
}`;
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ const queries = require("../graphql-client/queries");
|
|||||||
const client = require("../graphql-client/graphql-client").client;
|
const client = require("../graphql-client/graphql-client").client;
|
||||||
const { pick, isNil } = require("lodash");
|
const { pick, isNil } = require("lodash");
|
||||||
const { getClient } = require("../../libs/awsUtils");
|
const { getClient } = require("../../libs/awsUtils");
|
||||||
|
const { JOB_DOCUMENT_FIELDS, getGlobalSearchQueryStringFields } = require("./os-search-config");
|
||||||
|
|
||||||
async function OpenSearchUpdateHandler(req, res) {
|
async function OpenSearchUpdateHandler(req, res) {
|
||||||
try {
|
try {
|
||||||
@@ -21,27 +22,7 @@ async function OpenSearchUpdateHandler(req, res) {
|
|||||||
|
|
||||||
switch (req.body.table.name) {
|
switch (req.body.table.name) {
|
||||||
case "jobs":
|
case "jobs":
|
||||||
document = pick(req.body.event.data.new, [
|
document = pick(req.body.event.data.new, JOB_DOCUMENT_FIELDS);
|
||||||
"id",
|
|
||||||
"bodyshopid",
|
|
||||||
"clm_no",
|
|
||||||
"clm_total",
|
|
||||||
"comment",
|
|
||||||
"ins_co_nm",
|
|
||||||
"owner_owing",
|
|
||||||
"ownr_co_nm",
|
|
||||||
"ownr_fn",
|
|
||||||
"ownr_ln",
|
|
||||||
"ownr_ph1",
|
|
||||||
"ownr_ph2",
|
|
||||||
"plate_no",
|
|
||||||
"ro_number",
|
|
||||||
"status",
|
|
||||||
"v_model_yr",
|
|
||||||
"v_make_desc",
|
|
||||||
"v_model_desc",
|
|
||||||
"v_vin"
|
|
||||||
]);
|
|
||||||
document.bodyshopid = req.body.event.data.new.shopid;
|
document.bodyshopid = req.body.event.data.new.shopid;
|
||||||
break;
|
break;
|
||||||
case "vehicles":
|
case "vehicles":
|
||||||
@@ -197,15 +178,18 @@ async function OpenSearchSearchHandler(req, res) {
|
|||||||
user: req.user.email
|
user: req.user.email
|
||||||
});
|
});
|
||||||
|
|
||||||
if (assocs.length === 0) {
|
if (assocs.associations.length === 0) {
|
||||||
res.sendStatus(401);
|
res.sendStatus(401);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const osClient = await getClient();
|
const osClient = await getClient();
|
||||||
|
|
||||||
|
const activeAssociation = assocs.associations[0];
|
||||||
const bodyShopIdMatchOverride = isNil(process.env.BODY_SHOP_ID_MATCH_OVERRIDE)
|
const bodyShopIdMatchOverride = isNil(process.env.BODY_SHOP_ID_MATCH_OVERRIDE)
|
||||||
? assocs.associations[0].shopid
|
? activeAssociation.shopid
|
||||||
: process.env.BODY_SHOP_ID_MATCH_OVERRIDE;
|
: process.env.BODY_SHOP_ID_MATCH_OVERRIDE;
|
||||||
|
const isReynoldsEnabled = Boolean(activeAssociation.bodyshop?.rr_dealerid);
|
||||||
|
|
||||||
const { body } = await osClient.search({
|
const { body } = await osClient.search({
|
||||||
...(index ? { index } : { index: ["jobs", "vehicles", "owners", "bills", "payments"] }),
|
...(index ? { index } : { index: ["jobs", "vehicles", "owners", "bills", "payments"] }),
|
||||||
@@ -241,21 +225,8 @@ async function OpenSearchSearchHandler(req, res) {
|
|||||||
query: `*${search}*`,
|
query: `*${search}*`,
|
||||||
// Weighted Fields
|
// Weighted Fields
|
||||||
fields: [
|
fields: [
|
||||||
"*ro_number^20",
|
...getGlobalSearchQueryStringFields({ isReynoldsEnabled })
|
||||||
"*clm_no^14",
|
// "*"
|
||||||
"*v_vin^12",
|
|
||||||
"*plate_no^12",
|
|
||||||
"*ownr_ln^10",
|
|
||||||
"transactionid^10",
|
|
||||||
"paymentnum^10",
|
|
||||||
"invoice_number^10",
|
|
||||||
"*ownr_fn^8",
|
|
||||||
"*ownr_co_nm^8",
|
|
||||||
"*ownr_ph1^8",
|
|
||||||
"*ownr_ph2^8",
|
|
||||||
"*vendor.name^8",
|
|
||||||
"*comment^6"
|
|
||||||
// "*"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
69
server/opensearch/os-search-config.js
Normal file
69
server/opensearch/os-search-config.js
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
/**
|
||||||
|
* Fields to be included in the job document indexed in OpenSearch. These fields are used for both indexing and
|
||||||
|
* searching.
|
||||||
|
* @type {string[]}
|
||||||
|
*/
|
||||||
|
const JOB_DOCUMENT_FIELDS = [
|
||||||
|
"id",
|
||||||
|
"bodyshopid",
|
||||||
|
"clm_no",
|
||||||
|
"clm_total",
|
||||||
|
"comment",
|
||||||
|
"dms_id",
|
||||||
|
"ins_co_nm",
|
||||||
|
"owner_owing",
|
||||||
|
"ownr_co_nm",
|
||||||
|
"ownr_fn",
|
||||||
|
"ownr_ln",
|
||||||
|
"ownr_ph1",
|
||||||
|
"ownr_ph2",
|
||||||
|
"plate_no",
|
||||||
|
"ro_number",
|
||||||
|
"status",
|
||||||
|
"v_model_yr",
|
||||||
|
"v_make_desc",
|
||||||
|
"v_model_desc",
|
||||||
|
"v_vin"
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fields to be included in the global search query string. These fields are used for constructing the search query.
|
||||||
|
* @type {string[]}
|
||||||
|
*/
|
||||||
|
const BASE_GLOBAL_SEARCH_QUERY_STRING_FIELDS = [
|
||||||
|
"*ro_number^20",
|
||||||
|
"*clm_no^14",
|
||||||
|
"*v_vin^12",
|
||||||
|
"*plate_no^12",
|
||||||
|
"*ownr_ln^10",
|
||||||
|
"transactionid^10",
|
||||||
|
"paymentnum^10",
|
||||||
|
"invoice_number^10",
|
||||||
|
"*ownr_fn^8",
|
||||||
|
"*ownr_co_nm^8",
|
||||||
|
"*ownr_ph1^8",
|
||||||
|
"*ownr_ph2^8",
|
||||||
|
"*vendor.name^8",
|
||||||
|
"*comment^6"
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the fields to be included in the global search query string. If Reynolds is enabled, it includes the dms_id
|
||||||
|
* field with a higher boost.
|
||||||
|
* @param param0
|
||||||
|
* @param param0.isReynoldsEnabled
|
||||||
|
* @returns {string[]}
|
||||||
|
*/
|
||||||
|
const getGlobalSearchQueryStringFields = ({ isReynoldsEnabled = false } = {}) => {
|
||||||
|
if (!isReynoldsEnabled) {
|
||||||
|
return BASE_GLOBAL_SEARCH_QUERY_STRING_FIELDS;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ["*dms_id^20", ...BASE_GLOBAL_SEARCH_QUERY_STRING_FIELDS];
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
JOB_DOCUMENT_FIELDS,
|
||||||
|
BASE_GLOBAL_SEARCH_QUERY_STRING_FIELDS,
|
||||||
|
getGlobalSearchQueryStringFields
|
||||||
|
};
|
||||||
21
server/opensearch/tests/os-search-config.test.js
Normal file
21
server/opensearch/tests/os-search-config.test.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
import { describe, expect, it } from "vitest";
|
||||||
|
import { createRequire } from "module";
|
||||||
|
|
||||||
|
const require = createRequire(import.meta.url);
|
||||||
|
const { JOB_DOCUMENT_FIELDS, BASE_GLOBAL_SEARCH_QUERY_STRING_FIELDS, getGlobalSearchQueryStringFields } = require(
|
||||||
|
"../os-search-config"
|
||||||
|
);
|
||||||
|
|
||||||
|
describe("os-search-config", () => {
|
||||||
|
it("indexes dms_id on job documents", () => {
|
||||||
|
expect(JOB_DOCUMENT_FIELDS).toContain("dms_id");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("includes dms_id in global search fields for Reynolds shops", () => {
|
||||||
|
expect(getGlobalSearchQueryStringFields({ isReynoldsEnabled: true })).toContain("*dms_id^20");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("keeps the default search fields unchanged for non-Reynolds shops", () => {
|
||||||
|
expect(getGlobalSearchQueryStringFields()).toEqual(BASE_GLOBAL_SEARCH_QUERY_STRING_FIELDS);
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user