export interface Config { port: number // Napta uses Auth0 Machine-to-Machine (client-credentials), not a static token: // client_id + client_secret are exchanged for a short-lived JWT (see napta.ts). naptaClientId: string | null naptaClientSecret: string | null naptaBaseUrl: string naptaAuthUrl: string naptaAudience: string slackBotToken: string | null } export const config: Config = { port: Number(process.env.PORT ?? 8000), naptaClientId: process.env.NAPTA_CLIENT_ID || null, naptaClientSecret: process.env.NAPTA_CLIENT_SECRET || null, naptaBaseUrl: process.env.NAPTA_BASE_URL || "https://app.napta.io/api/v1", naptaAuthUrl: process.env.NAPTA_AUTH_URL || "https://auth.napta.io/oauth/token", naptaAudience: process.env.NAPTA_AUDIENCE || "backend", slackBotToken: process.env.SLACK_BOT_TOKEN || null, } // Listing Projects and Members needs Napta. Without it, the API serves fixtures. export const hasNaptaCredentials: boolean = Boolean( config.naptaClientId && config.naptaClientSecret, ) // Slack only resolves Avatars; it's optional and degrades to initials when absent. export const hasSlackCredentials: boolean = Boolean(config.slackBotToken)