require('dotenv').config(); const { setupFdk } = require('@gofynd/fdk-extension-javascript/express'); const { MemoryStorage } = require('@gofynd/fdk-extension-javascript/express/storage'); const { createFdkStorage } = require('./postgresFdkStorage'); function normalizeEnvText(value) { return typeof value === 'string' ? value.trim() : ''; } function trimTrailingSlash(value) { return normalizeEnvText(value).replace(/\/+$/, ''); } function buildRedirectUrl(baseUrl, companyId) { const normalizedBaseUrl = trimTrailingSlash(baseUrl); const query = companyId ? `?blt-gtw-fc-cid=${encodeURIComponent(companyId)}` : ''; return `${normalizedBaseUrl}/${query}`.replace(/\/\?/, '/?'); } function createFdkExtension() { const apiKey = normalizeEnvText(process.env.EXTENSION_API_KEY); const apiSecret = normalizeEnvText(process.env.EXTENSION_API_SECRET); const baseUrl = normalizeEnvText(process.env.EXTENSION_BASE_URL || process.env.EXTENSION_URL); const cluster = normalizeEnvText(process.env.EXTENSION_CLUSTER_URL) || 'https://api.fynd.com'; if (!apiKey || !apiSecret || !baseUrl) { return null; } try { const storage = createFdkStorage(process.env.FDK_STORAGE_CONNECTION_STRING) || new MemoryStorage('sms_extension_'); if (storage instanceof MemoryStorage) { console.warn('[FDK] FDK_STORAGE_CONNECTION_STRING is not set. Falling back to in-memory session storage.'); } return setupFdk({ api_key: apiKey, api_secret: apiSecret, base_url: trimTrailingSlash(baseUrl), cluster, scopes: ['company/saleschannel', 'company/application/settings'], callbacks: { auth: async (req) => buildRedirectUrl(baseUrl, req?.fdkSession?.company_id || req?.query?.company_id || ''), uninstall: async (req) => { const companyId = req?.body?.company_id || req?.query?.company_id || req?.fdkSession?.company_id || ''; console.log(`[FDK] uninstall callback received for company ${companyId || 'unknown'}`); }, }, storage, }); } catch (error) { console.warn(`[FDK] Failed to initialize FDK: ${error.message}`); return null; } } const fdkExtension = createFdkExtension(); module.exports = { fdkExtension, isFdkConfigured: Boolean(fdkExtension), };