File size: 2,652 Bytes
5ccd893
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
Auth Data Models
Defines authentication and user data structures
"""
from dataclasses import dataclass, field
from typing import Optional, Dict, Any, List
from datetime import datetime


@dataclass
class LoginRequest:
    """Login request parameters"""
    email: str
    password: str

    def validate(self) -> List[str]:
        errors = []
        if not self.email or not self.email.strip():
            errors.append("Email is required")
        elif "@" not in self.email:
            errors.append("Invalid email format")
        if not self.password or len(self.password) < 6:
            errors.append("Password must be at least 6 characters")
        return errors


@dataclass
class SignUpRequest:
    """Sign-up request parameters"""
    email: str
    password: str
    full_name: str
    organization: Optional[str] = None
    purpose: Optional[str] = None

    def validate(self) -> List[str]:
        errors = []
        if not self.email or not self.email.strip():
            errors.append("Email is required")
        elif "@" not in self.email:
            errors.append("Invalid email format")
        if not self.password or len(self.password) < 6:
            errors.append("Password must be at least 6 characters")
        if not self.full_name or not self.full_name.strip():
            errors.append("Full name is required")
        return errors


@dataclass
class ProfileUpdate:
    """Profile update parameters"""
    full_name: Optional[str] = None
    organization: Optional[str] = None
    purpose: Optional[str] = None

    def to_dict(self) -> Dict[str, Any]:
        """Return only non-None fields"""
        d = {}
        if self.full_name is not None:
            d["full_name"] = self.full_name
        if self.organization is not None:
            d["organization"] = self.organization
        if self.purpose is not None:
            d["purpose"] = self.purpose
        return d


VALID_ACTIVITY_TYPES = [
    "login", "logout", "signup",
    "prediction_run", "weather_forecast",
    "chatbot_query", "profile_update",
    "settings_change", "dataset_view",
]


@dataclass
class ActivityLogEntry:
    """Activity log entry"""
    activity_type: str
    description: Optional[str] = None
    metadata: Optional[Dict[str, Any]] = None
    device_info: Optional[str] = None

    def validate(self) -> List[str]:
        errors = []
        if not self.activity_type:
            errors.append("activity_type is required")
        elif self.activity_type not in VALID_ACTIVITY_TYPES:
            errors.append(f"Invalid activity_type. Must be one of: {', '.join(VALID_ACTIVITY_TYPES)}")
        return errors