/* eslint-disable @typescript-eslint/camelcase */ import FirebaseAdmin from 'firebase-admin'; export interface FirebaseUser { aud: string; auth_time: number; email: string | undefined; email_verified: boolean | undefined; exp: number; firebase: { identities: any; sign_in_provider: 'custom' | 'password' | 'phone' | 'anonymous' | 'google.com' | 'facebook.com' | 'github.com' | 'twitter.com'; }; iat: number; name: string; picture: string | undefined; uid: string; } export default class Firestore { private static instance: any; public static db: FirebaseFirestore.Firestore; private constructor() { try { const base = { type: 'service_account', project_id: process.env.FIRESTORE_project_id || '', private_key_id: process.env.FIRESTORE_private_key_id || '', private_key: process.env.FIRESTORE_private_key ? process.env.FIRESTORE_private_key.replace(/\\n/g, '\n') : '', client_email: process.env.FIRESTORE_client_email || '', client_id: process.env.FIRESTORE_client_id || '', auth_uri: process.env.FIRESTORE_auth_uri || '', token_uri: process.env.FIRESTORE_token_uri || '', auth_provider_x509_cert_url: process.env.FIRESTORE_auth_provider_x509_cert_url || '', client_x509_cert_url: process.env.FIRESTORE_client_x509_cert_url || '', apiKey: process.env.FIRESTORE_apiKey || '', }; FirebaseAdmin.initializeApp( { credential: FirebaseAdmin.credential.cert({ projectId: base.project_id, clientEmail: base.client_email, privateKey: base.private_key, }), }, 'firestore', ); Firestore.instance = FirebaseAdmin; Firestore.db = FirebaseAdmin.firestore(); } catch (error) { if (!/already exists/.test(error.message)) { console.error('Firebase initialization error raised', error.stack); } } } public static getInstance(): FirebaseFirestore.Firestore { if (!Firestore.instance) { Firestore.instance = new Firestore(); } return Firestore.db; } }