// src/services/config.ts - Configuracion centralizada
import { config as dotenvConfig } from 'dotenv';
import { readFileSync, existsSync } from 'fs';
import type { SyncConfig, GoogleCredentials } from '../types.ts';
import { DEFAULT_COLUMN_MAPPING } from '../types.ts';
dotenvConfig();
export function loadGoogleCredentials(): GoogleCredentials {
// Opcion 1: Credenciales inline desde variables de entorno
if (process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL && process.env.GOOGLE_PRIVATE_KEY) {
return {
client_email: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL,
private_key: process.env.GOOGLE_PRIVATE_KEY.replace(/\\n/g, '\n')
};
}
// Opcion 2: Archivo JSON de credenciales
const possiblePaths = [
process.env.GOOGLE_SERVICE_ACCOUNT_PATH,
process.env.GOOGLE_SERVICE_ACCOUNT_FILE,
process.env.SERVICE_ACCOUNT_PATH,
'./credentials.json',
'./credentials/service-account.json',
'../credentials/service-account.json',
].filter(Boolean) as string[];
for (const credentialsFile of possiblePaths) {
if (existsSync(credentialsFile)) {
const credentials = JSON.parse(readFileSync(credentialsFile, 'utf-8'));
return {
client_email: credentials.client_email,
private_key: credentials.private_key
};
}
}
throw new Error(
'No se encontraron credenciales de Google. ' +
'Configura GOOGLE_SERVICE_ACCOUNT_EMAIL y GOOGLE_PRIVATE_KEY, ' +
'o proporciona un archivo en GOOGLE_SERVICE_ACCOUNT_PATH'
);
}
export function loadConfig(): SyncConfig {
const databaseUrl = process.env.DATABASE_URL;
const spreadsheetId = process.env.GOOGLE_SPREADSHEET_ID;
if (!databaseUrl) {
throw new Error('DATABASE_URL no esta configurado');
}
if (!spreadsheetId) {
throw new Error('GOOGLE_SPREADSHEET_ID no esta configurado');
}
return {
databaseUrl,
spreadsheetId,
sheetName: process.env.SHEET_NAME || 'Reservas',
credentials: loadGoogleCredentials(),
cronSchedule: process.env.SYNC_CRON_SCHEDULE || '*/15 * * * *',
syncMode: (process.env.SYNC_MODE as SyncConfig['syncMode']) || 'db_to_sheet',
batchLimit: parseInt(process.env.SYNC_BATCH_LIMIT || '1000', 10),
columnMapping: DEFAULT_COLUMN_MAPPING,
primaryKey: 'bookingid'
};
}