Files
Reviflow/backend/app/modules/auth/schemas.py
T

70 lines
1.8 KiB
Python

import uuid
from typing import Optional, List
from datetime import datetime
from fastapi_users import schemas
from pydantic import BaseModel, Field
from .models import UserRole
# Learner Profile Schemas
class LearnerProfileBase(BaseModel):
first_name: str = Field(..., min_length=1)
avatar_url: Optional[str] = None
class LearnerProfileCreate(LearnerProfileBase):
pass
class LearnerProfileUpdate(BaseModel):
first_name: Optional[str] = None
avatar_url: Optional[str] = None
class BadgeRead(BaseModel):
id: uuid.UUID
badge_code: str
earned_at: datetime
class Config:
from_attributes = True
class LearnerProfileRead(LearnerProfileBase):
id: uuid.UUID
user_id: uuid.UUID
streak_current: int = 0
streak_max: int = 0
xp: int = 0
level: int = 1
badges: List[BadgeRead] = []
class Config:
from_attributes = True
# User Schemas
class UserRead(schemas.BaseUser[uuid.UUID]):
first_name: Optional[str] = None
username: Optional[str] = None
role: UserRole
openrouter_api_key: Optional[str] = None
total_tokens_used: int = 0
total_cost_usd: float = 0.0
learner_profile: Optional[LearnerProfileRead] = None
parent_id: Optional[uuid.UUID] = None
parental_pin: Optional[str] = None
@property
def has_parental_pin(self) -> bool:
return self.parental_pin is not None
class UserCreate(schemas.BaseUserCreate):
first_name: Optional[str] = None
username: Optional[str] = None
role: UserRole = UserRole.PARENT
parent_id: Optional[uuid.UUID] = None
class UserUpdate(schemas.BaseUserUpdate):
first_name: Optional[str] = None
username: Optional[str] = None
openrouter_api_key: Optional[str] = None
role: Optional[UserRole] = None
parent_id: Optional[uuid.UUID] = None
parental_pin: Optional[str] = None