# api/enroll.py from fastapi import APIRouter, File, UploadFile, Form, HTTPException, Header from services.face_service import get_face_service import config import logging import numpy as np router = APIRouter() face_service = get_face_service() logger = logging.getLogger(__name__) @router.post("/enroll") async def enroll_face( x_api_key: str = Header(...), files: list[UploadFile] = File(...) ): if x_api_key != config.Config.API_KEY: raise HTTPException(status_code=401, detail="Invalid API key") try: if len(files) < 3: raise HTTPException(status_code=400, detail="Please provide at least 3 images") if len(files) > 10: raise HTTPException(status_code=400, detail="Maximum 10 images allowed") embeddings = [] for file in files: contents = await file.read() if len(contents) == 0: continue face_data, error = face_service.extract_face(contents) if face_data: embeddings.append(face_data['embedding']) if len(embeddings) == 0: return { "success": False, "message": "No valid faces detected", "embedding": None, "quality": 0 } avg_embedding = np.mean(embeddings, axis=0) avg_embedding = avg_embedding / np.linalg.norm(avg_embedding) return { "success": True, "message": f"Enrollment successful with {len(embeddings)} faces", "embedding": avg_embedding.tolist(), "quality": 0.95, "faces_processed": len(embeddings) } except HTTPException: raise except Exception as e: logger.error(f"Enrollment error: {e}") raise HTTPException(status_code=500, detail=f"Enrollment failed: {str(e)}")