"""Pydantic request models, one block per concern. Kept in a single file because they're all small BaseModel definitions and importing them from one place makes the routers easy to scan. """ from typing import Optional from pydantic import BaseModel # ---------- Auth ---------- # class AuthRequest(BaseModel): action: str email: str password: str name: Optional[str] = None user_id: Optional[str] = None # ---------- XP ---------- # class XpRequest(BaseModel): action: str user_id: Optional[str] = None xp_amount: Optional[int] = None # ---------- Training (generic / red-team web) ---------- # class TrainingRequest(BaseModel): module: str path: str category: str moduleId: Optional[str] = None teamRole: Optional[str] = "red" challengeId: Optional[str] = None class EvaluateRequest(BaseModel): action: str = "evaluate" originalChallenge: dict userCode: str teamRole: Optional[str] = "red" # Web exploitation challenges have been removed from the platform. # The WebEvaluateRequest model that used to back /api/training/evaluate-web # is gone; the /api/training/evaluate endpoint + the per-type blue # evaluators now cover all remaining challenge types. # ---------- Terminal ---------- # class TerminalRequest(BaseModel): teamRole: Optional[str] = "red" challengeId: str command: str class TerminalWriteRequest(BaseModel): teamRole: Optional[str] = "red" challengeId: str filename: str content: str class TerminalListRequest(BaseModel): teamRole: Optional[str] = "red" challengeId: str # ---------- Certificates ---------- # class CertificateRequest(BaseModel): action: str = "list" user_id: str category: Optional[str] = None verify_code: Optional[str] = None details: Optional[dict] = None # ---------- Solved (consume one from the pool) ---------- # class SolvedRequest(BaseModel): scenarioId: str module: Optional[str] = None teamRole: Optional[str] = "red" difficulty: Optional[str] = "متوسط" path: Optional[str] = "cryptography" category: Optional[str] = "encryption" # ---------- Blue-team evaluators ---------- # class CodeFixEvaluateRequest(BaseModel): """Request model for code-fixing challenge evaluation.""" challengeId: str fixedCode: str teamRole: Optional[str] = "blue" userId: Optional[str] = None class LogAnalysisEvaluateRequest(BaseModel): """Request model for log-analysis challenge evaluation.""" challengeId: str attackType: str attackerIp: str timestamp: str ioc: str explanation: str = "" teamRole: Optional[str] = "blue" userId: Optional[str] = None class VulnHunterEvaluateRequest(BaseModel): """Request model for vulnerability-hunter challenge evaluation.""" challengeId: str vulnerabilityType: str teamRole: Optional[str] = "blue" userId: Optional[str] = None