# app/modules/tenancy/schemas/user_account.py """ Self-service account schemas for logged-in users. Used by admin, store, and merchant frontends to let users manage their own identity (name, email, password). """ from datetime import datetime from pydantic import BaseModel, EmailStr, Field, field_validator class UserAccountResponse(BaseModel): """Self-service account info returned to the logged-in user.""" id: int email: str username: str first_name: str | None = None last_name: str | None = None role: str preferred_language: str | None = None is_email_verified: bool = False last_login: datetime | None = None created_at: datetime | None = None updated_at: datetime | None = None model_config = {"from_attributes": True} class UserAccountUpdate(BaseModel): """Fields the user can edit about themselves.""" first_name: str | None = Field(None, max_length=100) last_name: str | None = Field(None, max_length=100) email: EmailStr | None = None preferred_language: str | None = Field(None, pattern=r"^(en|fr|de|lb)$") class UserPasswordChange(BaseModel): """Password change with current-password verification.""" current_password: str = Field(..., description="Current password") new_password: str = Field( ..., min_length=8, description="New password (minimum 8 characters)" ) confirm_password: str = Field(..., description="Confirm new password") @field_validator("new_password") @classmethod def password_strength(cls, v: str) -> str: """Validate password strength.""" if not any(char.isdigit() for char in v): raise ValueError("Password must contain at least one digit") if not any(char.isalpha() for char in v): raise ValueError("Password must contain at least one letter") return v class PasswordChangeResponse(BaseModel): """Response for a successful password change.""" message: str