128 lines
4.0 KiB
Python
128 lines
4.0 KiB
Python
"""
|
|
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")
|
|
|
|
|
|
class RegisterRequestDTO(BaseModel):
|
|
"""DTO para solicitud de registro"""
|
|
username: str = Field(..., min_length=3, max_length=50, description="Nombre de usuario")
|
|
email: EmailStr = Field(..., description="Email del usuario")
|
|
password: str = Field(..., min_length=8, description="Contraseña")
|
|
first_name: str = Field(..., min_length=2, max_length=50, description="Nombre")
|
|
last_name: str = Field(..., min_length=2, max_length=50, description="Apellido")
|
|
tenant_slug: str = Field(..., description="Slug del tenant")
|
|
|
|
class Config:
|
|
json_schema_extra = {
|
|
"example": {
|
|
"username": "jperez",
|
|
"email": "jperez@ejemplo.com",
|
|
"password": "MiPassword123!",
|
|
"first_name": "Juan",
|
|
"last_name": "Pérez",
|
|
"tenant_slug": "empresa-abc"
|
|
}
|
|
}
|
|
|
|
|
|
class RegisterResponseDTO(BaseModel):
|
|
"""DTO para respuesta de registro"""
|
|
user_id: str
|
|
username: str
|
|
email: str
|
|
message: str
|
|
|
|
class Config:
|
|
json_schema_extra = {
|
|
"example": {
|
|
"user_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
|
|
"username": "jperez",
|
|
"email": "jperez@ejemplo.com",
|
|
"message": "User registered successfully"
|
|
}
|
|
}
|
|
|
|
|
|
class ExchangeCodeRequestDTO(BaseModel):
|
|
"""DTO para intercambiar authorization code por tokens (OAuth2 flow)"""
|
|
code: str = Field(..., description="Authorization code de OAuth2")
|
|
redirect_uri: str = Field(..., description="Redirect URI usado en la autorización")
|
|
tenant_slug: Optional[str] = Field(None, description="Slug del tenant (opcional)")
|
|
|
|
class Config:
|
|
json_schema_extra = {
|
|
"example": {
|
|
"code": "eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2Ii...",
|
|
"redirect_uri": "http://localhost:5173/auth/callback",
|
|
"tenant_slug": "empresa-abc"
|
|
}
|
|
}
|