diff --git a/server/job/job-updated.js b/server/job/job-updated.js new file mode 100644 index 000000000..87ed23640 --- /dev/null +++ b/server/job/job-updated.js @@ -0,0 +1,32 @@ +const { isObject } = require("lodash"); + +const jobUpdated = async (req, res) => { + const { ioRedis, logger } = req; + + if (!req?.body?.event?.data?.new || !isObject(req?.body?.event?.data?.new)) { + logger.log("job-update-error", "ERROR", req.user?.email, null, { + message: `Malformed Job Update request sent from Hasura`, + body: req?.body + }); + + return res.json({ + status: "error", + message: `Malformed Job Update request sent from Hasura` + }); + } + + logger.log("job-update", "INFO", req.user?.email, null, { + message: `Job updated event received from Hasura`, + jobid: req?.body?.event?.data?.new?.id + }); + + const updatedJob = req.body.event.data.new; + const bodyshopID = updatedJob.shopid; + + // Emit the job-updated event only to the room corresponding to the bodyshop + ioRedis.to(bodyshopID).emit("job-updated", updatedJob); + + return res.json({ message: "Job updated and event emitted" }); +}; + +module.exports = jobUpdated; diff --git a/server/job/job.js b/server/job/job.js index 0dc54c041..dc8640a98 100644 --- a/server/job/job.js +++ b/server/job/job.js @@ -14,3 +14,4 @@ exports.costing = require("./job-costing").JobCosting; exports.costingmulti = require("./job-costing").JobCostingMulti; exports.statustransition = require("./job-status-transition").statustransition; exports.lifecycle = require("./job-lifecycle"); +exports.jobUpdated = require("./job-updated"); diff --git a/server/routes/jobRoutes.js b/server/routes/jobRoutes.js index 1b655aa9f..6a83271dd 100644 --- a/server/routes/jobRoutes.js +++ b/server/routes/jobRoutes.js @@ -5,7 +5,7 @@ const ppc = require("../ccc/partspricechange"); const { partsScan } = require("../parts-scan/parts-scan"); const eventAuthorizationMiddleware = require("../middleware/eventAuthorizationMIddleware"); const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware"); -const { totals, statustransition, totalsSsu, costing, lifecycle, costingmulti } = require("../job/job"); +const { totals, statustransition, totalsSsu, costing, lifecycle, costingmulti, jobUpdated } = require("../job/job"); const withUserGraphQLClientMiddleware = require("../middleware/withUserGraphQLClientMiddleware"); router.post("/totals", validateFirebaseIdTokenMiddleware, withUserGraphQLClientMiddleware, totals); @@ -16,5 +16,6 @@ router.post("/lifecycle", validateFirebaseIdTokenMiddleware, withUserGraphQLClie router.post("/costingmulti", validateFirebaseIdTokenMiddleware, withUserGraphQLClientMiddleware, costingmulti); router.post("/partsscan", validateFirebaseIdTokenMiddleware, withUserGraphQLClientMiddleware, partsScan); router.post("/ppc", validateFirebaseIdTokenMiddleware, withUserGraphQLClientMiddleware, ppc.generatePpc); +router.post("/job-updated", eventAuthorizationMiddleware, jobUpdated); module.exports = router;