""" DTOs para módulo de autenticación """ from pydantic import BaseModel, EmailStr, Field from typing import Optional class LoginRequestDTO(BaseModel): """DTO para solicitud de login""" username: str = Field(..., description="Usuario o email") password: str = Field(..., min_length=6, description="Contraseña") tenant_slug: str = Field(..., description="Slug del tenant") class Config: json_schema_extra = { "example": { "username": "usuario@ejemplo.com", "password": "password123", "tenant_slug": "empresa-abc" } } class TokenResponseDTO(BaseModel): """DTO para respuesta de token""" access_token: str refresh_token: str token_type: str = "bearer" expires_in: int class Config: json_schema_extra = { "example": { "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...", "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...", "token_type": "bearer", "expires_in": 3600 } } class RefreshTokenRequestDTO(BaseModel): """DTO para solicitud de refresh token""" refresh_token: str = Field(..., description="Refresh token") class UserInfoResponseDTO(BaseModel): """DTO para información de usuario""" sub: str email: Optional[str] = None name: Optional[str] = None preferred_username: Optional[str] = None tenant_id: Optional[int] = None roles: list[str] = [] class Config: json_schema_extra = { "example": { "sub": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "email": "usuario@ejemplo.com", "name": "Juan Pérez", "preferred_username": "jperez", "tenant_id": 1, "roles": ["user", "admin"] } } class LogoutRequestDTO(BaseModel): """DTO para solicitud de logout""" refresh_token: str = Field(..., description="Refresh token para invalidar")