import { GroupLimits } from "../../types/gen/types.gen"; /** * Výchozí limity skupinových objednávek — pojistky proti překlepům (dvojklik, omylem vložený text), * ne ochrana proti zlému úmyslu. Lze je přepsat proměnnými prostředí (viz .env.template). */ export const DEFAULT_GROUP_LIMITS: GroupLimits = { maxNoteLength: 300, maxSurchargeTextLength: 100, maxNameLength: 100, maxUrlLength: 500, maxAmountKc: 10_000, maxItemQuantity: 10, maxItems: 20, }; /** Proměnná prostředí a rozumný strop pro každý limit. */ const ENV: Record = { maxNoteLength: { name: 'GROUP_MAX_NOTE_LENGTH', max: 5_000 }, maxSurchargeTextLength: { name: 'GROUP_MAX_SURCHARGE_TEXT_LENGTH', max: 1_000 }, maxNameLength: { name: 'GROUP_MAX_NAME_LENGTH', max: 1_000 }, maxUrlLength: { name: 'GROUP_MAX_URL_LENGTH', max: 5_000 }, maxAmountKc: { name: 'GROUP_MAX_AMOUNT_KC', max: 1_000_000 }, maxItemQuantity: { name: 'GROUP_MAX_ITEM_QUANTITY', max: 1_000 }, maxItems: { name: 'GROUP_MAX_ITEMS', max: 1_000 }, }; let cached: GroupLimits | undefined; /** * Vrátí limity skupinových objednávek (výchozí hodnoty přepsané z env). Čte se líně při prvním * použití — moduly s routami se importují dřív, než dotenv načte .env soubor. * Neplatná hodnota (ne celé kladné číslo, nad stropem) se ignoruje s varováním. */ export function getGroupLimits(): GroupLimits { if (cached) return cached; const limits = { ...DEFAULT_GROUP_LIMITS }; for (const key of Object.keys(ENV) as (keyof GroupLimits)[]) { const { name, max } = ENV[key]; const raw = process.env[name]; if (raw === undefined || raw.trim() === '') continue; const value = Number(raw); if (!Number.isInteger(value) || value < 1 || value > max) { console.warn(`Limity: neplatná hodnota ${name}="${raw}" (povoleno 1–${max}), používám výchozí ${limits[key]}`); continue; } limits[key] = value; } cached = limits; return limits; } /** Pro testy — znovu načte limity z env při dalším volání. */ export function resetGroupLimits(): void { cached = undefined; }