import { registerAs } from "@nestjs/config"; const numberFromEnv = (key: string, fallback: number): number => { const value = Number(process.env[key]); return Number.isFinite(value) && value > 0 ? value : fallback; }; export default registerAs("app", () => ({ env: process.env.NODE_ENV ?? "development", port: parseInt(process.env.PORT ?? "3001", 10), apiPrefix: "api", /** * Public origin of the freight customer portal. Password-reset links mailed * or SMS'd to customers are built against this, so it must be the address the * customer's browser can actually reach — not an internal service name. */ portalBaseUrl: ( process.env.FREIGHT_PORTAL_URL ?? "http://localhost:5173" ).replace(/\/+$/, ""), trainScheduling: { maxTrainWeightTons: numberFromEnv("TRAIN_SCHEDULING_MAX_WEIGHT_TONS", 3500), maxTrainLengthMeters: numberFromEnv("TRAIN_SCHEDULING_MAX_LENGTH_METERS", 760), maxWagonsPerTrain: numberFromEnv("TRAIN_SCHEDULING_MAX_WAGONS_PER_TRAIN", 53), }, // Consumed by @edr/api-common ExchangeModule.forRootAsync (see bookings.module.ts). cbeExchange: { /** CBE daily-exchange-rates JSON — USD `transactionalSelling` is used. */ scrapeUrl: process.env.CBE_EXCHANGE_SCRAPE_URL ?? process.env.CBE_EXCHANGE_API_URL ?? "https://combanketh.et/cbeapi/daily-exchange-rates/?_limit=1&_sort=Date%3ADESC", // No fallback env var: the fallback lives in freight.exchange_settings, // maintained by the backoffice and by write-back on every successful fetch. cacheTtlMs: numberFromEnv("CBE_EXCHANGE_CACHE_TTL_MS", 3_600_000), }, }));