""" â’¸AngelaMos | 2025 Scan model API validation and serialization """ from __future__ import annotations from pydantic import ( BaseModel, ConfigDict, Field, HttpUrl, ) from datetime import datetime from config import settings from core.enums import TestType from .test_result_schemas import TestResultResponse class ScanRequest(BaseModel): """ Schema for creating a new security scan """ target_url: HttpUrl = Field(max_length=settings.URL_MAX_LENGTH) auth_token: str | None = None tests_to_run: list[TestType] = Field(min_length=1) max_requests: int = Field( default=settings.DEFAULT_MAX_REQUESTS, ge=1, le=settings.SCANNER_MAX_CONCURRENT_REQUESTS, ) class ScanResponse(BaseModel): """ Schema for scan data in API responses """ model_config = ConfigDict(from_attributes=True) id: int user_id: int target_url: str scan_date: datetime created_at: datetime test_results: list[TestResultResponse] = [] @property def total_tests(self) -> int: """ Total number of tests run """ return len(self.test_results) @property def vulnerabilities_found(self) -> int: """ Number of vulnerabilities found """ return sum(1 for r in self.test_results if r.status == "vulnerable")