const path = require('path'); const admin = require('firebase-admin'); require('dotenv').config(); // On hosted platforms (e.g. Hugging Face Spaces) the whole service-account JSON // is injected as a secret env var instead of a committed file. Fall back to the // local file for development. let serviceAccount; if (process.env.FIREBASE_SERVICE_ACCOUNT_JSON) { serviceAccount = JSON.parse(process.env.FIREBASE_SERVICE_ACCOUNT_JSON); } else { const credPath = process.env.FIREBASE_SERVICE_ACCOUNT || path.join(__dirname, '..', '..', 'firebase-service-account.json'); serviceAccount = require(credPath); } if (!admin.apps.length) { admin.initializeApp({ credential: admin.credential.cert(serviceAccount), projectId: serviceAccount.project_id, }); } const db = admin.firestore(); db.settings({ ignoreUndefinedProperties: true }); const { FieldValue, Timestamp } = admin.firestore; const collections = { users: db.collection('users'), runs: db.collection('runs'), programs: db.collection('programs'), userPrograms: db.collection('userPrograms'), clubs: db.collection('clubs'), clubMembers: db.collection('clubMembers'), clubActivities: db.collection('clubActivities'), territoryCells: db.collection('territoryCells'), }; function docToObject(doc) { if (!doc.exists) return null; const data = doc.data(); for (const k of Object.keys(data)) { if (data[k] instanceof Timestamp) data[k] = data[k].toDate().toISOString(); } return { id: doc.id, ...data }; } module.exports = { admin, db, FieldValue, Timestamp, collections, docToObject };