"""Pydantic request/response schemas for the AmanPay API.""" from __future__ import annotations from typing import List, Optional from pydantic import BaseModel, Field class EnrollRequest(BaseModel): user_id: str = Field(..., description="Unique identifier for the user") face_image: str = Field(..., description="Base64-encoded face image") fingerprint_image: str = Field(..., description="Base64-encoded fingerprint image") class AuthRequest(BaseModel): user_id: str face_image: str fingerprint_image: str class VerifyRequest(BaseModel): face1: str fp1: str face2: str fp2: str class EnrollResponse(BaseModel): success: bool user_id: str face_liveness: float fp_liveness: float reason: Optional[str] = None class AuthResponse(BaseModel): success: bool similarity: float threshold: float face_liveness: float fp_liveness: float confidence: Optional[float] = None face_quality: Optional[float] = None fp_quality: Optional[float] = None protected: Optional[bool] = None deepfake_score: Optional[float] = None is_deepfake: Optional[bool] = None reason: Optional[str] = None class VerifyResponse(BaseModel): fused_similarity: float face_similarity: float fingerprint_similarity: float class PasskeyRegisterRequest(BaseModel): user_id: str public_key: str = Field(..., description="Base64 raw Ed25519 device public key") class ChallengeRequest(BaseModel): user_id: str class ChallengeResponse(BaseModel): user_id: str challenge: str = Field(..., description="Base64 single-use nonce to sign") class PasskeyAuthRequest(BaseModel): user_id: str challenge: str signature: str = Field(..., description="Base64 Ed25519 signature over the challenge") face_image: str fingerprint_image: str class PasskeyAuthResponse(BaseModel): success: bool biometric_success: bool similarity: float factors: Optional[List[str]] = None reason: Optional[str] = None class HealthResponse(BaseModel): status: str model_loaded: bool device: str class UserListResponse(BaseModel): users: List[str]