Add File
This commit is contained in:
60
backend/common/core/schemas.py
Normal file
60
backend/common/core/schemas.py
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
from fastapi import HTTPException, Request
|
||||||
|
from fastapi.security import OAuth2PasswordBearer
|
||||||
|
from pydantic import BaseModel
|
||||||
|
from sqlmodel import SQLModel
|
||||||
|
from starlette.status import HTTP_403_FORBIDDEN, HTTP_401_UNAUTHORIZED
|
||||||
|
from common.core.config import settings
|
||||||
|
from fastapi.security.utils import get_authorization_scheme_param
|
||||||
|
from typing import Generic, TypeVar, Optional
|
||||||
|
class TokenPayload(BaseModel):
|
||||||
|
account: str | None = None
|
||||||
|
id: int | None = None
|
||||||
|
oid: int | None = None
|
||||||
|
|
||||||
|
class Token(SQLModel):
|
||||||
|
access_token: str
|
||||||
|
token_type: str = "bearer"
|
||||||
|
|
||||||
|
class XOAuth2PasswordBearer(OAuth2PasswordBearer):
|
||||||
|
async def __call__(self, request: Request) -> Optional[str]:
|
||||||
|
authorization = request.headers.get(settings.TOKEN_KEY)
|
||||||
|
if request.headers.get(settings.ASSISTANT_TOKEN_KEY):
|
||||||
|
authorization = request.headers.get(settings.ASSISTANT_TOKEN_KEY)
|
||||||
|
scheme, param = get_authorization_scheme_param(authorization)
|
||||||
|
|
||||||
|
if not authorization or scheme.lower() not in ["bearer", "assistant"]:
|
||||||
|
if self.auto_error:
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=HTTP_401_UNAUTHORIZED,
|
||||||
|
detail="Not authenticated",
|
||||||
|
headers={"WWW-Authenticate": "Bearer"},
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
return param
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
T = TypeVar('T')
|
||||||
|
|
||||||
|
class PaginationParams(BaseModel):
|
||||||
|
page: int = 1
|
||||||
|
size: int = 20
|
||||||
|
order_by: Optional[str] = None
|
||||||
|
desc: bool = False
|
||||||
|
|
||||||
|
class PaginatedResponse(BaseModel, Generic[T]):
|
||||||
|
items: list[T]
|
||||||
|
total: int
|
||||||
|
page: int
|
||||||
|
size: int
|
||||||
|
total_pages: int
|
||||||
|
|
||||||
|
|
||||||
|
class BaseCreatorDTO(BaseModel):
|
||||||
|
id: int
|
||||||
|
class Config:
|
||||||
|
json_encoders = {
|
||||||
|
int: lambda v: str(v) if isinstance(v, int) and v > (2**53 - 1) else v
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user