from ..repositories.ai_model_repository import AiModelRepository from ..models import AiModel from typing import Optional, List import requests from django.conf import settings # ใช้สำหรับ Configs ภายนอก/Secrets class ConnectionError(Exception): """Custom Exception สำหรับการเชื่อมต่อล้มเหลว""" pass class AiModelService: def __init__(self, repository: AiModelRepository): self.repo = repository def get_all_models(self) -> List[AiModel]: return self.repo.get_all() def create_model(self, validated_data: dict) -> AiModel: # Business Logic: ตรวจสอบความซ้ำซ้อน, การตั้งค่าเริ่มต้น new_model = AiModel(**validated_data) return self.repo.save(new_model) def test_connection(self, pk: int) -> dict: """Logic สำหรับเรียก HTTP Ping ไปยัง AI Service ภายนอก""" model = self.repo.get_by_id(pk) if not model: raise ValueError("Model not found") # ใช้ Root URL ของ Service สำหรับ Ping test_url = model.base_url.rstrip('/') + '/' try: # ใช้ requests เพื่อเรียก HTTP (ใช้ httpx ถ้าต้องการ Async) response = requests.get(test_url, timeout=5) response.raise_for_status() # Raise error for 4xx or 5xx return { "status": "success", "message": f"Successfully pinged {test_url}", "response_status": response.status_code, "response_data": response.json() } except requests.exceptions.RequestException as e: # แปลง HTTP Error เป็น Custom Exception ของ Business Logic raise ConnectionError(f"Connection failed to {test_url}: {e}") def set_status(self, pk: int, new_status: str) -> Optional[AiModel]: # Business Logic: การเปลี่ยนสถานะต้องผ่าน Service model = self.repo.get_by_id(pk) if model: # Logic: มีเงื่อนไขว่าต้องผ่าน TESTING ก่อนไป ACTIVE if model.status == 'TESTING' and new_status == 'ACTIVE': # Logic: Trigger Hot Swap ใน FastAPI Service ก่อนเปลี่ยนสถานะ (ถ้าต้องการ) pass model.status = new_status return self.repo.save(model) return None