fix(core,gen): UseStateForUnknown для Optional+Computed + live-dосылка без тихого fallback (R1+R3+A/B)
This commit is contained in:
@@ -14,11 +14,15 @@ import (
|
||||
// дефолт ФОРМЫ операции, а НЕ состояние инстанса. Пример из HAR/edge_.har:
|
||||
// для needEnableAVI в cfsParams paramValue="false", тогда как live-значение инстанса
|
||||
// needEnableAVI=true. Досылка paramValue как live стирала ALB (reset-to-default).
|
||||
func (c *UniversalClient) instanceLiveParams(ctx context.Context, instanceUid string) map[string]string {
|
||||
//
|
||||
// При ошибке чтения live возвращает err: тихий возврат пустой map опасен — тогда
|
||||
// fallback уйдёт на paramValue (дефолт формы) и reset-баг вернётся без признаков
|
||||
// (см. R3 в ревью). Вызывающий код обязан не молчать.
|
||||
func (c *UniversalClient) instanceLiveParams(ctx context.Context, instanceUid string) (map[string]string, error) {
|
||||
live := map[string]string{}
|
||||
params, err := c.GetInstanceStateParams(ctx, instanceUid)
|
||||
if err != nil {
|
||||
return live
|
||||
return live, err
|
||||
}
|
||||
for k, v := range params {
|
||||
key := strings.ToLower(strings.TrimSpace(k))
|
||||
@@ -27,7 +31,7 @@ func (c *UniversalClient) instanceLiveParams(ctx context.Context, instanceUid st
|
||||
}
|
||||
live[key] = v
|
||||
}
|
||||
return live
|
||||
return live, nil
|
||||
}
|
||||
|
||||
// lookupLiveParam ищет live-значение параметра инстанса по возможным ключам cfsParam.
|
||||
|
||||
@@ -135,7 +135,10 @@ func (c *UniversalClient) RunInstanceOperationUniversalWithDefaults(ctx context.
|
||||
sent[paramId] = true
|
||||
}
|
||||
|
||||
live := c.instanceLiveParams(ctx, instanceUid)
|
||||
live, liveErr := c.instanceLiveParams(ctx, instanceUid)
|
||||
if liveErr != nil {
|
||||
return fmt.Errorf("не удалось прочитать live-значения инстанса для досылки modify: %w", liveErr)
|
||||
}
|
||||
for _, param := range cfsParams {
|
||||
if sent[param.SvcOperationCfsParamId] {
|
||||
continue
|
||||
@@ -143,9 +146,15 @@ func (c *UniversalClient) RunInstanceOperationUniversalWithDefaults(ctx context.
|
||||
|
||||
// Приоритет: live state.params инстанса → paramValue операции → defaultValue.
|
||||
// paramValue из cfsParams — дефолт формы, не состояние инстанса (см. operation_cfs.go).
|
||||
// Симметрично runInstanceOperationByCode: если ни одного источника нет — пропускаем
|
||||
// (иначе уйдёт синтетический "0"/"false"/"[]" и нарушит constraint).
|
||||
val, hasLive := lookupLiveParam(live, param)
|
||||
if !hasLive {
|
||||
if param.ParamValue != nil {
|
||||
if (param.ParamValue == nil || strings.TrimSpace(*param.ParamValue) == "") &&
|
||||
(param.DefaultValue == nil || strings.TrimSpace(*param.DefaultValue) == "") {
|
||||
continue
|
||||
}
|
||||
if param.ParamValue != nil && strings.TrimSpace(*param.ParamValue) != "" {
|
||||
val = *param.ParamValue
|
||||
} else if param.DefaultValue != nil {
|
||||
val = *param.DefaultValue
|
||||
|
||||
@@ -105,7 +105,10 @@ func (c *UniversalClient) runInstanceOperationByCode(ctx context.Context, instan
|
||||
sent[paramId] = true
|
||||
}
|
||||
|
||||
live := c.instanceLiveParams(ctx, instanceUid)
|
||||
live, liveErr := c.instanceLiveParams(ctx, instanceUid)
|
||||
if liveErr != nil {
|
||||
return fmt.Errorf("не удалось прочитать live-значения инстанса для досылки modify: %w", liveErr)
|
||||
}
|
||||
for _, param := range cfsParams {
|
||||
if sent[param.SvcOperationCfsParamId] {
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user