from datetime import datetime from typing import Optional, Dict, Any from pydantic import BaseModel, Field, ConfigDict class ServiceCreate(BaseModel): """Schema for creating a new service""" name: str = Field(..., min_length=1, max_length=100) description: Optional[str] = Field(default=None, max_length=500) service_type: str = Field(default="backend") url: str = Field(..., min_length=1) health_endpoint: Optional[str] = Field(default="/health") metadata: Dict[str, Any] = Field(default_factory=dict) model_config = ConfigDict( json_schema_extra={ "example": { "name": "News API", "description": "News generation and management API", "service_type": "backend", "url": "http://news-api:8050", "health_endpoint": "/health", "metadata": { "version": "1.0.0", "port": 8050 } } } ) class ServiceUpdate(BaseModel): """Schema for updating a service""" name: Optional[str] = Field(default=None, min_length=1, max_length=100) description: Optional[str] = Field(default=None, max_length=500) service_type: Optional[str] = None url: Optional[str] = Field(default=None, min_length=1) health_endpoint: Optional[str] = None metadata: Optional[Dict[str, Any]] = None model_config = ConfigDict( json_schema_extra={ "example": { "description": "Updated description", "metadata": { "version": "1.1.0" } } } ) class ServiceResponse(BaseModel): """Schema for service response""" id: str = Field(alias="_id") name: str description: Optional[str] = None service_type: str url: str health_endpoint: Optional[str] = None status: str last_health_check: Optional[datetime] = None response_time_ms: Optional[float] = None created_at: datetime updated_at: datetime metadata: Dict[str, Any] = Field(default_factory=dict) model_config = ConfigDict( populate_by_name=True, from_attributes=True ) class ServiceHealthCheck(BaseModel): """Schema for health check result""" service_id: str service_name: str status: str response_time_ms: Optional[float] = None checked_at: datetime error_message: Optional[str] = None model_config = ConfigDict( json_schema_extra={ "example": { "service_id": "507f1f77bcf86cd799439011", "service_name": "News API", "status": "healthy", "response_time_ms": 45.2, "checked_at": "2025-10-28T10:00:00Z" } } )