mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-06 07:49:52 +03:00
60 lines
1.5 KiB
TypeScript
60 lines
1.5 KiB
TypeScript
import Schema from 'async-validator';
|
|
import type { MqttSettingsType } from 'types';
|
|
|
|
import { IP_OR_HOSTNAME_VALIDATOR } from './shared';
|
|
|
|
// Constants for validation ranges
|
|
const PORT_MIN = 0;
|
|
const PORT_MAX = 65535;
|
|
const KEEP_ALIVE_MIN = 1;
|
|
const KEEP_ALIVE_MAX = 86400;
|
|
const HEARTBEAT_MIN = 10;
|
|
const HEARTBEAT_MAX = 86400;
|
|
|
|
// Reusable validator rules
|
|
const REQUIRED_HOST_VALIDATOR = [
|
|
{ required: true, message: 'Host is required' },
|
|
IP_OR_HOSTNAME_VALIDATOR
|
|
];
|
|
|
|
const REQUIRED_BASE_VALIDATOR = [{ required: true, message: 'Base is required' }];
|
|
|
|
const PORT_VALIDATOR = [
|
|
{ required: true, message: 'Port is required' },
|
|
{
|
|
type: 'number' as const,
|
|
min: PORT_MIN,
|
|
max: PORT_MAX,
|
|
message: `Port must be between ${PORT_MIN} and ${PORT_MAX}`
|
|
}
|
|
];
|
|
|
|
const createNumberValidator = (fieldName: string, min: number, max: number) => [
|
|
{ required: true, message: `${fieldName} is required` },
|
|
{
|
|
type: 'number' as const,
|
|
min,
|
|
max,
|
|
message: `${fieldName} must be between ${min} and ${max}`
|
|
}
|
|
];
|
|
|
|
export const createMqttSettingsValidator = (mqttSettings: MqttSettingsType) =>
|
|
new Schema({
|
|
...(mqttSettings.enabled && {
|
|
host: REQUIRED_HOST_VALIDATOR,
|
|
base: REQUIRED_BASE_VALIDATOR,
|
|
port: PORT_VALIDATOR,
|
|
keep_alive: createNumberValidator(
|
|
'Keep alive',
|
|
KEEP_ALIVE_MIN,
|
|
KEEP_ALIVE_MAX
|
|
),
|
|
publish_time_heartbeat: createNumberValidator(
|
|
'Heartbeat',
|
|
HEARTBEAT_MIN,
|
|
HEARTBEAT_MAX
|
|
)
|
|
})
|
|
});
|