From 2aa62e7d6ca0ce3cefdd32c4d30d4e91e2129ace Mon Sep 17 00:00:00 2001 From: Varun Date: Thu, 13 Mar 2025 13:04:46 +0530 Subject: [PATCH] changes --- src/controllers/tanksController.js | 569 +++++++++++++++++++++++------ 1 file changed, 463 insertions(+), 106 deletions(-) diff --git a/src/controllers/tanksController.js b/src/controllers/tanksController.js index 97da9b21..0e3f9f9a 100644 --- a/src/controllers/tanksController.js +++ b/src/controllers/tanksController.js @@ -2836,139 +2836,496 @@ async function calculateTotalPumpedWater(customerId, motorId, start_instance_id) } - exports.motorAction = async (req, reply) => { try { - const { customerId } = req.params; - const { action, motor_id: motorId, start_instance_id, phone, threshold_type, manual_threshold_time, manual_threshold_litres } = req.body; - - if (!motorId) throw new Error("Motor ID is required."); + const customerId = req.params.customerId; + const action = req.body.action; + const motorId = req.body.motor_id; + const start_instance_id = req.body.start_instance_id; + + // Define thresholds for water levels + const lowWaterThreshold = 5; // Low water level percentage threshold + //const highWaterThreshold = 90; // High water level percentage threshold + const highWaterThreshold = 70; // High water level percentage threshold + const veryHighWaterThreshold = 80; // Very High water level percentage threshold + const criticalHighWaterThreshold = 85; + // Ensure motor_id is provided + if (!motorId) { + throw new Error("Motor ID is required."); + } + // Get user FCM tokens const users = await User.findOne({ customerId }); - if (!users) return reply.status(404).send({ error: "User not found" }); + console.log("users",users) + + let loggedInUser = null; - let loggedInUser = users.phone === phone ? - { role: "Customer", name: users.username, phone: users.phone } : - users.staff?.staff?.find(staff => staff.phone === phone) ? - { role: "Staff", name: users.staff.staff.find(staff => staff.phone === phone).name, phone } : null; + if (users) { + if (users.phone === req.body.phone) { + loggedInUser = { role: "Customer", name: users.username, phone: users.phone }; + } else if (users.staff && users.staff.staff) { + const staffMember = users.staff.staff.find(staff => staff.phone === req.body.phone); + if (staffMember) { + loggedInUser = { role: "Staff", name: staffMember.name, phone: staffMember.phone }; + } + } + } - if (!loggedInUser) return reply.status(404).send({ error: "User not found" }); + if (!loggedInUser) { + console.log("User not found. Cannot proceed with motorStart event."); + return reply.status(404).send({ error: "User not found" }); // ✅ FIX: Ensure a response is returned + } - const fcmToken = users.fcmIds ? users.fcmIds.filter(id => id) : []; + const fcmToken = users.fcmIds ? users.fcmIds.filter(fcmIds => fcmIds) : []; + + // const fcmToken = users.map(user => user.fcmIds).filter(fcmIds => fcmIds); + console.log(fcmToken) const receiverTank = await Tank.findOne({ customerId, tankName: req.body.to, tankLocation: req.body.to_type.toLowerCase() }); - if (!receiverTank) throw new Error("Receiver tank not found."); - + console.log(receiverTank) + const currentWaterLevel = parseInt(receiverTank.waterlevel, 10); + const waterLevelThresholds = { low: 30, veryLow: 20, criticallyLow: 10 }; const typeOfWater = receiverTank.typeOfWater; - let motorStopStatus = action === "start" ? "2" : "1"; - const blockName = req.body.from || "Unknown Block"; - const tankName = req.body.to || "Unknown Tank"; - - if (motorIntervals[motorId]) { - clearInterval(motorIntervals[motorId]); - delete motorIntervals[motorId]; - } - + console.log(typeOfWater,"typeOfWater") + + // Determine the motor stop status based on the action + let motorStopStatus; + const blockName = req.body.from || "Unknown Block"; // Provide a fallback if `from` is missing + const tankName = req.body.to || "Unknown Tank"; // Provide a fallback if `to` is missing + const stopTime = req.body.stopTime + const motorOnType = "manual"; + const manual_threshold_time = req.body.manual_threshold_time; + let hasNotifiedStart = false; + let hasNotifiedStop = false; if (action === "start") { - const startTime = moment().tz('Asia/Kolkata').format('DD-MMM-YYYY - HH:mm'); - - const newMotorData = new MotorData({ - customerId, - motor_id: motorId, - start_instance_id, - supplierTank: req.body.from, - receiverTank: req.body.to, - supplier_type: req.body.from_type, - receiver_type: req.body.to_type, - startTime, - receiverInitialwaterlevel: parseInt(receiverTank.waterlevel.replace(/,/g, ''), 10) - }); - await newMotorData.save(); - + motorStopStatus = "2"; + const startTime = req.body.startTime; await Tank.updateOne( { customerId, "connections.inputConnections.motor_id": motorId }, - { $set: { - "connections.inputConnections.$.motor_stop_status": "2", - "connections.inputConnections.$.manual_threshold_time": manual_threshold_time, - "connections.inputConnections.$.threshold_type": threshold_type, - "connections.inputConnections.$.motor_on_type": "manual" - }} + { $set: { "connections.inputConnections.$.motor_stop_status": motorStopStatus } } ); - - eventEmitter.emit("motorStart", customerId, fcmToken, tankName, blockName, startTime, "Mobile APP", manual_threshold_time, typeOfWater, motorId, loggedInUser.phone); - this.publishMotorStopStatus(motorId, motorStopStatus); + const thresholdTimeMs = req.body.manual_threshold_time * 60 * 1000; // Convert minutes to milliseconds + const stopCriteria = + motorOnType === "time" + ? `${req.body.manual_threshold_time} minutes` + : `${req.body.manual_threshold_litres} litres`; + try { + eventEmitter.emit( + "motorStart", + customerId, + fcmToken, + tankName, + blockName, + startTime, + "Mobile APP", + manual_threshold_time, + typeOfWater, + motorId, + loggedInUser.phone, + ); + + reply.code(200).send({ message: "Motor started successfully." }); + } catch (error) { + console.error("Error in handleMotorStart:", error); + reply.code(500).send({ error: "Internal Server Error" }); + } + + // Start checking water level every 30 minutes + if (!waterLevelCheckInterval) { + waterLevelCheckInterval = setInterval(async () => { + await checkWaterLevel(customerId, motorId, fcmToken, receiverTank); + }, 30 * 60 * 1000); // 30 minutes + } + await Tank.updateOne( + { customerId, "connections.inputConnections.motor_id": motorId }, + { $set: { "connections.inputConnections.$.motor_stop_status": "2", + "connections.inputConnections.$.manual_threshold_time": manual_threshold_time, + "connections.inputConnections.$.threshold_type": "time", + "connections.inputConnections.$.motor_on_type": "manual" } } + ); + reply.code(200).send({ message: "Motor started successfully." }); + + } else if (action === "stop") { + motorStopStatus = "1"; // If action is stop, set stop status to "1" - if (threshold_type === "time") { - const thresholdTime = new Date(new Date().getTime() + manual_threshold_time * 60000); - motorIntervals[motorId] = setInterval(async () => { + try { + + + const totalWaterPumped = await calculateTotalPumpedWater(customerId, motorId, start_instance_id); + + eventEmitter.emit("motorStop", customerId, fcmToken, tankName, blockName, stopTime, "Mobile APP", totalWaterPumped, typeOfWater, motorId, + loggedInUser.phone,); + + reply.code(200).send({ message: "Motor stopped successfully." }); + } catch (error) { + console.error("Error in handleMotorStop:", error); + reply.code(500).send({ error: "Internal Server Error" }); + } + + + await Tank.updateOne( + { customerId, "connections.inputConnections.motor_id": motorId }, + { + $set: { + "connections.inputConnections.$.motor_stop_status": "1", + "connections.inputConnections.$.motor_on_type": motorOnType } + } + ); + // Clear the interval when the motor is stopped + if (waterLevelCheckInterval) { + clearInterval(waterLevelCheckInterval); + waterLevelCheckInterval = null; // Reset the interval ID + } + } else { + throw new Error("Invalid action provided."); + } + + // If action is stop, immediately update motor status and perform stop operations + if (action === "stop") { + console.log("enterted stop") + await Tank.updateOne( + { customerId, "connections.inputConnections.motor_id": motorId }, + { + $set: { + "connections.inputConnections.$.motor_stop_status": "1", + "connections.inputConnections.$.motor_on_type": "manual", + "connections.inputConnections.$.stopTime": req.body.stopTime, + "connections.inputConnections.$.threshold_type": null, + "connections.inputConnections.$.manual_threshold_time": null, + "connections.inputConnections.$.manual_threshold_percentage": null + } + } + ); + if (motorIntervals[motorId]) { + console.log(motorIntervals[motorId],"deleted") + clearInterval(motorIntervals[motorId]); // Clear the interval + delete motorIntervals[motorId]; // Remove the interval from the object + } + this.publishMotorStopStatus(motorId, motorStopStatus); + + // Send immediate response to the client + reply.code(200).send({ message: "Motor stopped successfully." }); + + // Perform stop operations in the background + (async () => { + + console.log(start_instance_id,"start_instance_id",customerId,"customerId",motorId,"motorId") + const motorData = await MotorData.findOne({ customerId, motor_id: motorId, start_instance_id: start_instance_id }); + if (motorData) { + console.log("entered if in stop") + const receiverTank = await Tank.findOne({ customerId, tankName: motorData.receiverTank, tankLocation: motorData.receiver_type.toLowerCase() }); + const receiverFinalWaterLevel = parseInt(receiverTank.waterlevel, 10); + const quantityDelivered = receiverFinalWaterLevel - parseInt(motorData.receiverInitialwaterlevel, 10); + const water_pumped_till_now = parseInt(receiverTank.total_water_added_from_midnight, 10); + const totalwaterpumped = quantityDelivered + water_pumped_till_now; + + await Tank.findOneAndUpdate( + { customerId, tankName: motorData.receiverTank, tankLocation: motorData.receiver_type.toLowerCase() }, + { $set: { total_water_added_from_midnight: totalwaterpumped } } + ); + + await MotorData.updateOne( + { customerId, motor_id: motorId, start_instance_id: start_instance_id }, + { + $set: { + stopTime: req.body.stopTime, + receiverfinalwaterlevel: receiverFinalWaterLevel.toString(), + quantity_delivered: quantityDelivered.toString() + } + } + ); + } + })(); + + return; // Return early to avoid executing the start logic + } else { + await Tank.updateOne( + { customerId, "connections.inputConnections.motor_id": motorId }, + { $set: { "connections.inputConnections.$.motor_stop_status": "2" } } + ); + } + + // Check threshold settings if action is start + if (action === "start") { + if (req.body.threshold_type === "time") { + // Create a new MotorData entry + const receiverTank = await Tank.findOne({ customerId, tankName: req.body.to, tankLocation: req.body.to_type.toLowerCase() }); + const newMotorData = new MotorData({ + customerId, + motor_id: motorId, + start_instance_id: start_instance_id, + supplierTank: req.body.from, + receiverTank: req.body.to, + supplier_type: req.body.from_type, + receiver_type: req.body.to_type, + startTime: req.body.startTime, + receiverInitialwaterlevel: parseInt(receiverTank.waterlevel, 10) + }); + await newMotorData.save(); + console.log("entered time",motorId,motorStopStatus) + // Update the tank connections with start time and threshold time + for await (const tank of Tank.find({ "connections.inputConnections.motor_id": motorId })) { + this.publishMotorStopStatus(motorId, motorStopStatus); + for await (const tank of Tank.find({ "connections.inputConnections.motor_id": motorId })) { + const index = tank.connections.inputConnections.findIndex(connection => connection.motor_id === motorId); + + if (index !== -1) { + await Tank.updateOne( + { customerId, "connections.inputConnections.motor_id": motorId }, + { + $set: { + [`connections.inputConnections.${index}.manual_threshold_time`]: req.body.manual_threshold_time, + [`connections.inputConnections.${index}.threshold_type`]: "time", + [`connections.inputConnections.${index}.startTime`]: req.body.startTime, + [`connections.inputConnections.${index}.start_instance_id`]: start_instance_id + } + } + ); + } + } + + const thresholdTime = new Date(new Date().getTime() + req.body.manual_threshold_time * 60000); + motorIntervals[motorId] = setInterval(async () => { const supplierTank = await Tank.findOne({ customerId, tankName: req.body.from, tankLocation: req.body.from_type.toLowerCase() }); - const currentWaterLevel = parseInt(supplierTank.waterlevel.replace(/,/g, ''), 10); + const currentWaterLevel = parseInt(supplierTank.waterlevel, 10); + const currentWaterPercentage = (currentWaterLevel / parseInt(supplierTank.capacity.replace(/,/g, ''), 10)) * 100; const notificationTracker = new Map(); - if (new Date() >= thresholdTime) { - console.log("Threshold time reached. Stopping motor."); - clearInterval(motorIntervals[motorId]); - delete motorIntervals[motorId]; - await stopMotor(motorId, customerId, start_instance_id); + if (new Date() >= thresholdTime || currentWaterPercentage <= lowWaterThreshold) { + console.log(new Date(),"new date") + console.log(thresholdTime,"thresholdTime") + console.log("motor stopping because it entered this condition") + // Emit the threshold time notification + + // eventEmitter.emit( + // "sendThresholdTimeNotification", + // customerId, + // fcmToken, + // manual_threshold_time, + // motorId, + // tankName, + // blockName + // ); + + const notificationKey = `${customerId}_${motorId}_threshold`; + + // Check if the notification has already been sent + if (!notificationTracker.get(notificationKey)) { + console.log("Sending threshold time notification..."); + + eventEmitter.emit( + "sendThresholdTimeNotification", + customerId, + fcmToken, + manual_threshold_time, + motorId, + tankName, + blockName + ); + + // Mark notification as sent + notificationTracker.set(notificationKey, true); + + // Optionally, reset the flag after some time (e.g., 24 hours) + setTimeout(() => { + notificationTracker.delete(notificationKey); + }, 24 * 60 * 60 * 1000); // Reset after 24 hours + } else { + console.log("Notification already sent, skipping..."); + } + + const currentTime = moment().tz('Asia/Kolkata').format('DD-MMM-YYYY - HH:mm'); + await Tank.updateOne( + { customerId, "connections.inputConnections.motor_id": motorId }, + { + $set: { + "connections.inputConnections.$.motor_stop_status": "1", + + "connections.inputConnections.$.threshold_type": null, + "connections.inputConnections.$.manual_threshold_time": null, + "connections.inputConnections.$.manual_threshold_percentage": null, + "connections.inputConnections.$.stopTime": currentTime, + } + } + ); + // eventEmitter.emit('sendLowWaterNotification', fcmToken, receiverTank); + // console.log(motorIntervals[motorId],"deleted automatically") // Emit low water level notification + // clearInterval(motorIntervals[motorId]); // Clear interval + // delete motorIntervals[motorId]; + + // await checkWaterLevelsAndNotify(customerId, tankName, supplierTank.tankLocation, fcmToken); + // if (currentWaterPercentage >= highWaterThreshold && !notificationSentStatus.highWater) { + // eventEmitter.emit('sendHighWaterNotification', fcmToken, `Water level has reached high levels.`); + // notificationSentStatus.highWater = true; // Set flag to true to prevent duplicate notifications + // } + + // if (currentWaterPercentage >= veryHighWaterThreshold && !notificationSentStatus.veryHighWater) { + // eventEmitter.emit('sendVeryHighWaterNotification', fcmToken, `Water level has reached very high levels.`); + // notificationSentStatus.veryHighWater = true; // Set flag to true to prevent duplicate notifications + // } + + // if (currentWaterPercentage >= criticalHighWaterThreshold && !notificationSentStatus.criticallyHighWater) { + // eventEmitter.emit('sendCriticalHighWaterNotification', fcmToken, `Water level has reached critically high levels.`); + // notificationSentStatus.criticallyHighWater = true; // Set flag to true to prevent duplicate notifications + // } + clearInterval(motorIntervals[motorId]); // Stop the motor if condition met + delete motorIntervals[motorId]; // Remove from interval object + + this.publishMotorStopStatus(motorId, "1"); + console.log(start_instance_id,"start_instance_id",customerId,"customerId",motorId,"motorId") + + const motorData = await MotorData.findOne({ customerId, motor_id: motorId, start_instance_id: start_instance_id }); + console.log(motorData,"motorData") + if (motorData) { + console.log("got into if") + const receiverTank = await Tank.findOne({ customerId, tankName: motorData.receiverTank, tankLocation: motorData.receiver_type.toLowerCase() }); + const receiverFinalWaterLevel = parseInt(receiverTank.waterlevel, 10); + const quantityDelivered = receiverFinalWaterLevel - parseInt(motorData.receiverInitialwaterlevel, 10); + const water_pumped_till_now = parseInt(receiverTank.total_water_added_from_midnight, 10); + const totalwaterpumped = quantityDelivered + water_pumped_till_now; + + await Tank.findOneAndUpdate( + { customerId, tankName: motorData.receiverTank, tankLocation: motorData.receiver_type.toLowerCase() }, + { $set: { total_water_added_from_midnight: totalwaterpumped } } + ); + + await MotorData.updateOne( + { customerId, motor_id: motorId, start_instance_id: start_instance_id }, + { + $set: { + stopTime: currentTime, + receiverfinalwaterlevel: receiverFinalWaterLevel.toString(), + quantity_delivered: quantityDelivered.toString() + } + } + ); + } } - }, 30000); - } else if (threshold_type === "litres") { + + // Check for high water level and send notification + // if (currentWaterPercentage >= highWaterThreshold) { + // // eventEmitter.emit('sendHighWaterNotification', fcmToken, receiverTank); + // await checkWaterLevelsAndNotify(customerId, tankName, supplierTank.tankLocation, fcmToken); + + // } + + }, 30000); // Check every minute + } + }else if (req.body.threshold_type === "litres") { + console.log("entered litres") + const receiver_tank_info7 = await Tank.findOne({ customerId, tankName: req.body.to, tankLocation: req.body.to_type.toLowerCase() }); + const supplier_tank_info7 = await Tank.findOne({ customerId, tankName: req.body.from, tankLocation: req.body.from_type.toLowerCase() }); + + const newMotorData = new MotorData({ + customerId: customerId, + motor_id: motorId, + start_instance_id: start_instance_id, + supplierTank: req.body.from, + receiverTank: req.body.to, + supplier_type: req.body.from_type, + receiver_type: req.body.to_type, + startTime: req.body.startTime, + receiverInitialwaterlevel:parseInt(receiver_tank_info7.waterlevel, 10), + supplierInitialwaterlevel:parseInt(supplier_tank_info7.waterlevel, 10) + }); + await newMotorData.save(); + // If threshold type is percentage, calculate percentage threshold + const receiver_tank_info = await Tank.findOne({ customerId, tankName: req.body.to, tankLocation: req.body.to_type.toLowerCase() }); + const supplier_tank_info = await Tank.findOne({ customerId, tankName: req.body.from, tankLocation: req.body.from_type.toLowerCase() }); + if (!receiver_tank_info) { + throw new Error("Receiver tank not found."); + } + if (!supplier_tank_info) { + throw new Error("Supplierr tank not found."); + } + const supplier_capacity = parseInt(supplier_tank_info.capacity, 10); + const supplier_waterLevel = parseInt(supplier_tank_info.waterlevel, 10); + + const capacity = parseInt(receiver_tank_info.capacity, 10); + const waterLevel = parseInt(receiver_tank_info.waterlevel, 10); + const desired_percentage = parseInt(req.body.manual_threshold_litres.replace(/,/g, ''), 10); + + console.log(desired_percentage) + const threshold_water_level = waterLevel+desired_percentage; + + const supplier_threshold = supplier_waterLevel-desired_percentage + console.log(supplier_threshold,"supplier_threshold") + for await (const tank of Tank.find({ "connections.inputConnections.motor_id": motorId })) { + this.publishMotorStopStatus(motorId, motorStopStatus); + for await (const tank of Tank.find({ "connections.inputConnections.motor_id": motorId })) { + const index = tank.connections.inputConnections.findIndex(connection => connection.motor_id === motorId); + if (index !== -1) { + await Tank.updateOne( + { customerId, "connections.inputConnections.motor_id": motorId }, + { $set: { [`connections.inputConnections.${index}.manual_threshold_percentage`]: supplier_threshold.toString(), [`connections.inputConnections.${index}.startTime`]: req.body.startTime } } + ); + } + } + + + + // Update water level threshold + + + // Start monitoring water level based on threshold percentage motorIntervals[motorId] = setInterval(async () => { - const receiverTank = await Tank.findOne({ customerId, tankName: req.body.to, tankLocation: req.body.to_type.toLowerCase() }); - const currentWaterLevel = parseInt(receiverTank.waterlevel.replace(/,/g, ''), 10); - const thresholdWaterLevel = currentWaterLevel + parseInt(manual_threshold_litres.replace(/,/g, ''), 10); - if (currentWaterLevel >= thresholdWaterLevel) { - clearInterval(motorIntervals[motorId]); - delete motorIntervals[motorId]; - await stopMotor(motorId, customerId, start_instance_id); + // Check if water level has reached the threshold percentage + const supplier_tank_info1 = await Tank.findOne({ customerId, tankName: req.body.from, tankLocation: req.body.from_type.toLowerCase() }); + const current_water_level = parseInt(supplier_tank_info1.waterlevel, 10); + if (current_water_level <= supplier_threshold) { + // Stop the motor pump + await Tank.updateOne( + { customerId, "connections.inputConnections.motor_id": motorId }, + { + $set: { + "connections.inputConnections.$.motor_stop_status": "1", + + "connections.inputConnections.$.threshold_type": null, + "connections.inputConnections.$.manual_threshold_time": null, + "connections.inputConnections.$.manual_threshold_percentage": null + } + } + ); + clearInterval(motorIntervals[motorId]); // Clear interval + delete motorIntervals[motorId]; + + this.publishMotorStopStatus(motorId, "1"); + await delay(300000); + + const motorData = await MotorData.findOne({ customerId, motor_id: motorId, start_instance_id: start_instance_id }); + if (motorData) { + const receiverTank = await Tank.findOne({ customerId, tankName: motorData.receiverTank, tankLocation: motorData.receiver_type.toLowerCase() }); + const receiverFinalWaterLevel = parseInt(receiverTank.waterlevel, 10); + const quantityDelivered = receiverFinalWaterLevel - parseInt(motorData.receiverInitialwaterlevel, 10); + + + const stopTime = formatDate(new Date()); + + await MotorData.updateOne( + { customerId, motor_id: motorId, start_instance_id: start_instance_id }, + { + $set: { + stopTime:stopTime, + receiverfinalwaterlevel: receiverFinalWaterLevel.toString(), + quantity_delivered: quantityDelivered.toString() + } + } + ); + } } - }, 30000); + }, 20000); } - } else if (action === "stop") { - await stopMotor(motorId, customerId, start_instance_id); - this.publishMotorStopStatus(motorId, motorStopStatus); - reply.code(200).send({ message: "Motor stopped successfully." }); } - } catch (err) { - throw boom.boomify(err); - } -}; -async function stopMotor(motorId, customerId, start_instance_id) { - const currentTime = moment().tz('Asia/Kolkata').format('DD-MMM-YYYY - HH:mm'); - await Tank.updateOne( - { customerId, "connections.inputConnections.motor_id": motorId }, - { $set: { - "connections.inputConnections.$.motor_stop_status": "1", - "connections.inputConnections.$.stopTime": currentTime, - "connections.inputConnections.$.threshold_type": null, - "connections.inputConnections.$.manual_threshold_time": null, - "connections.inputConnections.$.manual_threshold_percentage": null - }} - ); - - if (motorIntervals[motorId]) { - clearInterval(motorIntervals[motorId]); - delete motorIntervals[motorId]; - } - eventEmitter.emit("motorStop", customerId, [], "", "", currentTime, "Mobile APP", 0, "", motorId, ""); - - const motorData = await MotorData.findOne({ customerId, motor_id: motorId, start_instance_id }); - if (motorData) { - const startTime = moment(motorData.startTime, 'DD-MMM-YYYY - HH:mm'); - const runtime = moment.duration(moment(currentTime, 'DD-MMM-YYYY - HH:mm').diff(startTime)).asSeconds(); - - const receiverTank = await Tank.findOne({ customerId, tankName: motorData.receiverTank, tankLocation: motorData.receiver_type.toLowerCase() }); - const receiverFinalWaterLevel = parseInt(receiverTank.waterlevel.replace(/,/g, ''), 10); - const quantityDelivered = receiverFinalWaterLevel - parseInt(motorData.receiverInitialwaterlevel.replace(/,/g, ''), 10); + } + // Respond with success message + reply.code(200).send({ message: `Motor ${action === "start" ? "started" : "stopped"} successfully.` }); - await MotorData.updateOne( - { customerId, motor_id: motorId, start_instance_id }, - { $set: { stopTime: currentTime, receiverfinalwaterlevel: receiverFinalWaterLevel.toString(), quantity_delivered: quantityDelivered.toString(), runtime: runtime } } - ); + } catch (err) { + throw boom.boomify(err); } -} +};