diff --git a/src/controllers/tanksController.js b/src/controllers/tanksController.js index 9e480ca8..f4b5e9e9 100644 --- a/src/controllers/tanksController.js +++ b/src/controllers/tanksController.js @@ -1021,13 +1021,300 @@ const formatDate = (date) => { }; +// exports.motorAction = async (req, reply) => { +// try { +// 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 +// console.log(req.body.startTime) +// // Ensure motor_id is provided +// if (!motorId) { +// throw new Error("Motor ID is required."); +// } + +// // Determine the motor stop status based on the action +// let motorStopStatus; +// if (action === "start") { +// motorStopStatus = "2"; // If action is start, set stop status to "2" +// } else if (action === "stop") { +// motorStopStatus = "1"; // If action is stop, set stop status to "1" +// } else { +// throw new Error("Invalid action provided."); +// } + +// // Update the motor stop status immediately if action is stop +// if (action === "stop") { +// // Update the motor stop status and other fields +// await Tank.updateOne( +// { customerId, "connections.inputConnections.motor_id": motorId }, +// { +// $set: { +// "connections.inputConnections.$.motor_stop_status": "1", +// "connections.inputConnections.$.stopTime": req.body.stopTime, +// "connections.inputConnections.$.threshold_type": null, +// "connections.inputConnections.$.manual_threshold_time": null, +// "connections.inputConnections.$.manual_threshold_percentage": null +// } +// } +// ); + +// // Send immediate response to the client +// reply.code(200).send({ message: "Motor stopped successfully." }); + +// // Perform stop operations in the background +// (async () => { +// await delay(300000); + +// // Update the existing motor data entry with stop details +// 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 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 here to ensure the rest of the code is not executed for the stop action +// return; +// } else { +// // Update the motor stop status to "2" for start action +// 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") { +// // If threshold type is time, update threshold time +// // await Tank.updateOne( +// // { customerId, "connections.inputConnections.motor_id": motorId }, +// // { $set: { "connections.inputConnections.$.manual_threshold_time": req.body.manual_threshold_time,startTime:req.body.startTime } } +// // ); +// const receiver_tank_info7 = await Tank.findOne({ customerId, tankName: req.body.to, tankLocation: req.body.to_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) +// }); +// await newMotorData.save(); + +// 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}.startTime`]: req.body.startTime,[`connections.inputConnections.${index}.start_instance_id`]: start_instance_id } } +// ); +// } +// } + + +// // Start monitoring water level based on threshold time +// const thresholdTime = moment().add(req.body.manual_threshold_time, 'minutes').toDate(); +// const intervalId = setInterval(async () => { +// const splr_tank_info3 = await Tank.findOne({ customerId, tankName: req.body.from, tankLocation: req.body.from_type.toLowerCase() }); +// const splr_tank_info3_waterlevel = parseInt(splr_tank_info3.waterlevel, 10); +// //console.log(splr_tank_info3_waterlevel,"splr_tank_info3_waterlevel") +// const splr_tank_info3_capacity = parseInt(splr_tank_info3.capacity.replace(/,/g, ''), 10); +// // const splr_tank_info3_capacity = parseInt(splr_tank_info3.capacity, 10); +// // console.log(splr_tank_info3.capacity,splr_tank_info3_capacity,"splr_tank_info3_capacity") +// const splr_tank_info3_percentage = (splr_tank_info3_waterlevel / splr_tank_info3_capacity) * 100; +// // console.log(splr_tank_info3_percentage, "percentage for less than 20"); + +// if (new Date() >= thresholdTime || splr_tank_info3_percentage <= 20) { +// console.log(splr_tank_info3_percentage,) +// 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(intervalId); + +// 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 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 } }) + +// 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() +// } +// } +// ); +// } +// } +// }, 60000); +// } 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 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) +// }); +// 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 })) { +// 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 +// const intervalId = setInterval(async () => { +// // 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(intervalId); // Stop monitoring water level +// 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() +// } +// } +// ); +// } +// } +// }, 20000); // Check water level every minute +// } +// } + +// // Respond with success message +// reply.code(200).send({ message: `Motor ${action === "start" ? "started" : "stopped"} successfully.` }); +// } catch (err) { +// // Handle errors +// throw boom.boomify(err); +// } +// }; + +const admin = require('firebase-admin'); + +// Initialize Firebase Admin SDK (make sure this is done once in your app) +// const serviceAccount = require('../waternotifications-ab81a-firebase-adminsdk-ereny-8b0bdac787.json'); +const serviceAccount = require('../waternotifications-ab81a-firebase-adminsdk-ereny-8b0bdac787.json'); + +admin.initializeApp({ + credential: admin.credential.cert(serviceAccount), +}); + exports.motorAction = async (req, reply) => { try { 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 - console.log(req.body.startTime) + const start_instance_id = req.body.start_instance_id; + //const fcmIds = req.body.fcmIds; // Assume this is provided in the request to notify users + // Ensure motor_id is provided if (!motorId) { throw new Error("Motor ID is required."); @@ -1042,8 +1329,10 @@ exports.motorAction = async (req, reply) => { } else { throw new Error("Invalid action provided."); } + const users = await User.find({ customerId: customerId }); + const fcmIds = users.map(user => user.fcmId).filter(fcmId => fcmId); - // Update the motor stop status immediately if action is stop + // Handle motor stop action if (action === "stop") { // Update the motor stop status and other fields await Tank.updateOne( @@ -1062,6 +1351,21 @@ exports.motorAction = async (req, reply) => { // Send immediate response to the client reply.code(200).send({ message: "Motor stopped successfully." }); + // Send notification for motor stop + for (const fcmId of fcmIds) { + try { + const response = await sendPushNotification(fcmId, 'Motor Stopped', `Motor has stopped at ${req.body.stopTime}.`); + console.log('Notification sent successfully:', response); + + if (response.results[0].error === 'NotRegistered') { + await User.updateOne({ fcmId: fcmId }, { $unset: { fcmId: "" } }); + console.log(`Removed unregistered FCM ID: ${fcmId}`); + } + } catch (error) { + console.error('Error sending notification:', error); + } + } + // Perform stop operations in the background (async () => { await delay(300000); @@ -1100,16 +1404,26 @@ exports.motorAction = async (req, reply) => { { customerId, "connections.inputConnections.motor_id": motorId }, { $set: { "connections.inputConnections.$.motor_stop_status": "2" } } ); + + // Send notification for motor start + for (const fcmId of fcmIds) { + try { + const response = await sendPushNotification(fcmId, 'Motor Started', `Motor has started at ${req.body.startTime}.`); + console.log('Notification sent successfully:', response); + + if (response.results[0].error === 'NotRegistered') { + await User.updateOne({ fcmId: fcmId }, { $unset: { fcmId: "" } }); + console.log(`Removed unregistered FCM ID: ${fcmId}`); + } + } catch (error) { + console.error('Error sending notification:', error); + } + } } // Check threshold settings if action is start if (action === "start") { if (req.body.threshold_type === "time") { - // If threshold type is time, update threshold time - // await Tank.updateOne( - // { customerId, "connections.inputConnections.motor_id": motorId }, - // { $set: { "connections.inputConnections.$.manual_threshold_time": req.body.manual_threshold_time,startTime:req.body.startTime } } - // ); const receiver_tank_info7 = await Tank.findOne({ customerId, tankName: req.body.to, tankLocation: req.body.to_type.toLowerCase() }); const newMotorData = new MotorData({ @@ -1121,35 +1435,44 @@ exports.motorAction = async (req, reply) => { supplier_type: req.body.from_type, receiver_type: req.body.to_type, startTime: req.body.startTime, - receiverInitialwaterlevel:parseInt(receiver_tank_info7.waterlevel, 10) + receiverInitialwaterlevel: parseInt(receiver_tank_info7.waterlevel, 10) }); await newMotorData.save(); - for await (const tank of Tank.find({ "connections.inputConnections.motor_id": motorId })) { + 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}.startTime`]: req.body.startTime,[`connections.inputConnections.${index}.start_instance_id`]: start_instance_id } } + { $set: { [`connections.inputConnections.${index}.manual_threshold_time`]: req.body.manual_threshold_time, [`connections.inputConnections.${index}.startTime`]: req.body.startTime, [`connections.inputConnections.${index}.start_instance_id`]: start_instance_id } } ); } } - // Start monitoring water level based on threshold time const thresholdTime = moment().add(req.body.manual_threshold_time, 'minutes').toDate(); const intervalId = setInterval(async () => { const splr_tank_info3 = await Tank.findOne({ customerId, tankName: req.body.from, tankLocation: req.body.from_type.toLowerCase() }); const splr_tank_info3_waterlevel = parseInt(splr_tank_info3.waterlevel, 10); - //console.log(splr_tank_info3_waterlevel,"splr_tank_info3_waterlevel") const splr_tank_info3_capacity = parseInt(splr_tank_info3.capacity.replace(/,/g, ''), 10); - // const splr_tank_info3_capacity = parseInt(splr_tank_info3.capacity, 10); - // console.log(splr_tank_info3.capacity,splr_tank_info3_capacity,"splr_tank_info3_capacity") const splr_tank_info3_percentage = (splr_tank_info3_waterlevel / splr_tank_info3_capacity) * 100; - // console.log(splr_tank_info3_percentage, "percentage for less than 20"); if (new Date() >= thresholdTime || splr_tank_info3_percentage <= 20) { - console.log(splr_tank_info3_percentage,) + // Send notification for low supplier tank percentage + for (const fcmId of fcmIds) { + try { + const response = await sendPushNotification(fcmId, 'Low Water Level Alert', `Supplier tank water level is below 20% (${splr_tank_info3_percentage.toFixed(2)}%).`); + console.log('Notification sent successfully:', response); + + if (response.results[0].error === 'NotRegistered') { + await User.updateOne({ fcmId: fcmId }, { $unset: { fcmId: "" } }); + console.log(`Removed unregistered FCM ID: ${fcmId}`); + } + } catch (error) { + console.error('Error sending notification:', error); + } + } + await Tank.updateOne( { customerId, "connections.inputConnections.motor_id": motorId }, { @@ -1171,16 +1494,17 @@ exports.motorAction = async (req, reply) => { 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 } }) - - const stopTime = formatDate(new Date()); + 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:stopTime, + stopTime: req.body.stopTime, receiverfinalwaterlevel: receiverFinalWaterLevel.toString(), quantity_delivered: quantityDelivered.toString() } @@ -1188,8 +1512,8 @@ exports.motorAction = async (req, reply) => { ); } } - }, 60000); - } else if (req.body.threshold_type === "litres") { + }, 60000); // 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() }); @@ -1239,7 +1563,6 @@ exports.motorAction = async (req, reply) => { - // Update water level threshold // Start monitoring water level based on threshold percentage @@ -1285,11 +1608,10 @@ exports.motorAction = async (req, reply) => { ); } } - }, 20000); // Check water level every minute + }, 20000); } } - // Respond with success message reply.code(200).send({ message: `Motor ${action === "start" ? "started" : "stopped"} successfully.` }); } catch (err) { // Handle errors @@ -1297,8 +1619,6 @@ exports.motorAction = async (req, reply) => { } }; - - const motorActionAuto = async (req, reply) => { try { const customerId = req.params.customerId; diff --git a/src/waternotifications-ab81a-firebase-adminsdk-ereny-8b0bdac787.json b/src/waternotifications-ab81a-firebase-adminsdk-ereny-8b0bdac787.json new file mode 100644 index 00000000..73078ea0 --- /dev/null +++ b/src/waternotifications-ab81a-firebase-adminsdk-ereny-8b0bdac787.json @@ -0,0 +1,14 @@ +{ + "type": "service_account", + "project_id": "watermanagement-user", + "private_key_id": "8e2a7c0a7f234378e1f221263832ebc5f63e54f2", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCXVR0HmVxLKSYV\ncSOiH/UJjmf8xQWBCY83c9nFlCdIaZ1KxRhACUeZDTTLAlinXXx84dxZePiJr3Jo\nQmDSPix1FGq5iKerpmyWulTMh3m8hpeckcLolkEz9ZbM7su6wKGCO0mMJSR7iXWO\ns/hkFUCl7/v3C8/9lFve+C7O8f1htUcEahQz/scAeJ8YFeOt/ennRQ9y5W3ab0Au\n2z2TT/XCoHZNUiX9cggoJFmXQDlZJgwG33CQ/VNZQITc2lnsvxzRkiLZCMdpjxTE\nth41EsropEpl1oIfag7JmpkRVSRXDPVlO9t5xulm2tdgsSOv1Bix3CJGU9CDAoDP\nQY2OJ/pjAgMBAAECggEAAsJ7dYrVLonPYThaamUeiIs2JUB1K9fXtLxAjxHOxDcb\nKN37Nq1sOTmwnKRKcYkA0zE9BiuE3quYlbJOS1WJZW7EfQ3UrjMB0/2GyeHXh8Wg\nCxDRvAdozQrL7vnloKG5Is3E32bW8d+TJF8kthIag8jK+QBiYbHlu1EDX52/NtGd\n8oGpjxz/NYJ3NO4geQ3euFXuAnzBFshbzq0zV+XpOxjPwYbtErq4IqaOIYd7yzIo\neO6Ouk227lEcQYPz6j53ukLsR+IbiyX/scVwsd5ExLVhFmQDlvx29cZGpgTKhHPd\nJb10pP5azuLQQDXvRAlCjPPRTHm4uwdc4MNksj+PvQKBgQDLBqHFpw0A9GuroSd6\neEopkx9znqA5Yhcks9AXIFJIWudprsiLZxl4TY92+HpfjW/+lGRLKDzo748DO+9r\nDO+rXlTnHbtwTq7gi1RQAo/dFGI3NFFQGtsP79f1wXjVLoOApwCkZbWxK/RbXINE\nReFjhXZDsqRgUenqUPrG5w855QKBgQC+0Y3qwf4chXuaKh0GwZwlrmghDXk0uiTJ\nXyC/HWheG+/WcwsrT0fmaH6zN+LW/sZf8OBmxrst80l5FZLmSVu5PlDc/od48HAQ\nMnzKe/ISHmh7wx9RcvrANQtkngBCYMYJdjnY+btYLHArmzm0OAiN/x3iE58rzU2G\n78SlPCj+pwKBgHgW4yeTiTiQWwO5Hi3t6wgucwMjx+hJYiEejy6uupz70DgN36e9\ngy5Kylp33YKZma4/PhfKpESwNqqWECcFDtsRwCy4xH9Iu14sa+Grskb14KaAtrwo\nNn11xAsktoF6suQtZE7ZrqAuvKoxzZ9bqlcAwZSHnX0v1qn33m46jCIVAoGBAKS6\nQslmrvfwQ8PSlzw9546gAUSHXRsnlppAhQR3XqHffCylI/8/cdJ2YupUVH9Fcftg\n9lfDN9NzMvpUpXwn2AcSxLwC/vBooFVbQF+MoG0D0y8EQwUNPWqwYCV8QL0Mzeld\nJpMpA5IayrraRfZOaRQsKKACUGZ/1W2njxsV1E4BAoGAQFqo7jFb5UThUFfH/3TP\nMh0jPDHyI0eJTAxaYEnBp8D2yEo66/XQeYoqkcB5ZewtBMyXQlMeTHZiKCaQf9WK\n4yxJWWTKUVG7LRpcFiTx4e6xrQRArnojEgwv5awE3JtZN3xN5RRuS/ePBd5YtpEw\nVGB2RTHNtRIOMPzJxYXYKpI=\n-----END PRIVATE KEY-----\n", + "client_email": "firebase-adminsdk-e0tgd@watermanagement-user.iam.gserviceaccount.com", + "client_id": "110167388993292837582", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-e0tgd%40watermanagement-user.iam.gserviceaccount.com", + "universe_domain": "googleapis.com" + + } \ No newline at end of file