|
|
@ -1228,95 +1228,95 @@ exports.createMasterSlaveData = async (req, reply) => {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
exports.masterConnectedSlaveList = async (req, reply) => {
|
|
|
|
// exports.masterConnectedSlaveList = async (req, reply) => {
|
|
|
|
try {
|
|
|
|
// try {
|
|
|
|
const { connectedTo } = req.params;
|
|
|
|
// const { connectedTo } = req.params;
|
|
|
|
|
|
|
|
|
|
|
|
// Step 1: Get master device details
|
|
|
|
// // Step 1: Get master device details
|
|
|
|
const master = await Insensors.findOne({ hardwareId: connectedTo, type: 'master' }).lean();
|
|
|
|
// const master = await Insensors.findOne({ hardwareId: connectedTo, type: 'master' }).lean();
|
|
|
|
if (!master) {
|
|
|
|
// if (!master) {
|
|
|
|
return reply.status(404).send({
|
|
|
|
// return reply.status(404).send({
|
|
|
|
success: false,
|
|
|
|
// success: false,
|
|
|
|
message: "Master device not found"
|
|
|
|
// message: "Master device not found"
|
|
|
|
});
|
|
|
|
// });
|
|
|
|
}
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
// Step 2: Get tank metadata for master
|
|
|
|
// // Step 2: Get tank metadata for master
|
|
|
|
const tankDetails = await Tank.findOne({ hardwareId: connectedTo }, { tankLocation: 1, typeOfWater: 1 }).lean();
|
|
|
|
// const tankDetails = await Tank.findOne({ hardwareId: connectedTo }, { tankLocation: 1, typeOfWater: 1 }).lean();
|
|
|
|
|
|
|
|
|
|
|
|
const masterTypeOfWater = tankDetails?.typeOfWater || null;
|
|
|
|
// const masterTypeOfWater = tankDetails?.typeOfWater || null;
|
|
|
|
|
|
|
|
|
|
|
|
// Step 3: Get slave tanks connected to master
|
|
|
|
// // Step 3: Get slave tanks connected to master
|
|
|
|
const slaveTanks = await Insensors.find({ connected_to: connectedTo, type: 'slave' }).lean();
|
|
|
|
// const slaveTanks = await Insensors.find({ connected_to: connectedTo, type: 'slave' }).lean();
|
|
|
|
const slaveCount = slaveTanks.length;
|
|
|
|
// const slaveCount = slaveTanks.length;
|
|
|
|
|
|
|
|
|
|
|
|
// Step 4: Get latest IotData for master
|
|
|
|
// // Step 4: Get latest IotData for master
|
|
|
|
const latestIotData = await IotData.findOne({ hardwareId: connectedTo }).sort({ date: -1 }).lean();
|
|
|
|
// const latestIotData = await IotData.findOne({ hardwareId: connectedTo }).sort({ date: -1 }).lean();
|
|
|
|
|
|
|
|
|
|
|
|
// Step 5: Fetch order to get masterName and location
|
|
|
|
// // Step 5: Fetch order to get masterName and location
|
|
|
|
const order = await Order.findOne({ "master_connections.hardwareId": connectedTo }).lean();
|
|
|
|
// const order = await Order.findOne({ "master_connections.hardwareId": connectedTo }).lean();
|
|
|
|
let masterOrderInfo = {};
|
|
|
|
// let masterOrderInfo = {};
|
|
|
|
if (order) {
|
|
|
|
// if (order) {
|
|
|
|
const match = order.master_connections.find(mc => mc.hardwareId === connectedTo);
|
|
|
|
// const match = order.master_connections.find(mc => mc.hardwareId === connectedTo);
|
|
|
|
if (match) {
|
|
|
|
// if (match) {
|
|
|
|
masterOrderInfo = {
|
|
|
|
// masterOrderInfo = {
|
|
|
|
masterName: match.master_name || "",
|
|
|
|
// masterName: match.master_name || "",
|
|
|
|
location: match.location || ""
|
|
|
|
// location: match.location || ""
|
|
|
|
};
|
|
|
|
// };
|
|
|
|
}
|
|
|
|
// }
|
|
|
|
}
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
// Step 6: Prepare master object for response
|
|
|
|
// // Step 6: Prepare master object for response
|
|
|
|
const masterResponse = {
|
|
|
|
// const masterResponse = {
|
|
|
|
...master,
|
|
|
|
// ...master,
|
|
|
|
isMaster: true,
|
|
|
|
// isMaster: true,
|
|
|
|
tankLocation: tankDetails?.tankLocation || null,
|
|
|
|
// tankLocation: tankDetails?.tankLocation || null,
|
|
|
|
typeOfWater: masterTypeOfWater,
|
|
|
|
// typeOfWater: masterTypeOfWater,
|
|
|
|
tankHeight: null,
|
|
|
|
// tankHeight: null,
|
|
|
|
masterName: masterOrderInfo.masterName,
|
|
|
|
// masterName: masterOrderInfo.masterName,
|
|
|
|
location: masterOrderInfo.location
|
|
|
|
// location: masterOrderInfo.location
|
|
|
|
};
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
|
|
// Step 7: Process each slave
|
|
|
|
// // Step 7: Process each slave
|
|
|
|
const processedSlaves = slaveTanks.map(slave => {
|
|
|
|
// const processedSlaves = slaveTanks.map(slave => {
|
|
|
|
const originalHardwareId = slave.hardwareId;
|
|
|
|
// const originalHardwareId = slave.hardwareId;
|
|
|
|
const tankHardwareId = slave.tankhardwareId;
|
|
|
|
// const tankHardwareId = slave.tankhardwareId;
|
|
|
|
|
|
|
|
|
|
|
|
// Determine final hardwareId: prefer tankhardwareId if exists
|
|
|
|
// // Determine final hardwareId: prefer tankhardwareId if exists
|
|
|
|
const finalHardwareId = tankHardwareId || originalHardwareId;
|
|
|
|
// const finalHardwareId = tankHardwareId || originalHardwareId;
|
|
|
|
|
|
|
|
|
|
|
|
const matchingTankData = latestIotData?.tanks?.find(t =>
|
|
|
|
// const matchingTankData = latestIotData?.tanks?.find(t =>
|
|
|
|
t.tankhardwareId === finalHardwareId || t.hardwareId === finalHardwareId
|
|
|
|
// t.tankhardwareId === finalHardwareId || t.hardwareId === finalHardwareId
|
|
|
|
);
|
|
|
|
// );
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
// return {
|
|
|
|
...slave,
|
|
|
|
// ...slave,
|
|
|
|
isMaster: false,
|
|
|
|
// isMaster: false,
|
|
|
|
hardwareId: finalHardwareId, // Replace hardwareId with tankhardwareId if present
|
|
|
|
// hardwareId: finalHardwareId, // Replace hardwareId with tankhardwareId if present
|
|
|
|
tankHeight: matchingTankData?.tankHeight ?? null,
|
|
|
|
// tankHeight: matchingTankData?.tankHeight ?? null,
|
|
|
|
typeOfWater: masterTypeOfWater === 'bore' ? 'bore' : (slave.typeOfWater || null)
|
|
|
|
// typeOfWater: masterTypeOfWater === 'bore' ? 'bore' : (slave.typeOfWater || null)
|
|
|
|
};
|
|
|
|
// };
|
|
|
|
});
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
|
|
// Step 8: Combine master and slaves into one array
|
|
|
|
// // Step 8: Combine master and slaves into one array
|
|
|
|
const combinedData = [masterResponse, ...processedSlaves];
|
|
|
|
// const combinedData = [masterResponse, ...processedSlaves];
|
|
|
|
|
|
|
|
|
|
|
|
return reply.send({
|
|
|
|
// return reply.send({
|
|
|
|
success: true,
|
|
|
|
// success: true,
|
|
|
|
tankLocation: tankDetails?.tankLocation || null,
|
|
|
|
// tankLocation: tankDetails?.tankLocation || null,
|
|
|
|
typeOfWater: masterTypeOfWater,
|
|
|
|
// typeOfWater: masterTypeOfWater,
|
|
|
|
connectedSlaveCount: slaveCount,
|
|
|
|
// connectedSlaveCount: slaveCount,
|
|
|
|
data: combinedData
|
|
|
|
// data: combinedData
|
|
|
|
});
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
// } catch (error) {
|
|
|
|
console.error("Error fetching master connected slave data:", error);
|
|
|
|
// console.error("Error fetching master connected slave data:", error);
|
|
|
|
return reply.status(500).send({
|
|
|
|
// return reply.status(500).send({
|
|
|
|
success: false,
|
|
|
|
// success: false,
|
|
|
|
message: "Internal Server Error"
|
|
|
|
// message: "Internal Server Error"
|
|
|
|
});
|
|
|
|
// });
|
|
|
|
}
|
|
|
|
// }
|
|
|
|
};
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -1452,6 +1452,116 @@ exports.masterConnectedSlaveList = async (req, reply) => {
|
|
|
|
// };
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exports.masterConnectedSlaveList = async (req, reply) => {
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
const { connectedTo } = req.params;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Step 1: Get master device details
|
|
|
|
|
|
|
|
const master = await Insensors.findOne({ hardwareId: connectedTo, type: 'master' }).lean();
|
|
|
|
|
|
|
|
if (!master) {
|
|
|
|
|
|
|
|
return reply.status(404).send({
|
|
|
|
|
|
|
|
success: false,
|
|
|
|
|
|
|
|
message: "Master device not found"
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Step 2: Get tank metadata for master (including height, length, width)
|
|
|
|
|
|
|
|
const tankDetails = await Tank.findOne(
|
|
|
|
|
|
|
|
{ hardwareId: connectedTo },
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
tankLocation: 1,
|
|
|
|
|
|
|
|
typeOfWater: 1,
|
|
|
|
|
|
|
|
height: 1,
|
|
|
|
|
|
|
|
length: 1,
|
|
|
|
|
|
|
|
width: 1
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
).lean();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const masterTypeOfWater = tankDetails?.typeOfWater || null;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Step 3: Get slave tanks connected to master
|
|
|
|
|
|
|
|
const slaveTanks = await Insensors.find({ connected_to: connectedTo, type: 'slave' }).lean();
|
|
|
|
|
|
|
|
const slaveCount = slaveTanks.length;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Step 4: Get latest IotData for master
|
|
|
|
|
|
|
|
const latestIotData = await IotData.findOne({ hardwareId: connectedTo }).sort({ date: -1 }).lean();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Step 5: Fetch order to get masterName and location
|
|
|
|
|
|
|
|
const order = await Order.findOne({ "master_connections.hardwareId": connectedTo }).lean();
|
|
|
|
|
|
|
|
let masterOrderInfo = {};
|
|
|
|
|
|
|
|
if (order) {
|
|
|
|
|
|
|
|
const match = order.master_connections.find(mc => mc.hardwareId === connectedTo);
|
|
|
|
|
|
|
|
if (match) {
|
|
|
|
|
|
|
|
masterOrderInfo = {
|
|
|
|
|
|
|
|
masterName: match.master_name || "",
|
|
|
|
|
|
|
|
location: match.location || ""
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Step 6: Prepare master object for response
|
|
|
|
|
|
|
|
const masterResponse = {
|
|
|
|
|
|
|
|
...master,
|
|
|
|
|
|
|
|
isMaster: true,
|
|
|
|
|
|
|
|
tankLocation: tankDetails?.tankLocation || null,
|
|
|
|
|
|
|
|
typeOfWater: masterTypeOfWater,
|
|
|
|
|
|
|
|
tankHeight: null,
|
|
|
|
|
|
|
|
masterName: masterOrderInfo.masterName,
|
|
|
|
|
|
|
|
location: masterOrderInfo.location,
|
|
|
|
|
|
|
|
height: tankDetails?.height || null,
|
|
|
|
|
|
|
|
length: tankDetails?.length || null,
|
|
|
|
|
|
|
|
width: tankDetails?.width || null
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Step 7: Process each slave
|
|
|
|
|
|
|
|
const processedSlaves = await Promise.all(slaveTanks.map(async slave => {
|
|
|
|
|
|
|
|
const originalHardwareId = slave.hardwareId;
|
|
|
|
|
|
|
|
const tankHardwareId = slave.tankhardwareId;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const finalHardwareId = tankHardwareId || originalHardwareId;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const matchingTankData = latestIotData?.tanks?.find(t =>
|
|
|
|
|
|
|
|
t.tankhardwareId === finalHardwareId || t.hardwareId === finalHardwareId
|
|
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Optionally fetch tank meta for slave too (if needed)
|
|
|
|
|
|
|
|
const slaveTankMeta = await Tank.findOne(
|
|
|
|
|
|
|
|
{ hardwareId: slave.hardwareId },
|
|
|
|
|
|
|
|
{ height: 1, length: 1, width: 1 }
|
|
|
|
|
|
|
|
).lean();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
|
|
|
...slave,
|
|
|
|
|
|
|
|
isMaster: false,
|
|
|
|
|
|
|
|
hardwareId: finalHardwareId,
|
|
|
|
|
|
|
|
tankHeight: matchingTankData?.tankHeight ?? null,
|
|
|
|
|
|
|
|
typeOfWater: masterTypeOfWater === 'bore' ? 'bore' : (slave.typeOfWater || null),
|
|
|
|
|
|
|
|
height: slaveTankMeta?.height || null,
|
|
|
|
|
|
|
|
length: slaveTankMeta?.length || null,
|
|
|
|
|
|
|
|
width: slaveTankMeta?.width || null
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Step 8: Combine master and slaves into one array
|
|
|
|
|
|
|
|
const combinedData = [masterResponse, ...processedSlaves];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return reply.send({
|
|
|
|
|
|
|
|
success: true,
|
|
|
|
|
|
|
|
tankLocation: tankDetails?.tankLocation || null,
|
|
|
|
|
|
|
|
typeOfWater: masterTypeOfWater,
|
|
|
|
|
|
|
|
connectedSlaveCount: slaveCount,
|
|
|
|
|
|
|
|
data: combinedData
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
|
|
console.error("Error fetching master connected slave data:", error);
|
|
|
|
|
|
|
|
return reply.status(500).send({
|
|
|
|
|
|
|
|
success: false,
|
|
|
|
|
|
|
|
message: "Internal Server Error"
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exports.mastrerList = async (req, reply) => {
|
|
|
|
exports.mastrerList = async (req, reply) => {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|