from typing import List, Optional from pydantic import BaseModel from enum import Enum class MappingStrategy(str, Enum): SKIP = "SKIP" OVERWRITE = "OVERWRITE" class MappingRowStatus(str, Enum): NEW = "NEW" # User exists, no mapping exists -> Ready to insert UPDATE = "UPDATE" # User exists, mapping exists -> Ready to update (if overwrite) ERROR = "ERROR" # User does not exist, or format error class MappingRowPreview(BaseModel): row_index: int mobile: str mapped_key: str mapped_email: Optional[str] = None status: MappingRowStatus message: Optional[str] = None user_id: Optional[int] = None class MappingPreviewResponse(BaseModel): total_rows: int valid_count: int error_count: int new_count: int update_count: int preview_rows: List[MappingRowPreview] class MappingImportSummary(BaseModel): total_processed: int inserted: int updated: int failed: int class MappingCreate(BaseModel): mobile: str mapped_key: Optional[str] = None mapped_email: Optional[str] = None class MappingResponse(BaseModel): id: int app_id: int user_id: int mapped_key: Optional[str] = None mapped_email: Optional[str] = None user_mobile: str # Convenient to have is_active: bool = True class Config: from_attributes = True class MappingList(BaseModel): total: int items: List[MappingResponse]