Commit 486ae3a9 authored by Kostas Chartsias's avatar Kostas Chartsias
Browse files

migration to Pydantic v2 and ensure phoneNumber is in E.164 format

parent 99916ed7
Loading
Loading
Loading
Loading
+24 −7
Original line number Diff line number Diff line
from ipaddress import IPv6Address

from pydantic import BaseModel, model_validator
from pydantic import BaseModel, Field, field_validator, model_validator
from typing import Optional, Dict, Any
import re


class IPv4Address(BaseModel):
    publicAddress: str
    publicPort: int

E164_REGEX = re.compile(r'^\+[1-9]\d{1,14}$')

class DeviceInput(BaseModel):
    phoneNumber: Optional[str] = None
    networkAccessIdentifier: Optional[str] = None
    ipv4Address: Optional[IPv4Address] = None
    ipv6Address: Optional[IPv6Address] = None
    duration: Optional[int] = Field(None, ge=60, le=86400, description="Duration in seconds (60-86400)")

    @field_validator("phoneNumber")
    @classmethod
    def validate_phone_number(cls, v):
        if v is not None and not E164_REGEX.match(v):
            raise ValueError("phoneNumber must conform to E.164 format (e.g., +1234567890)")
        return v

    @model_validator(mode='before')
    @model_validator(mode="before")
    @classmethod
    def check_one_identifier(cls, values):
        if isinstance(values, dict):
            if not (values.get("phoneNumber") or values.get("networkAccessIdentifier") or values.get("ipv4Address")) or values.get("ipv6Address"):
        if not (
            values.get("phoneNumber")
            or values.get("networkAccessIdentifier")
            or values.get("ipv4Address")
            or values.get("ipv6Address")
        ):
            raise ValueError(
                    "Device must include at least one of: phoneNumber, networkAccessIdentifier, or ipv4Address or ipv6Address"
                "Device must include at least one of: phoneNumber, networkAccessIdentifier, ipv4Address, or ipv6Address"
            )
        return values