64 lines
1.8 KiB
Go
64 lines
1.8 KiB
Go
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
|
|
}
|