feature/IO-3096-GlobalNotifications - Checkpoint, BULLMQ!

This commit is contained in:
Dave Richer
2025-02-13 16:19:36 -05:00
parent 5cfadf7929
commit df13f257db
13 changed files with 887 additions and 747 deletions

View File

@@ -9,6 +9,7 @@ const { client: gqlClient } = require("../graphql-client/graphql-client");
const queries = require("../graphql-client/queries");
const { isEmpty, isFunction } = require("lodash");
const { getMatchingScenarios } = require("./scenarioMapperr");
const emailQueue = require("./queues/emailQueue");
/**
* Parses an event and determines matching scenarios for notifications.
@@ -80,6 +81,8 @@ const scenarioParser = async (req, jobIdField) => {
// console.log(`3`);
const bodyShopId = watcherData?.job?.bodyshop?.id;
const bodyShopName = watcherData?.job?.bodyshop?.shopname;
const jobRoNumber = watcherData?.job?.ro_number;
const jobClaimNumber = watcherData?.job?.clm_no;
if (!bodyShopId || !bodyShopName) {
throw new Error("No bodyshop data found for this job.");
@@ -149,6 +152,9 @@ const scenarioParser = async (req, jobIdField) => {
// Step 7: Trigger scenario builders for matching scenarios with eligible watchers.
// console.log(`7`);
const scenariosToDispatch = [];
for (const scenario of finalScenarioData.matchingScenarios) {
if (isEmpty(scenario.scenarioWatchers) || !isFunction(scenario.builder)) {
continue;
@@ -171,25 +177,45 @@ const scenarioParser = async (req, jobIdField) => {
// Step 8: Filter scenario fields to only include changed fields.
// console.log(`8`);
const filteredScenarioFields =
scenario.fields?.filter((field) => eventData.changedFieldNames.includes(field)) || [];
scenario.builder({
trigger: finalScenarioData.trigger.name,
bodyShopId: finalScenarioData.bodyShopId,
bodyShopName: finalScenarioData.bodyShopName,
scenarioKey: scenario.key,
scenarioTable: scenario.table,
scenarioFields: filteredScenarioFields,
scenarioBuilder: scenario.builder,
scenarioWatchers: eligibleWatchers,
jobId: finalScenarioData.jobId,
isNew: finalScenarioData.isNew,
changedFieldNames: finalScenarioData.changedFieldNames,
changedFields: finalScenarioData.changedFields,
data: finalScenarioData.data
});
scenariosToDispatch.push(
scenario.builder({
trigger: finalScenarioData.trigger.name,
bodyShopId: finalScenarioData.bodyShopId,
bodyShopName: finalScenarioData.bodyShopName,
scenarioKey: scenario.key,
scenarioTable: scenario.table,
scenarioFields: filteredScenarioFields,
scenarioBuilder: scenario.builder,
scenarioWatchers: eligibleWatchers,
jobId: finalScenarioData.jobId,
jobRoNumber: jobRoNumber,
jobClaimNumber: jobClaimNumber,
isNew: finalScenarioData.isNew,
changedFieldNames: finalScenarioData.changedFieldNames,
changedFields: finalScenarioData.changedFields,
data: finalScenarioData.data
})
);
}
if (isEmpty(scenariosToDispatch)) {
return;
}
// Step 9: Dispatch Email Notifications to the Email Notification Queue
// console.log(`8`);
const emailsToDispatch = scenariosToDispatch.map((scenario) => scenario.email);
// Step 10: Dispatch App Notifications to the App Notification Queue
const appsToDispatch = scenariosToDispatch.map((scenario) => scenario.app);
// TODO: Test Code for Queues
// emailQueue().add("test", { data: "test" });
};
module.exports = scenarioParser;