feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint
This commit is contained in:
@@ -1,63 +1,59 @@
|
||||
// server/rr/rr-config.js
|
||||
// Build RR client configuration from bodyshop settings or env
|
||||
|
||||
function requireString(v, name) {
|
||||
const s = (v ?? "").toString().trim();
|
||||
if (!s || s.toLowerCase() === "undefined" || s.toLowerCase() === "null") {
|
||||
throw new Error(`RR config missing: ${name}`);
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads per-bodyshop RR routing from Hasura.
|
||||
* Expected table fields (adapt if your schema differs):
|
||||
* - bodyshops.id = $bodyshopId
|
||||
* - bodyshops.rr_dealerid (string)
|
||||
* - bodyshops.rr_configuration JSON { storeNumber?, branchNumber? }
|
||||
* Extract RR connection + routing from a bodyshop record (preferred)
|
||||
* Falls back to process.env for any missing bits.
|
||||
*
|
||||
* Requires env:
|
||||
* HASURA_GRAPHQL_ENDPOINT, HASURA_ADMIN_SECRET
|
||||
* Bodyshop fields expected:
|
||||
* - rr_dealerid -> dealerNumber
|
||||
* - rr_configuration: { storeNumber, branchNumber } -> storeNumber, areaNumber
|
||||
*
|
||||
* Env fallbacks:
|
||||
* RR_BASE_URL, RR_USERNAME, RR_PASSWORD,
|
||||
* RR_DEALER_NUMBER, RR_STORE_NUMBER, RR_BRANCH_NUMBER
|
||||
*/
|
||||
const { GraphQLClient, gql } = require("graphql-request");
|
||||
function getRRConfigFromBodyshop(bodyshop) {
|
||||
const baseUrl = process.env.RR_BASE_URL;
|
||||
const username = process.env.RR_USERNAME;
|
||||
const password = process.env.RR_PASSWORD;
|
||||
|
||||
const HASURA_URL = process.env.HASURA_GRAPHQL_ENDPOINT || process.env.HASURA_URL;
|
||||
const HASURA_SECRET = process.env.HASURA_ADMIN_SECRET || process.env.HASURA_GRAPHQL_ADMIN_SECRET;
|
||||
// NOTE: your schema uses rr_dealerid and rr_configuration JSON
|
||||
const dealerNumber = bodyshop?.rr_dealerid ?? process.env.RR_DEALER_NUMBER;
|
||||
|
||||
if (!HASURA_URL || !HASURA_SECRET) {
|
||||
// Warn loudly at startup; you can hard fail if you prefer
|
||||
console.warn("[RR] HASURA env not set (HASURA_GRAPHQL_ENDPOINT / HASURA_ADMIN_SECRET).");
|
||||
const bsCfg = bodyshop?.rr_configuration || {};
|
||||
const storeNumber =
|
||||
bsCfg?.storeNumber ??
|
||||
bodyshop?.rr_store_number ?? // legacy fallback if present
|
||||
process.env.RR_STORE_NUMBER;
|
||||
|
||||
const areaNumber =
|
||||
bsCfg?.branchNumber ??
|
||||
bsCfg?.areaNumber ?? // accept either key
|
||||
bodyshop?.rr_branch_number ?? // legacy fallback if present
|
||||
process.env.RR_BRANCH_NUMBER;
|
||||
|
||||
return {
|
||||
baseUrl: requireString(baseUrl, "baseUrl"),
|
||||
username: requireString(username, "username"),
|
||||
password: requireString(password, "password"),
|
||||
routing: {
|
||||
dealerNumber: requireString(String(dealerNumber), "routing.dealerNumber"),
|
||||
storeNumber: requireString(String(storeNumber), "routing.storeNumber"),
|
||||
areaNumber: requireString(String(areaNumber), "routing.areaNumber")
|
||||
},
|
||||
// timeouts / retries can be adjusted here
|
||||
timeoutMs: Number(process.env.RR_TIMEOUT_MS || 30000),
|
||||
retries: { max: Number(process.env.RR_RETRIES_MAX || 2) }
|
||||
};
|
||||
}
|
||||
|
||||
const client = HASURA_URL
|
||||
? new GraphQLClient(HASURA_URL, {
|
||||
headers: { "x-hasura-admin-secret": HASURA_SECRET }
|
||||
})
|
||||
: null;
|
||||
|
||||
const Q_BODYSHOP_RR = gql`
|
||||
query RR_Config($id: uuid!) {
|
||||
bodyshops_by_pk(id: $id) {
|
||||
id
|
||||
rr_dealerid
|
||||
rr_configuration
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
||||
/**
|
||||
* @param {string} bodyshopId
|
||||
* @returns {Promise<{dealerNumber:string, storeNumber?:string, areaNumber?:string}>}
|
||||
*/
|
||||
async function getRRConfigForBodyshop(bodyshopId) {
|
||||
if (!client) throw new Error("Hasura client not configured.");
|
||||
|
||||
const data = await client.request(Q_BODYSHOP_RR, { id: bodyshopId });
|
||||
const row = data?.bodyshops_by_pk;
|
||||
if (!row) throw new Error(`Bodyshop not found: ${bodyshopId}`);
|
||||
|
||||
const dealerNumber = row.rr_dealerid;
|
||||
|
||||
const cfg = row.rr_configuration || {};
|
||||
|
||||
if (!dealerNumber) {
|
||||
throw new Error(`RR not configured for bodyshop ${bodyshopId} (missing rr_dealerid).`);
|
||||
}
|
||||
|
||||
// The RR client expects "areaNumber" (Rome "branch")
|
||||
const storeNumber = cfg.storeNumber || cfg.store_no || cfg.store || null;
|
||||
const areaNumber = cfg.branchNumber || cfg.branch_no || cfg.branch || null;
|
||||
|
||||
return { dealerNumber, storeNumber, areaNumber };
|
||||
}
|
||||
|
||||
module.exports = { getRRConfigForBodyshop };
|
||||
module.exports = { getRRConfigFromBodyshop };
|
||||
|
||||
Reference in New Issue
Block a user