Initial commit
Dieser Commit ist enthalten in:
127
lizenzserver/models/__init__.py
Normale Datei
127
lizenzserver/models/__init__.py
Normale Datei
@ -0,0 +1,127 @@
|
||||
from datetime import datetime
|
||||
from typing import Optional, List, Dict, Any
|
||||
from dataclasses import dataclass, field
|
||||
from enum import Enum
|
||||
|
||||
class EventType(Enum):
|
||||
"""License event types"""
|
||||
ACTIVATION = "activation"
|
||||
DEACTIVATION = "deactivation"
|
||||
REACTIVATION = "reactivation"
|
||||
TRANSFER = "transfer"
|
||||
|
||||
class AnomalyType(Enum):
|
||||
"""Anomaly detection types"""
|
||||
MULTIPLE_IPS = "multiple_ips"
|
||||
RAPID_HARDWARE_CHANGE = "rapid_hardware_change"
|
||||
SUSPICIOUS_PATTERN = "suspicious_pattern"
|
||||
CONCURRENT_USE = "concurrent_use"
|
||||
GEO_ANOMALY = "geo_anomaly"
|
||||
|
||||
class Severity(Enum):
|
||||
"""Anomaly severity levels"""
|
||||
LOW = "low"
|
||||
MEDIUM = "medium"
|
||||
HIGH = "high"
|
||||
CRITICAL = "critical"
|
||||
|
||||
@dataclass
|
||||
class License:
|
||||
"""License domain model"""
|
||||
id: str
|
||||
license_key: str
|
||||
customer_id: str
|
||||
max_devices: int
|
||||
is_active: bool
|
||||
is_test: bool
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
expires_at: Optional[datetime] = None
|
||||
features: List[str] = field(default_factory=list)
|
||||
metadata: Dict[str, Any] = field(default_factory=dict)
|
||||
|
||||
@dataclass
|
||||
class LicenseToken:
|
||||
"""Offline validation token"""
|
||||
id: str
|
||||
license_id: str
|
||||
token: str
|
||||
hardware_id: str
|
||||
valid_until: datetime
|
||||
created_at: datetime
|
||||
last_validated: Optional[datetime] = None
|
||||
validation_count: int = 0
|
||||
|
||||
@dataclass
|
||||
class Heartbeat:
|
||||
"""License heartbeat"""
|
||||
id: int
|
||||
license_id: str
|
||||
hardware_id: str
|
||||
ip_address: Optional[str]
|
||||
user_agent: Optional[str]
|
||||
app_version: Optional[str]
|
||||
timestamp: datetime
|
||||
session_data: Dict[str, Any] = field(default_factory=dict)
|
||||
|
||||
@dataclass
|
||||
class ActivationEvent:
|
||||
"""License activation event"""
|
||||
id: str
|
||||
license_id: str
|
||||
event_type: EventType
|
||||
hardware_id: Optional[str]
|
||||
previous_hardware_id: Optional[str]
|
||||
ip_address: Optional[str]
|
||||
user_agent: Optional[str]
|
||||
success: bool
|
||||
error_message: Optional[str]
|
||||
metadata: Dict[str, Any] = field(default_factory=dict)
|
||||
created_at: datetime
|
||||
|
||||
@dataclass
|
||||
class AnomalyDetection:
|
||||
"""Detected anomaly"""
|
||||
id: str
|
||||
license_id: str
|
||||
anomaly_type: AnomalyType
|
||||
severity: Severity
|
||||
details: Dict[str, Any]
|
||||
detected_at: datetime
|
||||
resolved: bool = False
|
||||
resolved_at: Optional[datetime] = None
|
||||
resolved_by: Optional[str] = None
|
||||
action_taken: Optional[str] = None
|
||||
|
||||
@dataclass
|
||||
class Session:
|
||||
"""Active session"""
|
||||
id: str
|
||||
license_id: str
|
||||
hardware_id: str
|
||||
session_token: str
|
||||
ip_address: Optional[str]
|
||||
started_at: datetime
|
||||
last_seen: datetime
|
||||
expires_at: datetime
|
||||
|
||||
@dataclass
|
||||
class ValidationRequest:
|
||||
"""License validation request"""
|
||||
license_key: str
|
||||
hardware_id: str
|
||||
app_version: Optional[str] = None
|
||||
ip_address: Optional[str] = None
|
||||
user_agent: Optional[str] = None
|
||||
|
||||
@dataclass
|
||||
class ValidationResponse:
|
||||
"""License validation response"""
|
||||
valid: bool
|
||||
license_id: Optional[str] = None
|
||||
token: Optional[str] = None
|
||||
expires_at: Optional[datetime] = None
|
||||
features: List[str] = field(default_factory=list)
|
||||
limits: Dict[str, Any] = field(default_factory=dict)
|
||||
error: Optional[str] = None
|
||||
error_code: Optional[str] = None
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren