from datetime import datetime from typing import Optional from pydantic import BaseModel # --- Auth --- class UserOut(BaseModel): id: int username: str email: str is_active: bool model_config = {"from_attributes": True} # --- Config --- class ConfigCreate(BaseModel): name: str description: str = "" is_active: bool = True class ConfigUpdate(BaseModel): name: Optional[str] = None description: Optional[str] = None is_active: Optional[bool] = None class ConfigOut(BaseModel): id: int name: str description: str is_active: bool created_at: datetime updated_at: datetime owner_id: int model_config = {"from_attributes": True} # --- Zone --- class ZoneCreate(BaseModel): name: str type: str options: str = "" class ZoneUpdate(BaseModel): name: Optional[str] = None type: Optional[str] = None options: Optional[str] = None class ZoneOut(BaseModel): id: int config_id: int name: str type: str options: str model_config = {"from_attributes": True} # --- Interface --- class InterfaceCreate(BaseModel): name: str zone_id: int options: str = "" class InterfaceUpdate(BaseModel): name: Optional[str] = None zone_id: Optional[int] = None options: Optional[str] = None class InterfaceOut(BaseModel): id: int config_id: int name: str zone_id: int options: str model_config = {"from_attributes": True} # --- Policy --- class PolicyCreate(BaseModel): src_zone_id: int dst_zone_id: int policy: str log_level: str = "" comment: str = "" position: int = 0 class PolicyUpdate(BaseModel): src_zone_id: Optional[int] = None dst_zone_id: Optional[int] = None policy: Optional[str] = None log_level: Optional[str] = None comment: Optional[str] = None position: Optional[int] = None class PolicyOut(BaseModel): id: int config_id: int src_zone_id: int dst_zone_id: int policy: str log_level: str comment: str position: int model_config = {"from_attributes": True} # --- Rule --- class RuleCreate(BaseModel): action: str src_zone_id: Optional[int] = None dst_zone_id: Optional[int] = None src_ip: str = "" dst_ip: str = "" proto: str = "" dport: str = "" sport: str = "" comment: str = "" position: int = 0 class RuleUpdate(BaseModel): action: Optional[str] = None src_zone_id: Optional[int] = None dst_zone_id: Optional[int] = None src_ip: Optional[str] = None dst_ip: Optional[str] = None proto: Optional[str] = None dport: Optional[str] = None sport: Optional[str] = None comment: Optional[str] = None position: Optional[int] = None class RuleOut(BaseModel): id: int config_id: int action: str src_zone_id: Optional[int] dst_zone_id: Optional[int] src_ip: str dst_ip: str proto: str dport: str sport: str comment: str position: int model_config = {"from_attributes": True} # --- Snat --- class SnatCreate(BaseModel): source_network: str out_interface: str to_address: str = "" comment: str = "" class SnatUpdate(BaseModel): source_network: Optional[str] = None out_interface: Optional[str] = None to_address: Optional[str] = None comment: Optional[str] = None class SnatOut(BaseModel): id: int config_id: int source_network: str out_interface: str to_address: str comment: str model_config = {"from_attributes": True} # --- Generate --- class GenerateOut(BaseModel): zones: str interfaces: str policy: str rules: str snat: str