bolt / src /db /firestore.js
Abhinay
Deploy Bolt Run backend (Express + Firestore) as Docker Space
d3477e4
Raw
History Blame Contribute Delete
1.59 kB
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 };