Dieser Commit ist enthalten in:
Claude Project Manager
2025-08-01 23:50:28 +02:00
Commit 04585e95b6
290 geänderte Dateien mit 64086 neuen und 0 gelöschten Zeilen

Datei anzeigen

@ -0,0 +1,174 @@
"""
Account Creation Event Entity - Event für jede Account-Erstellung
"""
from dataclasses import dataclass, field
from datetime import datetime, timedelta
from typing import List, Dict, Any, Optional
from enum import Enum
import uuid
class WorkflowStepStatus(Enum):
"""Status eines Workflow-Schritts"""
PENDING = "pending"
IN_PROGRESS = "in_progress"
COMPLETED = "completed"
FAILED = "failed"
SKIPPED = "skipped"
@dataclass
class WorkflowStep:
"""Einzelner Schritt im Account-Erstellungsprozess"""
step_name: str
start_time: datetime
end_time: Optional[datetime] = None
status: WorkflowStepStatus = WorkflowStepStatus.PENDING
retry_count: int = 0
error_message: Optional[str] = None
metadata: Dict[str, Any] = field(default_factory=dict)
@property
def duration(self) -> Optional[timedelta]:
"""Berechnet die Dauer des Schritts"""
if self.start_time and self.end_time:
return self.end_time - self.start_time
return None
@property
def success(self) -> bool:
"""Prüft ob der Schritt erfolgreich war"""
return self.status == WorkflowStepStatus.COMPLETED
def to_dict(self) -> Dict[str, Any]:
"""Konvertiert zu Dictionary"""
return {
'step_name': self.step_name,
'start_time': self.start_time.isoformat(),
'end_time': self.end_time.isoformat() if self.end_time else None,
'status': self.status.value,
'retry_count': self.retry_count,
'error_message': self.error_message,
'metadata': self.metadata,
'duration_seconds': self.duration.total_seconds() if self.duration else None
}
@dataclass
class AccountData:
"""Daten des erstellten Accounts"""
platform: str
username: str
password: str
email: str
phone: Optional[str] = None
full_name: Optional[str] = None
birthday: Optional[str] = None
profile_image: Optional[str] = None
bio: Optional[str] = None
verification_status: str = "unverified"
metadata: Dict[str, Any] = field(default_factory=dict)
@dataclass
class ErrorDetails:
"""Details zu aufgetretenen Fehlern"""
error_type: str
error_message: str
stack_trace: Optional[str] = None
screenshot_path: Optional[str] = None
recovery_attempted: bool = False
recovery_successful: bool = False
context: Dict[str, Any] = field(default_factory=dict)
@dataclass
class AccountCreationEvent:
"""Event für jede Account-Erstellung"""
event_id: str = field(default_factory=lambda: str(uuid.uuid4()))
timestamp: datetime = field(default_factory=datetime.now)
account_data: Optional[AccountData] = None
session_id: str = ""
fingerprint_id: str = ""
duration: Optional[timedelta] = None
success: bool = False
error_details: Optional[ErrorDetails] = None
steps_completed: List[WorkflowStep] = field(default_factory=list)
# Performance-Metriken
total_retry_count: int = 0
network_requests: int = 0
screenshots_taken: int = 0
# Kontext-Informationen
proxy_used: bool = False
proxy_type: Optional[str] = None
browser_type: str = "chromium"
headless: bool = False
def add_step(self, step: WorkflowStep):
"""Fügt einen Workflow-Schritt hinzu"""
self.steps_completed.append(step)
if step.retry_count > 0:
self.total_retry_count += step.retry_count
def get_step(self, step_name: str) -> Optional[WorkflowStep]:
"""Holt einen Schritt nach Name"""
for step in self.steps_completed:
if step.step_name == step_name:
return step
return None
def calculate_duration(self):
"""Berechnet die Gesamtdauer der Account-Erstellung"""
if self.steps_completed:
first_step = min(self.steps_completed, key=lambda s: s.start_time)
last_step = max(self.steps_completed, key=lambda s: s.end_time or s.start_time)
if last_step.end_time:
self.duration = last_step.end_time - first_step.start_time
def get_success_rate(self) -> float:
"""Berechnet die Erfolgsrate der Schritte"""
if not self.steps_completed:
return 0.0
successful_steps = sum(1 for step in self.steps_completed if step.success)
return successful_steps / len(self.steps_completed)
def to_dict(self) -> Dict[str, Any]:
"""Konvertiert Event zu Dictionary für Serialisierung"""
return {
'event_id': self.event_id,
'timestamp': self.timestamp.isoformat(),
'account_data': {
'platform': self.account_data.platform,
'username': self.account_data.username,
'email': self.account_data.email,
'phone': self.account_data.phone,
'full_name': self.account_data.full_name,
'birthday': self.account_data.birthday,
'verification_status': self.account_data.verification_status,
'metadata': self.account_data.metadata
} if self.account_data else None,
'session_id': self.session_id,
'fingerprint_id': self.fingerprint_id,
'duration_seconds': self.duration.total_seconds() if self.duration else None,
'success': self.success,
'error_details': {
'error_type': self.error_details.error_type,
'error_message': self.error_details.error_message,
'recovery_attempted': self.error_details.recovery_attempted,
'recovery_successful': self.error_details.recovery_successful,
'context': self.error_details.context
} if self.error_details else None,
'steps_completed': [step.to_dict() for step in self.steps_completed],
'total_retry_count': self.total_retry_count,
'network_requests': self.network_requests,
'screenshots_taken': self.screenshots_taken,
'proxy_used': self.proxy_used,
'proxy_type': self.proxy_type,
'browser_type': self.browser_type,
'headless': self.headless,
'success_rate': self.get_success_rate()
}