Просмотр исходного кода

fix(inbounds): remove stale reverse outbound tags after client deletion

MHSanaei 1 день назад
Родитель
Сommit
c718e7ca5b
1 измененных файлов с 36 добавлено и 9 удалено
  1. 36 9
      web/service/inbound.go

+ 36 - 9
web/service/inbound.go

@@ -1747,18 +1747,45 @@ func (s *InboundService) GetInboundTags() (string, error) {
 
 func (s *InboundService) GetClientReverseTags() (string, error) {
 	db := database.GetDB()
-	var rawTags []string
-	err := db.Raw(`
-		SELECT DISTINCT JSON_EXTRACT(client.value, '$.reverse.tag')
-		FROM inbounds,
-			JSON_EACH(JSON_EXTRACT(inbounds.settings, '$.clients')) AS client
-		WHERE inbounds.protocol = 'vless'
-		  AND JSON_EXTRACT(client.value, '$.reverse.tag') IS NOT NULL
-		  AND JSON_EXTRACT(client.value, '$.reverse.tag') != ''
-	`).Scan(&rawTags).Error
+	var inbounds []model.Inbound
+	err := db.Model(model.Inbound{}).Select("settings").Where("protocol = ?", "vless").Find(&inbounds).Error
 	if err != nil && err != gorm.ErrRecordNotFound {
 		return "[]", err
 	}
+
+	tagSet := make(map[string]struct{})
+	for _, inbound := range inbounds {
+		var settings map[string]any
+		if err := json.Unmarshal([]byte(inbound.Settings), &settings); err != nil {
+			continue
+		}
+		clients, ok := settings["clients"].([]any)
+		if !ok {
+			continue
+		}
+		for _, client := range clients {
+			clientMap, ok := client.(map[string]any)
+			if !ok {
+				continue
+			}
+			reverse, ok := clientMap["reverse"].(map[string]any)
+			if !ok {
+				continue
+			}
+			tag, _ := reverse["tag"].(string)
+			tag = strings.TrimSpace(tag)
+			if tag != "" {
+				tagSet[tag] = struct{}{}
+			}
+		}
+	}
+
+	rawTags := make([]string, 0, len(tagSet))
+	for tag := range tagSet {
+		rawTags = append(rawTags, tag)
+	}
+	sort.Strings(rawTags)
+
 	result, _ := json.Marshal(rawTags)
 	return string(result), nil
 }