diff --git a/services/api/server.mjs b/services/api/server.mjs index 8c63706..65c23e3 100644 --- a/services/api/server.mjs +++ b/services/api/server.mjs @@ -380,7 +380,7 @@ function clampSeriesLimit(value, fallback) { } function parseTimeframeToSeconds(tf) { - const v = String(tf || '').trim().toLowerCase(); + const v = normalizeChartTimeframe(tf); if (!v) return 60; const m = v.match(/^(\d+)(s|m|h|d)$/); if (!m) throw new Error(`invalid_tf`); @@ -391,6 +391,40 @@ function parseTimeframeToSeconds(tf) { return num * mult; } +const SUPPORTED_CHART_TIMEFRAMES = new Set([ + '1s', + '5s', + '15s', + '30s', + '1m', + '5m', + '15m', + '30m', + '1h', + '4h', + '8h', + '12h', + '1d', +]); + +function normalizeChartTimeframe(tf) { + const raw = String(tf || '').trim(); + if (!raw) return '1m'; + + const aliased = + raw === '1D' || raw === '24h' || raw === '24H' + ? '1d' + : raw === '1H' + ? '1h' + : raw.toLowerCase(); + + if (!SUPPORTED_CHART_TIMEFRAMES.has(aliased)) { + throw new Error('invalid_tf'); + } + + return aliased; +} + function isTruthy(value) { if (typeof value === 'boolean') return value; const v = String(value ?? '').trim().toLowerCase();