瀏覽代碼

Merge remote-tracking branch 'origin/dev' into dev

Vanessa 1 年之前
父節點
當前提交
a329d073ab
共有 1 個文件被更改,包括 45 次插入2 次删除
  1. 45 2
      kernel/av/av.go

+ 45 - 2
kernel/av/av.go

@@ -233,8 +233,51 @@ func ParseAttributeView(avID string) (ret *AttributeView, err error) {
 	ret = &AttributeView{}
 	if err = gulu.JSON.UnmarshalJSON(data, ret); nil != err {
 		if strings.Contains(err.Error(), ".relation.contents of type av.Value") {
-			// v3.0.3 兼容之前旧版本,通过正则将 "relation":{"contents":[".*"],"blockIDs": 替换为 "relation":{"contents":null,"blockIDs":
-			data = regexp.MustCompile(`"relation":{"contents":\[".*"\],"blockIDs":`).ReplaceAll(data, []byte(`"relation":{"contents":null,"blockIDs":`))
+			mapAv := map[string]interface{}{}
+			if err = gulu.JSON.UnmarshalJSON(data, &mapAv); nil != err {
+				logging.LogErrorf("unmarshal attribute view [%s] failed: %s", avID, err)
+				return
+			}
+
+			// v3.0.3 兼容之前旧版本,将 relation.contents[""] 转换为 null
+			keyValues := mapAv["keyValues"]
+			keyValuesMap := keyValues.([]interface{})
+			for _, kv := range keyValuesMap {
+				kvMap := kv.(map[string]interface{})
+				if values := kvMap["values"]; nil != values {
+					valuesMap := values.([]interface{})
+					for _, v := range valuesMap {
+						if vMap := v.(map[string]interface{}); nil != vMap["relation"] {
+							vMap["relation"].(map[string]interface{})["contents"] = nil
+						}
+					}
+				}
+			}
+
+			views := mapAv["views"]
+			viewsMap := views.([]interface{})
+			for _, view := range viewsMap {
+				if table := view.(map[string]interface{})["table"]; nil != table {
+					tableMap := table.(map[string]interface{})
+					if filters := tableMap["filters"]; nil != filters {
+						filtersMap := filters.([]interface{})
+						for _, f := range filtersMap {
+							if fMap := f.(map[string]interface{}); nil != fMap["value"] {
+								if valueMap := fMap["value"].(map[string]interface{}); nil != valueMap["relation"] {
+									valueMap["relation"].(map[string]interface{})["contents"] = nil
+								}
+							}
+						}
+					}
+				}
+			}
+
+			data, err = gulu.JSON.MarshalJSON(mapAv)
+			if nil != err {
+				logging.LogErrorf("marshal attribute view [%s] failed: %s", avID, err)
+				return
+			}
+
 			if err = gulu.JSON.UnmarshalJSON(data, ret); nil != err {
 				logging.LogErrorf("unmarshal attribute view [%s] failed: %s", avID, err)
 				return