Coverage for src / auth / schemas / auth_schema.py: 100%
59 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-18 14:29 -0300
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-18 14:29 -0300
1"""Schemas pydantic do modulo auth."""
3from pydantic import BaseModel, Field, model_validator
5from src.auth.models import AuthMode, AuthProvider
7PROVIDER_ALIASES = {"keycloack": "keycloak"}
10def normalize_provider_name(provider_name: str) -> str:
11 """Normaliza nome de provedor, aceitando aliases comuns."""
12 return PROVIDER_ALIASES.get(provider_name, provider_name)
15class AuthProviderConfigSchema(BaseModel):
16 """Configuracao de um provedor de autenticacao."""
18 provider: AuthProvider
19 enabled: bool = False
20 mode: AuthMode
21 client_id: str | None = None
22 client_secret: str | None = None
23 authorization_url: str | None = None
24 token_url: str | None = None
25 redirect_uri: str | None = None
26 scopes: list[str] = Field(default_factory=list)
27 tenant: str | None = None
28 server_url: str | None = None
29 realm: str | None = None
30 ldap_uri: str | None = None
31 base_dn: str | None = None
32 bind_dn: str | None = None
33 bind_password: str | None = None
34 users: dict[str, str] = Field(default_factory=dict)
37class AuthProviderPublicConfigSchema(BaseModel):
38 """Configuracao publica de provedor (sem segredos)."""
40 provider: AuthProvider
41 enabled: bool
42 mode: AuthMode
43 client_id: str | None = None
44 authorization_url: str | None = None
45 token_url: str | None = None
46 redirect_uri: str | None = None
47 scopes: list[str] = Field(default_factory=list)
48 tenant: str | None = None
49 server_url: str | None = None
50 realm: str | None = None
51 ldap_uri: str | None = None
52 base_dn: str | None = None
53 bind_dn: str | None = None
54 local_usernames: list[str] = Field(default_factory=list)
57class AuthProvidersResponseSchema(BaseModel):
58 """Payload da listagem de provedores."""
60 providers: list[AuthProviderPublicConfigSchema]
63class AuthLoginRequestSchema(BaseModel):
64 """Payload para login com qualquer provedor."""
66 provider: AuthProvider
67 username: str | None = None
68 password: str | None = None
69 authorization_code: str | None = None
71 @model_validator(mode="before")
72 @classmethod
73 def normalize_aliases(cls, values):
74 """Aceita aliases de nomes de provedores no payload."""
75 if isinstance(values, dict) and "provider" in values:
76 provider = str(values["provider"])
77 values["provider"] = normalize_provider_name(provider)
78 return values
81class AuthLoginResponseSchema(BaseModel):
82 """Payload de sucesso de autenticacao."""
84 authenticated: bool
85 provider: AuthProvider
86 token_type: str = "bearer"
87 access_token: str
88 detail: str