send push notifiaction

master
Bhaskar 1 year ago
parent 013113e1d9
commit ee8f8a55dd

@ -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,7 +1435,7 @@ 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();
@ -1130,26 +1444,35 @@ exports.motorAction = async (req, reply) => {
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,7 +1512,7 @@ exports.motorAction = async (req, reply) => {
);
}
}
}, 60000);
}, 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;

@ -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"
}
Loading…
Cancel
Save