63 lines
1.4 KiB
Python
63 lines
1.4 KiB
Python
"""
|
|
Ⓒ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"
|
|
)
|