from pydantic import BaseModel, Field from typing import Optional, Dict, Any, List from datetime import datetime class ArtifactCreate(BaseModel): test_name: Optional[str] = None test_suite: Optional[str] = None test_config: Optional[Dict[str, Any]] = None test_result: Optional[str] = None sim_source_id: Optional[str] = None # Groups artifacts from same SIM source custom_metadata: Optional[Dict[str, Any]] = None description: Optional[str] = None tags: Optional[List[str]] = None version: Optional[str] = None parent_id: Optional[int] = None class ArtifactResponse(BaseModel): id: int filename: str file_type: str file_size: int storage_path: str content_type: Optional[str] = None test_name: Optional[str] = None test_suite: Optional[str] = None test_config: Optional[Dict[str, Any]] = None test_result: Optional[str] = None sim_source_id: Optional[str] = None custom_metadata: Optional[Dict[str, Any]] = None description: Optional[str] = None tags: Optional[List[str]] = None created_at: datetime updated_at: datetime version: Optional[str] = None parent_id: Optional[int] = None class Config: from_attributes = True class ArtifactQuery(BaseModel): filename: Optional[str] = None file_type: Optional[str] = None test_name: Optional[str] = None test_suite: Optional[str] = None test_result: Optional[str] = None sim_source_id: Optional[str] = None tags: Optional[List[str]] = None start_date: Optional[datetime] = None end_date: Optional[datetime] = None limit: int = Field(default=100, le=1000) offset: int = Field(default=0, ge=0)