class CheckEmails(BaseModel): emails: list[EmailStr] def _serialize(s: SuppressionEntry) -> dict: return { "id": s.id, "email": s.email, "reason": s.reason, "source": s.source, "campaign_id": s.campaign_id, "created_at": s.created_at.isoformat() if s.created_at else None, } @router.get("/list") async def list_suppression(search: str = Query(""), reason: str = Query(""), === phones out === 41: return { 76: return {"phones": [_serialize(p) for p in rows], 160: return {"added": added, "duplicates": duplicates, 189: return {"deleted": pid} 203: return {"deleted": len(rows)} PHONE_RE = re.compile(r"^\+?[0-9][0-9 ()\-.]{4,30}$") class PhoneIn(BaseModel): phone: str label: str = "" @field_validator("phone") @classmethod def valid_phone(cls, v): v = v.strip() if not PHONE_RE.match(v): raise ValueError("Invalid phone number format") return v class PhonePatch(BaseModel): label: Optional[str] = None is_active: Optional[bool] = None def _serialize(p: CompanyPhoneNumber) -> dict: