Files
2026-08-29 11:55:38 +03:00

33 lines
2.0 KiB
Go

package domain
import (
"fmt"
"git.cin.su/m/Assistant/contracts/configuration"
"git.cin.su/m/Assistant/platform/ids"
"strings"
"time"
)
var ErrConfigurationAuthorityRequired = fmt.Errorf("configuration change requires Authority and Commit")
func AssignmentFromConversation(kind, principalID, definitionRef, typedValue, sessionRef, sourceRef string, temporaryOverride bool, definition configuration.SettingDefinition, now time.Time) (configuration.SettingAssignment, error) {
if kind != "SET" || principalID == "" || definitionRef != string(definition.ID) || strings.TrimSpace(typedValue) == "" || now.IsZero() || definition.ValueType == configuration.ValueSecretRef {
return configuration.SettingAssignment{}, ErrInvalidConfigurationCommand
}
if sourceRef == "" {
return configuration.SettingAssignment{}, ErrInvalidConfigurationCommand
}
id, err := ids.New()
if err != nil {
return configuration.SettingAssignment{}, err
}
return configuration.SettingAssignment{ID: configuration.SettingAssignmentID(id), PrincipalID: principalID, DefinitionRef: string(definition.ID), DefinitionRevision: definition.Revision, Revision: 1, Selector: configuration.ScopeSelector{PrincipalRef: principalID, SessionRef: sessionRef, TemporaryOverride: temporaryOverride}, TypedValue: strings.TrimSpace(typedValue), Source: configuration.SourceHumanDirective, SourceRef: sourceRef, Lifecycle: configuration.SettingActive, RecordedAtUnixMillis: now.UnixMilli()}, nil
}
func ExplainEffectiveSetting(definition configuration.SettingDefinition, effective configuration.EffectiveSetting) string {
if effective.WinningAssignmentRef == "" {
return fmt.Sprintf("Настройка %s сейчас имеет системное значение %q.", definition.StableKey, effective.Value)
}
return fmt.Sprintf("Настройка %s сейчас имеет значение %q; применено scoped-правило %s.", definition.StableKey, effective.Value, effective.WinningAssignmentRef)
}