|
|
@ -4606,6 +4606,159 @@ exports.raiseATicketSlave = async (req, reply) => {
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// };
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// exports.getDisconnectedIssuesBySupportId = async (req, reply) => {
|
|
|
|
|
|
|
|
// try {
|
|
|
|
|
|
|
|
// const { supportId, customerId } = req.params;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// if (!supportId || !customerId) {
|
|
|
|
|
|
|
|
// return reply.code(400).send({ error: "supportId and customerId are required" });
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// const supportRecord = await Support.findOne({ supportId }).lean();
|
|
|
|
|
|
|
|
// if (!supportRecord) {
|
|
|
|
|
|
|
|
// return reply.code(404).send({ message: "No support record found for this supportId and customerId" });
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// const allIssues = supportRecord.issues || [];
|
|
|
|
|
|
|
|
// const hardwareSet = new Set();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// for (const issue of allIssues) {
|
|
|
|
|
|
|
|
// if (issue.hardwareId) hardwareSet.add(issue.hardwareId);
|
|
|
|
|
|
|
|
// if (issue.masterHardwareId) hardwareSet.add(issue.masterHardwareId);
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// const hardwareIds = [...hardwareSet];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// const sensors = await Insensors.find({
|
|
|
|
|
|
|
|
// customerId,
|
|
|
|
|
|
|
|
// $or: [
|
|
|
|
|
|
|
|
// { hardwareId: { $in: hardwareIds } },
|
|
|
|
|
|
|
|
// { tankhardwareId: { $in: hardwareIds } }
|
|
|
|
|
|
|
|
// ]
|
|
|
|
|
|
|
|
// }).lean();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// const sensorMap = {};
|
|
|
|
|
|
|
|
// for (const sensor of sensors) {
|
|
|
|
|
|
|
|
// if (sensor.hardwareId) sensorMap[sensor.hardwareId] = sensor;
|
|
|
|
|
|
|
|
// if (sensor.tankhardwareId) sensorMap[sensor.tankhardwareId] = sensor;
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// const orders = await Order.find({ customerId }).lean();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// const orderMap = {};
|
|
|
|
|
|
|
|
// for (const order of orders) {
|
|
|
|
|
|
|
|
// (order.master_connections || []).forEach(conn => {
|
|
|
|
|
|
|
|
// if (conn.hardwareId) {
|
|
|
|
|
|
|
|
// orderMap[conn.hardwareId] = {
|
|
|
|
|
|
|
|
// masterName: conn.master_name || null,
|
|
|
|
|
|
|
|
// location: conn.location || null
|
|
|
|
|
|
|
|
// };
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// const slaveOrderMap = {};
|
|
|
|
|
|
|
|
// for (const order of orders) {
|
|
|
|
|
|
|
|
// (order.tank_connections || []).forEach(conn => {
|
|
|
|
|
|
|
|
// if (conn.hardwareId) {
|
|
|
|
|
|
|
|
// slaveOrderMap[conn.hardwareId] = {
|
|
|
|
|
|
|
|
// location: conn.location || null,
|
|
|
|
|
|
|
|
// typeOfWater: conn.typeOfWater || null
|
|
|
|
|
|
|
|
// };
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// const masterMap = {};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// for (const issue of allIssues) {
|
|
|
|
|
|
|
|
// const masterId = issue.masterHardwareId || issue.hardwareId;
|
|
|
|
|
|
|
|
// const masterSensor = sensorMap[masterId];
|
|
|
|
|
|
|
|
// if (!masterSensor || masterSensor.type !== "master") continue;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// if (!masterMap[masterSensor.hardwareId]) {
|
|
|
|
|
|
|
|
// const enriched = orderMap[masterSensor.hardwareId] || {};
|
|
|
|
|
|
|
|
// masterMap[masterSensor.hardwareId] = {
|
|
|
|
|
|
|
|
// hardwareId: masterSensor.hardwareId,
|
|
|
|
|
|
|
|
// masterName: enriched.masterName || masterSensor.masterName || "",
|
|
|
|
|
|
|
|
// location: enriched.location || masterSensor.location || "",
|
|
|
|
|
|
|
|
// type: "master",
|
|
|
|
|
|
|
|
// connected_status: masterSensor.connected_status,
|
|
|
|
|
|
|
|
// gsm_last_check_time: masterSensor.gsm_last_check_time,
|
|
|
|
|
|
|
|
// gsm_last_disconnect_time: masterSensor.gsm_last_disconnect_time,
|
|
|
|
|
|
|
|
// connected_gsm_date: masterSensor.connected_gsm_date,
|
|
|
|
|
|
|
|
// connected_gsm_time: masterSensor.connected_gsm_time,
|
|
|
|
|
|
|
|
// connected_lora_date: masterSensor.connected_lora_date,
|
|
|
|
|
|
|
|
// connected_lora_time: masterSensor.connected_lora_time,
|
|
|
|
|
|
|
|
// support_gsm_last_check_time: masterSensor.support_gsm_last_check_time,
|
|
|
|
|
|
|
|
// support_lora_last_check_time: masterSensor.support_lora_last_check_time,
|
|
|
|
|
|
|
|
// team_member_support_gsm_last_check_time: masterSensor.team_member_support_gsm_last_check_time,
|
|
|
|
|
|
|
|
// team_member_support_lora_last_check_time: masterSensor.team_member_support_lora_last_check_time,
|
|
|
|
|
|
|
|
// connected_slave_count: 0,
|
|
|
|
|
|
|
|
// connected_slaves: []
|
|
|
|
|
|
|
|
// };
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// const master = masterMap[masterSensor.hardwareId];
|
|
|
|
|
|
|
|
// const connectedSlaves = await Insensors.find({
|
|
|
|
|
|
|
|
// connected_to: masterSensor.hardwareId,
|
|
|
|
|
|
|
|
// type: "slave",
|
|
|
|
|
|
|
|
// customerId
|
|
|
|
|
|
|
|
// }).lean();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// const slaveSet = new Set(master.connected_slaves.map(s => s.hardwareId));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// for (const slave of connectedSlaves) {
|
|
|
|
|
|
|
|
// const slaveHardwareId = slave.tankhardwareId || slave.hardwareId;
|
|
|
|
|
|
|
|
// if (slaveSet.has(slaveHardwareId)) continue;
|
|
|
|
|
|
|
|
// slaveSet.add(slaveHardwareId);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// const tankInfo = await Tank.findOne({
|
|
|
|
|
|
|
|
// $or: [
|
|
|
|
|
|
|
|
// { hardwareId: slaveHardwareId },
|
|
|
|
|
|
|
|
// { tankhardwareId: slaveHardwareId }
|
|
|
|
|
|
|
|
// ]
|
|
|
|
|
|
|
|
// }).lean();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// const slaveOrderInfo = slaveOrderMap[slaveHardwareId] || {};
|
|
|
|
|
|
|
|
// const slaveEnriched = {
|
|
|
|
|
|
|
|
// hardwareId: slaveHardwareId,
|
|
|
|
|
|
|
|
// tankName: slave.tankName || (tankInfo?.tankName ?? ""),
|
|
|
|
|
|
|
|
// location: slave.location || tankInfo?.tankLocation || slaveOrderInfo.location || "",
|
|
|
|
|
|
|
|
// connected_status: slave.connected_status,
|
|
|
|
|
|
|
|
// connected_lora_time: slave.connected_lora_time,
|
|
|
|
|
|
|
|
// connected_lora_date: slave.connected_lora_date,
|
|
|
|
|
|
|
|
// lora_last_check_time: slave.lora_last_check_time,
|
|
|
|
|
|
|
|
// lora_last_disconnect_time: slave.lora_last_disconnect_time,
|
|
|
|
|
|
|
|
// connected_to: slave.connected_to,
|
|
|
|
|
|
|
|
// masterName: master.masterName,
|
|
|
|
|
|
|
|
// type: "slave",
|
|
|
|
|
|
|
|
// typeOfWater: slave.typeOfWater || tankInfo?.typeOfWater || slaveOrderInfo.typeOfWater || "",
|
|
|
|
|
|
|
|
// tankHeight: slave.tankHeight,
|
|
|
|
|
|
|
|
// support_lora_last_check_time: slave.support_lora_last_check_time,
|
|
|
|
|
|
|
|
// team_member_support_lora_last_check_time: slave.team_member_support_lora_last_check_time
|
|
|
|
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// master.connected_slaves.push(slaveEnriched);
|
|
|
|
|
|
|
|
// master.connected_slave_count++;
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// return reply.send({
|
|
|
|
|
|
|
|
// status_code: 200,
|
|
|
|
|
|
|
|
// supportId,
|
|
|
|
|
|
|
|
// customerId,
|
|
|
|
|
|
|
|
// totalMasters: Object.keys(masterMap).length,
|
|
|
|
|
|
|
|
// comments: supportRecord.comments || "",
|
|
|
|
|
|
|
|
// disconnectedIssues: Object.values(masterMap)
|
|
|
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// } catch (error) {
|
|
|
|
|
|
|
|
// console.error("Error fetching disconnected issues:", error);
|
|
|
|
|
|
|
|
// return reply.code(500).send({ error: "Internal server error" });
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
|
|
exports.getDisconnectedIssuesBySupportId = async (req, reply) => {
|
|
|
|
exports.getDisconnectedIssuesBySupportId = async (req, reply) => {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
const { supportId, customerId } = req.params;
|
|
|
|
const { supportId, customerId } = req.params;
|
|
|
@ -4744,12 +4897,19 @@ exports.getDisconnectedIssuesBySupportId = async (req, reply) => {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Map comments to only the text strings
|
|
|
|
|
|
|
|
const commentTexts = (supportRecord.comments || []).map(c => c.text);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Add these comments to each master in disconnectedIssues
|
|
|
|
|
|
|
|
for (const master of Object.values(masterMap)) {
|
|
|
|
|
|
|
|
master.comments = commentTexts;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return reply.send({
|
|
|
|
return reply.send({
|
|
|
|
status_code: 200,
|
|
|
|
status_code: 200,
|
|
|
|
supportId,
|
|
|
|
supportId,
|
|
|
|
customerId,
|
|
|
|
customerId,
|
|
|
|
totalMasters: Object.keys(masterMap).length,
|
|
|
|
totalMasters: Object.keys(masterMap).length,
|
|
|
|
comments: supportRecord.comments || "",
|
|
|
|
|
|
|
|
disconnectedIssues: Object.values(masterMap)
|
|
|
|
disconnectedIssues: Object.values(masterMap)
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
@ -6228,18 +6388,23 @@ exports.StatusTeamMember = async (request, reply) => {
|
|
|
|
|
|
|
|
|
|
|
|
exports.updateComments = async (req, reply) => {
|
|
|
|
exports.updateComments = async (req, reply) => {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
const { supportId} = req.params;
|
|
|
|
const { supportId } = req.params;
|
|
|
|
const { comments, customerId, hardwareId } = req.body;
|
|
|
|
const { comments, customerId, hardwareId } = req.body;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
console.log("Incoming request body:", req.body);
|
|
|
|
|
|
|
|
console.log("typeof comments:", typeof comments);
|
|
|
|
|
|
|
|
console.log("value of comments:", comments);
|
|
|
|
|
|
|
|
|
|
|
|
if (!supportId || !customerId || !hardwareId) {
|
|
|
|
if (!supportId || !customerId || !hardwareId) {
|
|
|
|
return reply.code(400).send({ error: "supportId, customerId and hardwareId are required in path params" });
|
|
|
|
return reply.code(400).send({ error: "supportId, customerId and hardwareId are required" });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (typeof comments !== 'string') {
|
|
|
|
const trimmedComment = typeof comments === "string" ? comments.trim() : "";
|
|
|
|
return reply.code(400).send({ error: "comments must be a string in the request body" });
|
|
|
|
if (!trimmedComment) {
|
|
|
|
|
|
|
|
return reply.code(400).send({ error: "comments must be a non-empty string" });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Verify customerId is valid for the hardwareId by looking into Insensors
|
|
|
|
// Step 1: Validate sensor
|
|
|
|
const sensor = await Insensors.findOne({
|
|
|
|
const sensor = await Insensors.findOne({
|
|
|
|
customerId,
|
|
|
|
customerId,
|
|
|
|
$or: [{ hardwareId }, { tankhardwareId: hardwareId }]
|
|
|
|
$or: [{ hardwareId }, { tankhardwareId: hardwareId }]
|
|
|
@ -6249,14 +6414,13 @@ exports.updateComments = async (req, reply) => {
|
|
|
|
return reply.code(404).send({ error: "No sensor found with this hardwareId for this customerId" });
|
|
|
|
return reply.code(404).send({ error: "No sensor found with this hardwareId for this customerId" });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Find support record only by supportId (no customerId in Support schema)
|
|
|
|
// Step 2: Load support record
|
|
|
|
const supportRecord = await Support.findOne({ supportId });
|
|
|
|
const supportRecord = await Support.findOne({ supportId });
|
|
|
|
|
|
|
|
|
|
|
|
if (!supportRecord) {
|
|
|
|
if (!supportRecord) {
|
|
|
|
return reply.code(404).send({ error: "Support record not found" });
|
|
|
|
return reply.code(404).send({ error: "Support record not found" });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Check if hardwareId exists in supportRecord issues
|
|
|
|
// Step 3: Validate issue exists
|
|
|
|
const issueExists = supportRecord.issues.some(issue =>
|
|
|
|
const issueExists = supportRecord.issues.some(issue =>
|
|
|
|
issue.hardwareId === hardwareId || issue.masterHardwareId === hardwareId
|
|
|
|
issue.hardwareId === hardwareId || issue.masterHardwareId === hardwareId
|
|
|
|
);
|
|
|
|
);
|
|
|
@ -6265,15 +6429,28 @@ exports.updateComments = async (req, reply) => {
|
|
|
|
return reply.code(404).send({ error: "HardwareId not found in this support record's issues" });
|
|
|
|
return reply.code(404).send({ error: "HardwareId not found in this support record's issues" });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Update the comments field (top-level comments)
|
|
|
|
// Step 4: Append comment object correctly
|
|
|
|
supportRecord.comments = comments;
|
|
|
|
const commentObj = {
|
|
|
|
|
|
|
|
text: trimmedComment,
|
|
|
|
|
|
|
|
customerId,
|
|
|
|
|
|
|
|
hardwareId,
|
|
|
|
|
|
|
|
createdAt: new Date()
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!Array.isArray(supportRecord.comments)) {
|
|
|
|
|
|
|
|
supportRecord.comments = [];
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Use push instead of spreading to keep Mongoose subdoc validation intact
|
|
|
|
|
|
|
|
supportRecord.comments.push(commentObj);
|
|
|
|
|
|
|
|
|
|
|
|
await supportRecord.save();
|
|
|
|
await supportRecord.save();
|
|
|
|
|
|
|
|
|
|
|
|
return reply.send({ message: "Comments updated successfully", comments });
|
|
|
|
return reply.send({ message: "Comment added successfully", comment: commentObj });
|
|
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
} catch (error) {
|
|
|
|
console.error("Error updating comments:", error);
|
|
|
|
console.error("Error updating comments:", error);
|
|
|
|
return reply.code(500).send({ error: "Internal server error" });
|
|
|
|
return reply.code(500).send({ error: "Internal server error" });
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|