from datetime import datetime from typing import Optional, Annotated from bson import ObjectId from pydantic import BaseModel, BeforeValidator def validate_object_id(v) -> str: if isinstance(v, ObjectId): return str(v) if isinstance(v, str): return v raise ValueError("Invalid ObjectId") PyObjectId = Annotated[str, BeforeValidator(validate_object_id)] class Client(BaseModel): id: Optional[str] = None name: str slug: str is_active: bool = True created_at: Optional[datetime] = None updated_at: Optional[datetime] = None class ClientCreate(BaseModel): name: str slug: str class ClientUpdate(BaseModel): name: Optional[str] = None slug: Optional[str] = None is_active: Optional[bool] = None class Team(BaseModel): id: Optional[str] = None name: str client_id: str member_user_ids: list[str] = [] created_at: Optional[datetime] = None updated_at: Optional[datetime] = None class TeamCreate(BaseModel): name: str class TeamUpdate(BaseModel): name: Optional[str] = None class Project(BaseModel): id: Optional[str] = None name: str client_id: str is_active: bool = True created_at: Optional[datetime] = None updated_at: Optional[datetime] = None class ProjectCreate(BaseModel): name: str class ProjectUpdate(BaseModel): name: Optional[str] = None is_active: Optional[bool] = None