|
|
|
@ -1036,6 +1036,7 @@ exports.mastrerList = async (req, reply) => {
|
|
|
|
|
//const moment = require('moment'); // For time calculations
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exports.getMasterSlaveSummary = async (req, reply) => {
|
|
|
|
|
try {
|
|
|
|
|
const { customerId } = req.params;
|
|
|
|
@ -1049,86 +1050,44 @@ exports.getMasterSlaveSummary = async (req, reply) => {
|
|
|
|
|
const masters = allDevices.filter(device => device.type === 'master');
|
|
|
|
|
const slaves = allDevices.filter(device => device.type === 'slave');
|
|
|
|
|
|
|
|
|
|
// Update connection status and timestamps
|
|
|
|
|
const updateStatusPromises = allDevices.map(async device => {
|
|
|
|
|
let checkHardwareId;
|
|
|
|
|
|
|
|
|
|
if (device.type === 'master') {
|
|
|
|
|
checkHardwareId = device.hardwareId?.trim();
|
|
|
|
|
} else if (device.type === 'slave') {
|
|
|
|
|
checkHardwareId = device.hardwareId?.trim(); // Use slave's own hardwareId
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!checkHardwareId) return;
|
|
|
|
|
const enrichDeviceWithTimestamp = async (device) => {
|
|
|
|
|
const hardwareId = device.hardwareId?.trim();
|
|
|
|
|
if (!hardwareId) return device.toObject();
|
|
|
|
|
|
|
|
|
|
const latestData = await IotData.findOne({ hardwareId: checkHardwareId })
|
|
|
|
|
const latestData = await IotData.findOne({ hardwareId })
|
|
|
|
|
.sort({ date: -1 })
|
|
|
|
|
.lean();
|
|
|
|
|
|
|
|
|
|
let status = "disconnected";
|
|
|
|
|
const updateFields = {};
|
|
|
|
|
const enriched = device.toObject();
|
|
|
|
|
|
|
|
|
|
if (latestData?.date) {
|
|
|
|
|
const now = moment();
|
|
|
|
|
const lastSeen = moment(latestData.date);
|
|
|
|
|
const diff = now.diff(lastSeen, 'minutes');
|
|
|
|
|
|
|
|
|
|
if (diff <= 10) {
|
|
|
|
|
status = "connected";
|
|
|
|
|
|
|
|
|
|
const indiaTime = moment.tz(latestData.date, "Asia/Kolkata");
|
|
|
|
|
const date = indiaTime.format("YYYY-MM-DD");
|
|
|
|
|
const date = indiaTime.format("DD-MM-YYYY");
|
|
|
|
|
const time = indiaTime.format("HH:mm:ss");
|
|
|
|
|
|
|
|
|
|
if (device.type === 'master') {
|
|
|
|
|
updateFields.connected_gsm_date = date;
|
|
|
|
|
updateFields.connected_gsm_time = time;
|
|
|
|
|
device.connected_gsm_date = date;
|
|
|
|
|
device.connected_gsm_time = time;
|
|
|
|
|
enriched.connected_gsm_date = date;
|
|
|
|
|
enriched.connected_gsm_time = time;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (device.type === 'slave') {
|
|
|
|
|
updateFields.connected_lora_date = date;
|
|
|
|
|
updateFields.connected_lora_time = time;
|
|
|
|
|
device.connected_lora_date = date;
|
|
|
|
|
device.connected_lora_time = time;
|
|
|
|
|
}
|
|
|
|
|
enriched.connected_lora_date = date;
|
|
|
|
|
enriched.connected_lora_time = time;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
updateFields.connected_status = status;
|
|
|
|
|
await Insensors.updateOne({ _id: device._id }, { $set: updateFields });
|
|
|
|
|
device.connected_status = status;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
await Promise.all(updateStatusPromises);
|
|
|
|
|
|
|
|
|
|
// Build enriched masters and exclude irrelevant fields
|
|
|
|
|
const enrichedMasters = masters.map(master => {
|
|
|
|
|
const masterObj = master.toObject();
|
|
|
|
|
|
|
|
|
|
// Remove LoRa fields from master response
|
|
|
|
|
delete masterObj.connected_lora_date;
|
|
|
|
|
delete masterObj.connected_lora_time;
|
|
|
|
|
|
|
|
|
|
const masterConnectionId = master.connected_to;
|
|
|
|
|
|
|
|
|
|
const connectedSlaves = slaves
|
|
|
|
|
.filter(slave => slave.connected_to === masterConnectionId)
|
|
|
|
|
.map(slave => {
|
|
|
|
|
const slaveObj = slave.toObject();
|
|
|
|
|
return enriched;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Remove GSM fields from slave response
|
|
|
|
|
delete slaveObj.connected_gsm_date;
|
|
|
|
|
delete slaveObj.connected_gsm_time;
|
|
|
|
|
|
|
|
|
|
return slaveObj;
|
|
|
|
|
});
|
|
|
|
|
// Enrich all devices
|
|
|
|
|
const enrichedMasters = await Promise.all(masters.map(enrichDeviceWithTimestamp));
|
|
|
|
|
const enrichedSlaves = await Promise.all(slaves.map(enrichDeviceWithTimestamp));
|
|
|
|
|
|
|
|
|
|
// Match slaves to their masters
|
|
|
|
|
const masterSummary = enrichedMasters.map(master => {
|
|
|
|
|
const connectedSlaves = enrichedSlaves.filter(slave => slave.connected_to === master.connected_to);
|
|
|
|
|
return {
|
|
|
|
|
...masterObj,
|
|
|
|
|
...master,
|
|
|
|
|
connected_slave_count: connectedSlaves.length,
|
|
|
|
|
connected_slaves: connectedSlaves
|
|
|
|
|
};
|
|
|
|
@ -1137,13 +1096,13 @@ exports.getMasterSlaveSummary = async (req, reply) => {
|
|
|
|
|
return reply.send({
|
|
|
|
|
status_code: 200,
|
|
|
|
|
message: "Success",
|
|
|
|
|
master_count: masters.length,
|
|
|
|
|
slave_count: slaves.length,
|
|
|
|
|
data: enrichedMasters
|
|
|
|
|
master_count: enrichedMasters.length,
|
|
|
|
|
slave_count: enrichedSlaves.length,
|
|
|
|
|
data: masterSummary
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
} catch (err) {
|
|
|
|
|
console.error("Error:", err);
|
|
|
|
|
console.error("Error in getMasterSlaveSummary:", err);
|
|
|
|
|
return reply.status(500).send({
|
|
|
|
|
status_code: 500,
|
|
|
|
|
message: "Internal Server Error"
|
|
|
|
@ -1153,6 +1112,7 @@ exports.getMasterSlaveSummary = async (req, reply) => {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// exports.getIotDataByCustomer = async (req, reply) => {
|
|
|
|
|
// try {
|
|
|
|
|
// const { customerId } = req.params;
|
|
|
|
|