package scenario import ( "encoding/json" "git.iwork-ai.com/xdc/iqudo-top1/internal/model" ) func (h *Handler) fieldReferencedByReleasedSOP(scenarioID uint64, fieldKey string, tenantID uint64) bool { statuses := []string{"published", "offline", "superseded"} var nodes []model.SOPNode err := h.db.Table("sop_nodes n").Select("n.*").Joins("JOIN sop_versions sv ON sv.id = n.sop_version_id").Joins("JOIN sops s ON s.id = sv.sop_id").Where("s.scenario_id = ? AND n.tenant_id = ? AND sv.status IN ?", scenarioID, tenantID, statuses).Scan(&nodes).Error if err != nil { return true } for _, node := range nodes { if jsonReferencesField(node.Config, fieldKey) { return true } } var edges []model.SOPEdge err = h.db.Table("sop_edges e").Select("e.*").Joins("JOIN sop_versions sv ON sv.id = e.sop_version_id").Joins("JOIN sops s ON s.id = sv.sop_id").Where("s.scenario_id = ? AND e.tenant_id = ? AND sv.status IN ?", scenarioID, tenantID, statuses).Scan(&edges).Error if err != nil { return true } for _, edge := range edges { if jsonReferencesField(edge.Condition, fieldKey) { return true } } return false } func jsonReferencesField(raw []byte, fieldKey string) bool { var value interface{} if err := json.Unmarshal(raw, &value); err != nil { return true } return valueReferencesField(value, fieldKey) } func valueReferencesField(value interface{}, fieldKey string) bool { switch typed := value.(type) { case map[string]interface{}: for key, child := range typed { if key == "field_key" || key == "field" { if child == fieldKey { return true } } if valueReferencesField(child, fieldKey) { return true } } case []interface{}: for _, child := range typed { if child == fieldKey || valueReferencesField(child, fieldKey) { return true } } } return false }