File size: 2,005 Bytes
b4f2238
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
"""Business logic services."""

from __future__ import annotations

from dataclasses import dataclass
from typing import Any

from .id_service import FolderTemplateIdService


@dataclass(frozen=True)
class FolderTemplateStructureRules:
    id_service: FolderTemplateIdService

    def validate_and_fix_structure_ids(
        self, structure: dict[str, Any], template_id: int | None = None
    ) -> tuple[bool, dict[str, Any], list[str]]:
        if not structure or not isinstance(structure, dict):
            return False, structure, []

        current_ids = self.id_service.collect_structure_ids(structure)
        internal_duplicates = self.id_service.find_internal_duplicates(current_ids)
        global_duplicates = self.id_service.find_global_duplicates(current_ids, template_id)

        all_duplicates = internal_duplicates | global_duplicates
        if not all_duplicates:
            return False, structure, []

        import copy

        fixed_structure = copy.deepcopy(structure)
        self.id_service.replace_duplicate_ids_in_structure(fixed_structure, all_duplicates)
        fix_messages = [f"已自动修复 {len(all_duplicates)} 个重复ID: {', '.join(sorted(all_duplicates))}"]
        return True, fixed_structure, fix_messages

    def validate_structure_ids(
        self, structure: dict[str, Any], template_id: int | None = None
    ) -> tuple[bool, list[str]]:
        if not structure or not isinstance(structure, dict):
            return True, []

        current_ids = self.id_service.collect_structure_ids(structure)
        internal_duplicates = self.id_service.find_internal_duplicates(current_ids)
        if internal_duplicates:
            return False, [f"结构内部存在重复ID: {', '.join(internal_duplicates)}"]

        global_duplicates = self.id_service.find_global_duplicates(current_ids, template_id)
        if global_duplicates:
            return False, [f"结构ID与其他模板重复: {', '.join(global_duplicates)}"]

        return True, []