"""Endpoint-related Pydantic schemas.""" from datetime import datetime from pydantic import BaseModel, Field, field_validator import ipaddress from ..models.endpoint import Protocol class EndpointBase(BaseModel): """Base endpoint schema.""" name: str = Field(..., min_length=2, max_length=255) description: str | None = None internal_ip: str = Field(..., description="IP address in customer network") port: int = Field(..., ge=1, le=65535) protocol: Protocol = Protocol.TCP application_name: str | None = None @field_validator('internal_ip') @classmethod def validate_ip(cls, v: str) -> str: try: ipaddress.ip_address(v) return v except ValueError as e: raise ValueError(f"Invalid IP address: {e}") class EndpointCreate(EndpointBase): """Schema for creating an endpoint.""" application_template_id: int | None = None class EndpointUpdate(BaseModel): """Schema for updating an endpoint.""" name: str | None = Field(None, min_length=2, max_length=255) description: str | None = None internal_ip: str | None = None port: int | None = Field(None, ge=1, le=65535) protocol: Protocol | None = None application_name: str | None = None @field_validator('internal_ip') @classmethod def validate_ip(cls, v: str | None) -> str | None: if v is None: return v try: ipaddress.ip_address(v) return v except ValueError as e: raise ValueError(f"Invalid IP address: {e}") class EndpointResponse(EndpointBase): """Schema for endpoint response.""" id: int gateway_id: int application_template_id: int | None created_at: datetime updated_at: datetime | None class Config: from_attributes = True class ApplicationTemplateResponse(BaseModel): """Schema for application template response.""" id: int name: str description: str | None default_port: int protocol: Protocol icon: str | None class Config: from_attributes = True