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