diff --git a/backend/app/schemas.py b/backend/app/schemas.py new file mode 100644 index 0000000..54e999c --- /dev/null +++ b/backend/app/schemas.py @@ -0,0 +1,206 @@ +from datetime import datetime +from typing import Optional +from pydantic import BaseModel, EmailStr + + +# --- Auth --- +class UserCreate(BaseModel): + username: str + email: EmailStr + password: str + + +class UserOut(BaseModel): + id: int + username: str + email: str + is_active: bool + + model_config = {"from_attributes": True} + + +class LoginRequest(BaseModel): + username: str + password: str + + +# --- 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} + + +# --- Masq --- +class MasqCreate(BaseModel): + source_network: str + out_interface: str + to_address: str = "" + comment: str = "" + + +class MasqUpdate(BaseModel): + source_network: Optional[str] = None + out_interface: Optional[str] = None + to_address: Optional[str] = None + comment: Optional[str] = None + + +class MasqOut(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 + masq: str