Spaces:
Running
Running
File size: 3,161 Bytes
92a138e | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | const { GoogleSpreadsheet } = require('google-spreadsheet');
const { JWT } = require('google-auth-library');
const logger = require('../config/logger');
let credentials;
try {
if (process.env.GOOGLE_CREDENTIALS) {
credentials = typeof process.env.GOOGLE_CREDENTIALS === 'string'
? JSON.parse(process.env.GOOGLE_CREDENTIALS)
: process.env.GOOGLE_CREDENTIALS;
} else {
credentials = require('../../google-credentials.json');
}
} catch (err) {
logger.error('Failed to load Google Credentials. Ensure GOOGLE_CREDENTIALS is set.');
}
const SPREADSHEET_ID = '1Pc2PIDRfrumb1rnVeZwsmjTPukCYdD-Fa61EfTIEQ3U';
// Initialize auth
const serviceAccountAuth = new JWT({
email: credentials?.client_email,
key: credentials?.private_key,
scopes: [
'https://www.googleapis.com/auth/spreadsheets',
],
});
const doc = new GoogleSpreadsheet(SPREADSHEET_ID, serviceAccountAuth);
let cachedSheet = null;
async function initSheet() {
if (cachedSheet) return cachedSheet;
await doc.loadInfo();
const sheet = doc.sheetsByIndex[0];
// Ensure headers exist
try {
await sheet.loadHeaderRow();
} catch (e) {
await sheet.setHeaderRow(['Mobile', 'Name', 'Email', 'Date']);
}
cachedSheet = sheet;
return sheet;
}
/**
* Append a new user row to Google Sheets
* @param {Object} userData { name, email, phone }
*/
async function appendUserToSheet(userData) {
try {
const sheet = await initSheet();
await sheet.addRow({
Mobile: `'${userData.phone}`, // Prepend quote to force string in Sheets
Name: userData.name,
Email: userData.email,
Date: new Date().toISOString()
});
logger.info(`Appended real user to Google Sheets: ${userData.phone}`);
return true;
} catch (err) {
logger.error(`Failed to append to Google Sheets: ${err.message}`);
return false;
}
}
/**
* Get user by phone number from Google Sheets
* @param {string} phone
* @returns {Object|null}
*/
async function getUserByPhone(phone) {
try {
const sheet = await initSheet();
const rows = await sheet.getRows();
for (const row of rows) {
let sheetPhone = row.get('Mobile');
if (!sheetPhone) continue;
// Remove the prepended quote if it exists, and any spaces
sheetPhone = sheetPhone.replace(/^'/, '').trim();
// Also handle if Sheets stripped the + and they passed a +
const cleanInputPhone = phone.replace(/^'/, '').trim();
// Loose comparison in case the plus was stripped
if (sheetPhone === cleanInputPhone || sheetPhone === cleanInputPhone.replace('+', '')) {
return {
phone: sheetPhone,
name: row.get('Name'),
email: row.get('Email')
};
}
}
return null;
} catch (err) {
logger.error(`Failed to get user from Google Sheets: ${err.message}`);
return null;
}
}
module.exports = {
appendUserToSheet,
getUserByPhone
};
|