File size: 4,899 Bytes
6ac8bc4
 
 
90451e9
d0cb016
90451e9
5c47ae0
2c84ed4
6ac8bc4
 
90451e9
d0cb016
 
 
90451e9
1fdfeb1
 
 
 
 
 
5c47ae0
1fdfeb1
 
 
 
 
 
 
 
 
 
 
 
 
90451e9
 
d0cb016
90451e9
 
 
 
 
 
 
d0cb016
90451e9
 
d0cb016
90451e9
 
 
d0cb016
2c84ed4
90451e9
d0cb016
 
2c84ed4
90451e9
6ac8bc4
a027a75
 
 
 
 
d0cb016
90451e9
 
6ac8bc4
2c84ed4
90451e9
 
 
2c84ed4
a027a75
6ac8bc4
 
90451e9
 
 
5c47ae0
90451e9
 
 
5c47ae0
31a3df4
2c84ed4
 
 
31a3df4
2c84ed4
 
 
31a3df4
2c84ed4
 
 
 
31a3df4
2c84ed4
 
 
aa8864d
 
 
 
 
 
d0cb016
90451e9
 
d0cb016
 
2c84ed4
d0cb016
aa8864d
2c84ed4
aa8864d
 
2c84ed4
aa8864d
90451e9
 
2c84ed4
90451e9
 
 
2c84ed4
aa8864d
90451e9
aa8864d
90451e9
aa8864d
90451e9
 
aa8864d
90451e9
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import os
import json
from datetime import datetime
from typing import List, Dict, Optional
from pathlib import Path
import shutil


class CaseManager:
    def __init__(self, base_path: str = "data/cases"):
        """Initialize CaseManager with a base directory to store cases."""
        self.base_path = Path(base_path)
        self.base_path.mkdir(parents=True, exist_ok=True)
        self.cases = {}
        self._load_cases()
    
    def delete_case(self, case_id: str) -> bool:
        """Delete a case and all its associated data."""
        try:
            if case_id not in self.cases:
                raise ValueError(f"Case with ID {case_id} not found")

            case_path = self.base_path / case_id
            
            # Delete all documents in the case directory
            if case_path.exists():
                shutil.rmtree(case_path)
            
            # Remove from cases dictionary
            del self.cases[case_id]
            
            return True
        except Exception as e:
            raise Exception(f"Error deleting case: {str(e)}")
            
    def _load_cases(self):
        """Load existing cases from storage."""
        try:
            for case_dir in self.base_path.iterdir():
                if case_dir.is_dir():
                    metadata_file = case_dir / 'metadata.json'
                    if metadata_file.exists():
                        with open(metadata_file, 'r') as f:
                            case_data = json.load(f)
                            self.cases[case_dir.name] = case_data
        except Exception as e:
            print(f"Error loading cases: {e}")
            self.cases = {}

    def create_case(self, title: str, description: str, case_type: str) -> str:
        """Create a new case and save it to storage."""
        case_id = datetime.now().strftime('%Y%m%d_%H%M%S')
        case_path = self.base_path / case_id

        # Create case directory structure
        case_path.mkdir(exist_ok=True)
        (case_path / 'documents').mkdir(exist_ok=True)

        # Prepare case data
        case_data = {
            'id': case_id,
            'title': title,
            'description': description,
            'case_type': case_type,
            'created_at': datetime.now().isoformat(),
            'updated_at': datetime.now().isoformat(),
            'status': 'active',
            'documents': []
        }

        # Save case metadata
        with open(case_path / 'metadata.json', 'w') as f:
            json.dump(case_data, f, indent=2)

        self.cases[case_id] = case_data
        return case_id

    def get_all_cases(self) -> List[Dict]:
        """Get a list of all cases."""
        return list(self.cases.values())

    def get_case(self, case_id: str) -> Optional[Dict]:
        """Get details of a specific case."""
        return self.cases.get(case_id)

    def add_document(self, case_id: str, document_data: Dict):
        """Add a document to a case."""
        if case_id not in self.cases:
            raise ValueError(f"Case with ID {case_id} not found.")

        # Update document metadata
        document_data['id'] = document_data.get('id', datetime.now().strftime('%Y%m%d_%H%M%S'))
        document_data['added_at'] = document_data.get('added_at', datetime.now().isoformat())

        # Add document to case
        case = self.cases[case_id]
        case['documents'].append(document_data)
        case['updated_at'] = datetime.now().isoformat()

        # Save updated case metadata
        with open(self.base_path / case_id / 'metadata.json', 'w') as f:
            json.dump(case, f, indent=2)

    def list_documents(self, case_id: str) -> List[Dict]:
        """List all documents in a case."""
        if case_id not in self.cases:
            raise ValueError(f"Case with ID {case_id} not found.")
        return self.cases[case_id].get('documents', [])

    def remove_document(self, case_id: str, document_id: str) -> bool:
        """Remove a document from a case."""
        if case_id not in self.cases:
            return False

        case = self.cases[case_id]
        document = next((doc for doc in case['documents'] if doc['id'] == document_id), None)

        if not document:
            return False

        # Remove from case metadata
        case['documents'] = [doc for doc in case['documents'] if doc['id'] != document_id]
        case['updated_at'] = datetime.now().isoformat()

        # Save updated case metadata
        with open(self.base_path / case_id / 'metadata.json', 'w') as f:
            json.dump(case, f, indent=2)

        # Remove the physical file
        try:
            doc_path = Path(document['file_path'])
            if doc_path.exists():
                doc_path.unlink()
            return True
        except Exception as e:
            print(f"Error removing document file: {e}")
            return False