Initial commit: WealthWise financial analytics platform
This commit is contained in:
92
backend/app/schemas/user.py
Normal file
92
backend/app/schemas/user.py
Normal file
@@ -0,0 +1,92 @@
|
||||
"""User schemas for request and response validation.
|
||||
|
||||
This module defines Pydantic schemas for user-related operations including
|
||||
registration, authentication, and user information retrieval.
|
||||
"""
|
||||
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
from uuid import UUID
|
||||
|
||||
from pydantic import BaseModel, EmailStr, Field
|
||||
|
||||
|
||||
class UserBase(BaseModel):
|
||||
"""Base user schema with common attributes."""
|
||||
|
||||
email: EmailStr = Field(description="User's email address")
|
||||
is_active: bool = Field(default=True, description="Whether account is active")
|
||||
is_superuser: bool = Field(default=False, description="Whether user is admin")
|
||||
|
||||
|
||||
class UserCreate(BaseModel):
|
||||
"""Schema for user registration.
|
||||
|
||||
Attributes:
|
||||
email: User's email address (must be unique)
|
||||
password: Plain text password (will be hashed)
|
||||
"""
|
||||
|
||||
email: EmailStr = Field(description="User's email address")
|
||||
password: str = Field(
|
||||
min_length=8,
|
||||
description="User's password (minimum 8 characters)",
|
||||
)
|
||||
|
||||
|
||||
class UserUpdate(BaseModel):
|
||||
"""Schema for user updates.
|
||||
|
||||
All fields are optional to allow partial updates.
|
||||
"""
|
||||
|
||||
email: Optional[EmailStr] = Field(default=None, description="New email address")
|
||||
password: Optional[str] = Field(
|
||||
default=None,
|
||||
min_length=8,
|
||||
description="New password (minimum 8 characters)",
|
||||
)
|
||||
is_active: Optional[bool] = Field(default=None, description="Account status")
|
||||
|
||||
|
||||
class UserInDB(UserBase):
|
||||
"""Schema representing user as stored in database.
|
||||
|
||||
Includes the hashed password - should never be returned in API responses.
|
||||
"""
|
||||
|
||||
id: UUID
|
||||
hashed_password: str = Field(description="Bcrypt hashed password")
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class UserPublic(UserBase):
|
||||
"""Schema for user information returned in API responses.
|
||||
|
||||
Excludes sensitive fields like hashed_password.
|
||||
"""
|
||||
|
||||
id: UUID
|
||||
created_at: datetime
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class Token(BaseModel):
|
||||
"""Schema for authentication token response."""
|
||||
|
||||
access_token: str = Field(description="JWT access token")
|
||||
token_type: str = Field(default="bearer", description="Token type")
|
||||
|
||||
|
||||
class TokenPayload(BaseModel):
|
||||
"""Schema for JWT token payload."""
|
||||
|
||||
sub: Optional[str] = Field(default=None, description="Subject (user ID)")
|
||||
exp: Optional[datetime] = Field(default=None, description="Expiration time")
|
||||
type: Optional[str] = Field(default=None, description="Token type")
|
||||
Reference in New Issue
Block a user