openvpn-endpoint-server/server/app/schemas/endpoint.py

77 lines
2.1 KiB
Python

"""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