diff --git a/internal/app/api/v0/handlers/endpoint_config.go b/internal/app/api/v0/handlers/endpoint_config.go index 1fe3afb..9936644 100644 --- a/internal/app/api/v0/handlers/endpoint_config.go +++ b/internal/app/api/v0/handlers/endpoint_config.go @@ -107,7 +107,7 @@ func (e ConfigEndpoint) handleSettingsGet() http.HandlerFunc { names := make([]model.SettingsBackendNames, 0, len(controllers)) for _, controller := range controllers { - displayName := controller.DisplayName + displayName := controller.GetDisplayName() if displayName == "" { displayName = controller.Id // fallback to ID if no display name is set } diff --git a/internal/config/backend.go b/internal/config/backend.go index 3ec7ff0..f81adad 100644 --- a/internal/config/backend.go +++ b/internal/config/backend.go @@ -44,6 +44,15 @@ type BackendBase struct { DisplayName string `yaml:"display_name"` // A display name for the backend } +// GetDisplayName returns the display name of the backend. +// If no display name is set, it falls back to the ID. +func (b BackendBase) GetDisplayName() string { + if b.DisplayName == "" { + return b.Id // Fallback to ID if no display name is set + } + return b.DisplayName +} + type BackendMikrotik struct { BackendBase `yaml:",inline"` // Embed the base fields @@ -71,3 +80,15 @@ func (b *BackendMikrotik) GetConcurrency() int { } return b.Concurrency } + +// GetApiTimeout returns the configured API timeout or a sane default (30 seconds) +// when the configured value is zero or negative. +func (b *BackendMikrotik) GetApiTimeout() time.Duration { + if b == nil { + return 30 * time.Second + } + if b.ApiTimeout <= 0 { + return 30 * time.Second + } + return b.ApiTimeout +} diff --git a/internal/lowlevel/mikrotik.go b/internal/lowlevel/mikrotik.go index 79b53d0..49ef1d7 100644 --- a/internal/lowlevel/mikrotik.go +++ b/internal/lowlevel/mikrotik.go @@ -150,10 +150,6 @@ func NewMikrotikApiClient(coreCfg *config.Config, cfg *config.BackendMikrotik) ( cfg: cfg, } - if cfg.ApiTimeout == 0 { - cfg.ApiTimeout = 30 * time.Second // Default timeout for API requests - } - err := c.setup() if err != nil { return nil, err @@ -171,7 +167,7 @@ func (m *MikrotikApiClient) setup() error { InsecureSkipVerify: !m.cfg.ApiVerifyTls, }, }, - Timeout: m.cfg.ApiTimeout, + Timeout: m.cfg.GetApiTimeout(), } if m.cfg.Debug { @@ -304,7 +300,7 @@ func (m *MikrotikApiClient) Query( command string, opts *MikrotikRequestOptions, ) MikrotikApiResponse[[]GenericJsonObject] { - apiCtx, cancel := context.WithTimeout(ctx, m.cfg.ApiTimeout) + apiCtx, cancel := context.WithTimeout(ctx, m.cfg.GetApiTimeout()) defer cancel() fullUrl := opts.GetPath(m.getFullPath(command)) @@ -327,7 +323,7 @@ func (m *MikrotikApiClient) Get( command string, opts *MikrotikRequestOptions, ) MikrotikApiResponse[GenericJsonObject] { - apiCtx, cancel := context.WithTimeout(ctx, m.cfg.ApiTimeout) + apiCtx, cancel := context.WithTimeout(ctx, m.cfg.GetApiTimeout()) defer cancel() fullUrl := opts.GetPath(m.getFullPath(command)) @@ -350,7 +346,7 @@ func (m *MikrotikApiClient) Create( command string, payload GenericJsonObject, ) MikrotikApiResponse[GenericJsonObject] { - apiCtx, cancel := context.WithTimeout(ctx, m.cfg.ApiTimeout) + apiCtx, cancel := context.WithTimeout(ctx, m.cfg.GetApiTimeout()) defer cancel() fullUrl := m.getFullPath(command) @@ -373,7 +369,7 @@ func (m *MikrotikApiClient) Update( command string, payload GenericJsonObject, ) MikrotikApiResponse[GenericJsonObject] { - apiCtx, cancel := context.WithTimeout(ctx, m.cfg.ApiTimeout) + apiCtx, cancel := context.WithTimeout(ctx, m.cfg.GetApiTimeout()) defer cancel() fullUrl := m.getFullPath(command) @@ -395,7 +391,7 @@ func (m *MikrotikApiClient) Delete( ctx context.Context, command string, ) MikrotikApiResponse[EmptyResponse] { - apiCtx, cancel := context.WithTimeout(ctx, m.cfg.ApiTimeout) + apiCtx, cancel := context.WithTimeout(ctx, m.cfg.GetApiTimeout()) defer cancel() fullUrl := m.getFullPath(command) @@ -418,7 +414,7 @@ func (m *MikrotikApiClient) ExecList( command string, payload GenericJsonObject, ) MikrotikApiResponse[[]GenericJsonObject] { - apiCtx, cancel := context.WithTimeout(ctx, m.cfg.ApiTimeout) + apiCtx, cancel := context.WithTimeout(ctx, m.cfg.GetApiTimeout()) defer cancel() fullUrl := m.getFullPath(command)