"""Pydantic request/response models for the CAD review API.""" from __future__ import annotations from pydantic import BaseModel, Field # --- Request models --- class DistanceRequest(BaseModel): """Request to measure distance between two parts.""" part_a_id: str part_b_id: str # --- Response models --- class UploadResponse(BaseModel): job_id: str status: str exterior_filename: str interior_filename: str class SampleFileResponse(BaseModel): filename: str size: int class SamplePairResponse(BaseModel): id: str name: str exterior: SampleFileResponse interior: SampleFileResponse class StepProgress(BaseModel): step: str status: str # pending, running, completed progress_pct: int = 0 class JobStatus(BaseModel): job_id: str status: str # pending, running, completed, failed steps: list[StepProgress] = [] error: str | None = None # Rebuild to resolve forward reference JobStatus.model_rebuild() class AssemblyNodeResponse(BaseModel): id: str name: str is_assembly: bool is_leaf: bool classification: str = "unknown" num_faces: int = 0 num_solids: int = 0 bounding_box: dict | None = None children: list[AssemblyNodeResponse] = [] AssemblyNodeResponse.model_rebuild() class GroupInfoResponse(BaseModel): name: str # "exterior" or "interior" part_count: int part_ids: list[str] part_names: list[str] class AssemblyTreeResponse(BaseModel): root: AssemblyNodeResponse groups: list[GroupInfoResponse] = [] class ProximityPairResponse(BaseModel): part_a_id: str part_a_name: str part_b_id: str part_b_name: str min_distance_mm: float point_a: list[float] point_b: list[float] status: str # collision, near, ok class ProximityResponse(BaseModel): pairs: list[ProximityPairResponse] collision_count: int near_count: int class DistanceMeasurementResponse(BaseModel): distance_mm: float point_a: list[float] point_b: list[float] class ComplianceResultResponse(BaseModel): rule_id: str rule_name: str passed: bool severity: str measured_value: float | None = None threshold_value: float | None = None unit: str = "mm" message: str = "" affected_parts: list[str] = [] class ComplianceRuleResponse(BaseModel): id: str name: str description: str type: str severity: str class ComplianceResponse(BaseModel): results: list[ComplianceResultResponse] pass_count: int fail_count: int class SSEEvent(BaseModel): step: str status: str progress_pct: int = 0 overall_status: str | None = None error: str | None = None