Files
MikrotikManager/lib/statistics-context.ts
T

30 lines
2.2 KiB
TypeScript

import { isStatisticsPivotDim, isStatisticsSliceKind } from './statistics-dims'
export const STATISTICS_CONTEXT_KEYS = ['dim', 'tab', 'view', 'planes', 'pivotRow', 'pivotCol', 'country', 'service', 'asn', 'serverId', 'userId', 'iface'] as const
export function statisticsContextError(params: URLSearchParams): string | null {
for (const key of STATISTICS_CONTEXT_KEYS) {
if (params.getAll(key).length > 1) return `Параметр ${key} указан несколько раз.`
const value = params.get(key)
if (value !== null && !value.trim()) return `Параметр ${key} пуст.`
}
for (const key of ['dim', 'tab']) {
const value = params.get(key)
if (value !== null && !isStatisticsSliceKind(value)) return 'Неизвестный разрез статистики.'
}
if (params.has('dim') && params.has('tab') && params.get('dim') !== params.get('tab')) return 'Параметры dim и tab задают разные разрезы.'
if (params.has('view') && !['explore', 'pivot'].includes(params.get('view')!)) return 'Неизвестный вид отчёта.'
if (params.has('planes') && !['unique', 'all'].includes(params.get('planes')!)) return 'Неизвестный режим учёта трафика.'
for (const key of ['pivotRow', 'pivotCol']) {
if (params.has(key) && !isStatisticsPivotDim(params.get(key)!)) return 'Неизвестное измерение сводки.'
}
if (params.get('view') === 'pivot' && (params.get('pivotRow') ?? 'country') === (params.get('pivotCol') ?? 'service')) return 'Выберите разные измерения строк и колонок.'
const serverId = params.get('serverId')?.trim()
if (serverId && (!/^\d+$/.test(serverId) || !Number.isSafeInteger(Number(serverId)) || Number(serverId) <= 0)) return 'ID сервера должен быть положительным целым числом.'
const asn = params.get('asn')?.trim()
if (asn && (!/^-?\d+$/.test(asn) || !Number.isSafeInteger(Number(asn)))) return 'ASN должен быть целым числом.'
const country = params.get('country')?.trim()
if (country && country.length !== 2) return 'Код страны должен состоять из двух символов.'
return null
}