Cybersecurity-Projects/PROJECTS/intermediate/api-security-scanner/backend/models/Scan.py

85 lines
1.8 KiB
Python

"""
ⒸAngelaMos | 2025
Scan model for storing security scan metadata
"""
from datetime import (
UTC,
datetime,
)
from sqlalchemy import (
Column,
DateTime,
ForeignKey,
Integer,
String,
)
from sqlalchemy.orm import relationship
from config import settings
from .Base import BaseModel
class Scan(BaseModel):
"""
Stores metadata about scans performed on target URLs
"""
__tablename__ = "scans"
user_id = Column(
Integer,
ForeignKey("users.id",
ondelete = "CASCADE"),
nullable = False,
index = True,
)
target_url = Column(
String(settings.URL_MAX_LENGTH),
nullable = False,
)
scan_date = Column(
DateTime(timezone = True),
default = lambda: datetime.now(UTC),
nullable = False,
)
user = relationship("User", backref = "scans")
test_results = relationship(
"TestResult",
back_populates = "scan",
cascade = "all, delete-orphan",
)
def __repr__(self) -> str:
"""
String representation of Scan
"""
return f"<Scan(id={self.id}, target_url={self.target_url}, user_id={self.user_id})>"
@property
def has_vulnerabilities(self) -> bool:
"""
Check if scan found any vulnerabilities
Returns:
bool: True if any test result is vulnerable
"""
return any(
result.status == "vulnerable"
for result in self.test_results
)
@property
def vulnerability_count(self) -> int:
"""
Count of vulnerabilities found in this scan
Returns:
int: Number of vulnerable test results
"""
return sum(
1 for result in self.test_results
if result.status == "vulnerable"
)