from __future__ import annotations
from datetime import datetime
from typing import Any
from pydantic import BaseModel
class ApiResponse(BaseModel):
success: bool
timestamp: datetime
class ApiError(BaseModel):
success: bool = False
error: dict[str, Any]
timestamp: datetime
class Pagination(BaseModel):
page: int
limit: int
total: int
has_next: bool
has_prev: bool
class PaginatedResponse(ApiResponse):
pagination: Pagination
class LoginRequest(BaseModel):
username: str
password: str
remember_me: bool | None = False
class UserInfo(BaseModel):
id: str
username: str
email: str
roles: list[str]
mfa_enabled: bool
created_at: datetime
last_login: datetime | None = None
class LoginResponse(BaseModel):
access_token: str
refresh_token: str
token_type: str
expires_in: int
user: UserInfo
class RefreshTokenRequest(BaseModel):
refresh_token: str
class TokenResponse(BaseModel):
access_token: str
token_type: str
expires_in: int
class UserProfile(BaseModel):
id: str
user_id: str username: str
email: str
display_name: str | None = None
first_name: str | None = None
last_name: str | None = None
phone: str | None = None
timezone: str | None = None
locale: str | None = None
mfa_enabled: bool
created_at: datetime
updated_at: datetime
class UpdateProfileRequest(BaseModel):
first_name: str | None = None
last_name: str | None = None
phone: str | None = None
timezone: str | None = None
locale: str | None = None
class ChangePasswordRequest(BaseModel):
current_password: str
new_password: str
class CreateUserRequest(BaseModel):
username: str
email: str
password: str
roles: list[str] | None = None
first_name: str | None = None
last_name: str | None = None
class MFASetupResponse(BaseModel):
secret: str
qr_code: str
backup_codes: list[str]
setup_uri: str
class MFAVerifyRequest(BaseModel):
code: str
class MFAVerifyResponse(BaseModel):
verified: bool
backup_codes: list[str] | None = None
class DisableMFARequest(BaseModel):
password: str
code: str
class OAuthTokenRequest(BaseModel):
grant_type: str
code: str | None = None
redirect_uri: str | None = None
client_id: str | None = None
client_secret: str | None = None
refresh_token: str | None = None
scope: str | None = None
code_verifier: str | None = None
class OAuthTokenResponse(BaseModel):
access_token: str
token_type: str
expires_in: int
refresh_token: str | None = None
scope: str | None = None
class RevokeTokenRequest(BaseModel):
token: str
token_type_hint: str | None = None
client_id: str | None = None
client_secret: str | None = None
class IntrospectTokenRequest(BaseModel):
token: str
token_type_hint: str | None = None
client_id: str | None = None
client_secret: str | None = None
class TokenIntrospectionResponse(BaseModel):
active: bool
scope: str | None = None
client_id: str | None = None
username: str | None = None
token_type: str | None = None
exp: int | None = None
iat: int | None = None
sub: str | None = None
aud: str | None = None
iss: str | None = None
class HealthStatus(BaseModel):
status: str
version: str
timestamp: datetime
class ServiceHealth(BaseModel):
status: str
response_time: float
last_check: datetime
class DetailedHealthStatus(BaseModel):
status: str
services: dict[str, ServiceHealth]
uptime: int
version: str
timestamp: datetime
class SystemStats(BaseModel):
total_users: int
active_sessions: int
users: dict[str, int]
sessions: dict[str, int]
oauth: dict[str, int]
system: dict[str, int | float]
timestamp: datetime
class OAuthAuthorizeParams(BaseModel):
response_type: str
client_id: str
redirect_uri: str | None = None
scope: str | None = None
state: str | None = None
code_challenge: str | None = None
code_challenge_method: str | None = None
class RequestOptions(BaseModel):
timeout: float | None = None
retries: int | None = None
headers: dict[str, str] | None = None
class Config:
extra = "allow"
class ListOptions(BaseModel):
page: int | None = 1
limit: int | None = 20
search: str | None = None
sort: str | None = None
order: str | None = None
class UserListOptions(ListOptions):
role: str | None = None