174 Zeilen
6.2 KiB
Python
174 Zeilen
6.2 KiB
Python
"""
|
|
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()
|
|
} |