const path = require('path'); require('dotenv').config({ path: path.join(__dirname, '..', '.env') }); // Helper function to parse NocoDB URLs function parseNocoDBUrl(url) { if (!url) return { projectId: null, tableId: null }; const patterns = [ /#\/nc\/([^\/]+)\/([^\/\?#]+)/, /\/nc\/([^\/]+)\/([^\/\?#]+)/, /project\/([^\/]+)\/table\/([^\/\?#]+)/, ]; for (const pattern of patterns) { const match = url.match(pattern); if (match) { return { projectId: match[1], tableId: match[2] }; } } return { projectId: null, tableId: null }; } // Auto-parse IDs from URLs let parsedIds = { projectId: null, tableId: null }; if (process.env.NOCODB_VIEW_URL && (!process.env.NOCODB_PROJECT_ID || !process.env.NOCODB_TABLE_ID)) { parsedIds = parseNocoDBUrl(process.env.NOCODB_VIEW_URL); } // Parse login sheet ID let loginSheetId = null; if (process.env.NOCODB_LOGIN_SHEET) { if (process.env.NOCODB_LOGIN_SHEET.startsWith('http')) { const { tableId } = parseNocoDBUrl(process.env.NOCODB_LOGIN_SHEET); loginSheetId = tableId; } else { loginSheetId = process.env.NOCODB_LOGIN_SHEET; } } // Parse settings sheet ID let settingsSheetId = null; if (process.env.NOCODB_SETTINGS_SHEET) { if (process.env.NOCODB_SETTINGS_SHEET.startsWith('http')) { const { tableId } = parseNocoDBUrl(process.env.NOCODB_SETTINGS_SHEET); settingsSheetId = tableId; } else { settingsSheetId = process.env.NOCODB_SETTINGS_SHEET; } } // Parse shifts sheet ID let shiftsSheetId = null; if (process.env.NOCODB_SHIFTS_SHEET) { if (process.env.NOCODB_SHIFTS_SHEET.startsWith('http')) { const { tableId } = parseNocoDBUrl(process.env.NOCODB_SHIFTS_SHEET); shiftsSheetId = tableId; } else { shiftsSheetId = process.env.NOCODB_SHIFTS_SHEET; } } // Parse shift signups sheet ID let shiftSignupsSheetId = null; if (process.env.NOCODB_SHIFT_SIGNUPS_SHEET) { if (process.env.NOCODB_SHIFT_SIGNUPS_SHEET.startsWith('http')) { const { tableId } = parseNocoDBUrl(process.env.NOCODB_SHIFT_SIGNUPS_SHEET); shiftSignupsSheetId = tableId; } else { shiftSignupsSheetId = process.env.NOCODB_SHIFT_SIGNUPS_SHEET; } } // Parse cuts sheet ID let cutsSheetId = null; if (process.env.NOCODB_CUTS_SHEET) { if (process.env.NOCODB_CUTS_SHEET.startsWith('http')) { const { tableId } = parseNocoDBUrl(process.env.NOCODB_CUTS_SHEET); cutsSheetId = tableId; } else { cutsSheetId = process.env.NOCODB_CUTS_SHEET; } } module.exports = { // Server config port: process.env.PORT || 3000, nodeEnv: process.env.NODE_ENV || 'development', isProduction: process.env.NODE_ENV === 'production', domain: process.env.DOMAIN || 'cmlite.org', // Add this // NocoDB config nocodb: { apiUrl: process.env.NOCODB_API_URL, apiToken: process.env.NOCODB_API_TOKEN, projectId: process.env.NOCODB_PROJECT_ID || parsedIds.projectId, tableId: process.env.NOCODB_TABLE_ID || parsedIds.tableId, loginSheetId, settingsSheetId, viewUrl: process.env.NOCODB_VIEW_URL, shiftsSheetId, shiftSignupsSheetId, cutsSheetId }, // Session config session: { secret: process.env.SESSION_SECRET || 'your-secret-key-change-in-production', cookieDomain: process.env.COOKIE_DOMAIN }, // CORS config cors: { allowedOrigins: process.env.ALLOWED_ORIGINS?.split(',') || [] }, // Map defaults map: { defaultLat: parseFloat(process.env.DEFAULT_LAT) || 53.5461, defaultLng: parseFloat(process.env.DEFAULT_LNG) || -113.4938, defaultZoom: parseInt(process.env.DEFAULT_ZOOM) || 11, bounds: process.env.BOUND_NORTH ? { north: parseFloat(process.env.BOUND_NORTH), south: parseFloat(process.env.BOUND_SOUTH), east: parseFloat(process.env.BOUND_EAST), west: parseFloat(process.env.BOUND_WEST) } : null }, // MkDocs configuration mkdocs: { url: process.env.MKDOCS_URL || `http://localhost:${process.env.MKDOCS_SITE_SERVER_PORT || '4002'}`, searchUrl: process.env.MKDOCS_SEARCH_URL || `http://localhost:${process.env.MKDOCS_SITE_SERVER_PORT || '4002'}`, port: process.env.MKDOCS_SITE_SERVER_PORT || '4002' }, // Utility functions parseNocoDBUrl, // Convenience constants for controllers NOCODB_BASE_ID: process.env.NOCODB_PROJECT_ID || parsedIds.projectId, LOCATIONS_TABLE_ID: process.env.NOCODB_TABLE_ID || parsedIds.tableId, LOGIN_TABLE_ID: loginSheetId, SETTINGS_TABLE_ID: settingsSheetId, SHIFTS_TABLE_ID: shiftsSheetId, SHIFT_SIGNUPS_TABLE_ID: shiftSignupsSheetId, CUTS_TABLE_ID: cutsSheetId };