| """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] | |