Spaces:
Running
Running
| 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 | |
| }; | |