Merge pull request #122 from grillazz/2-add-model-relations-in-async-environment

refactor
This commit is contained in:
Jakub Miazek 2023-11-09 21:51:24 +01:00 committed by GitHub
commit 62c001246a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 23 additions and 12 deletions

View File

@ -7,7 +7,7 @@ from app.models.stuff import Stuff
from app.schemas.stuff import StuffResponse, StuffSchema from app.schemas.stuff import StuffResponse, StuffSchema
from app.utils.logging import AppLogger from app.utils.logging import AppLogger
logger = AppLogger.__call__().get_logger() logger = AppLogger().get_logger()
router = APIRouter(prefix="/v1/stuff") router = APIRouter(prefix="/v1/stuff")

View File

@ -6,7 +6,7 @@ from sqlalchemy.ext.asyncio import async_sessionmaker
from app.config import settings as global_settings from app.config import settings as global_settings
from app.utils.logging import AppLogger from app.utils.logging import AppLogger
logger = AppLogger.__call__().get_logger() logger = AppLogger().get_logger()
engine = create_async_engine( engine = create_async_engine(
global_settings.asyncpg_url.unicode_string(), global_settings.asyncpg_url.unicode_string(),

View File

@ -11,14 +11,16 @@ from app.api.health import router as health_router
from app.redis import get_redis from app.redis import get_redis
from app.services.auth import AuthBearer from app.services.auth import AuthBearer
logger = AppLogger.__call__().get_logger() logger = AppLogger().get_logger()
@asynccontextmanager @asynccontextmanager
async def lifespan(app: FastAPI): async def lifespan(app: FastAPI):
# Load the redis connection # Load the redis connection
app.state.redis = await get_redis() app.state.redis = await get_redis()
try:
yield yield
finally:
# close redis connection and release the resources # close redis connection and release the resources
app.state.redis.close() app.state.redis.close()

View File

@ -8,9 +8,17 @@ from fastapi import Request, HTTPException
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
async def get_from_redis(request: Request, key: str):
return await request.app.state.redis.get(key)
async def set_to_redis(request: Request, key: str, value: str, ex: int):
return await request.app.state.redis.set(key, value, ex=ex)
async def verify_jwt(request: Request, token: str) -> bool: async def verify_jwt(request: Request, token: str) -> bool:
_payload = await request.app.state.redis.get(token) payload = await get_from_redis(request, token)
return bool(_payload) return bool(payload)
class AuthBearer(HTTPBearer): class AuthBearer(HTTPBearer):
@ -29,13 +37,14 @@ class AuthBearer(HTTPBearer):
async def create_access_token(user: User, request: Request): async def create_access_token(user: User, request: Request):
_payload = { # sourcery skip: avoid-builtin-shadow
payload = {
"email": user.email, "email": user.email,
"expiry": time.time() + global_settings.jwt_expire, "expiry": time.time() + global_settings.jwt_expire,
"platform": request.headers.get("User-Agent"), "platform": request.headers.get("User-Agent"),
} }
_token = jwt.encode(_payload, str(user.password), algorithm=global_settings.jwt_algorithm) token = jwt.encode(payload, str(user.password), algorithm=global_settings.jwt_algorithm)
_bool = await request.app.state.redis.set(_token, str(_payload), ex=global_settings.jwt_expire) _bool = await set_to_redis(request, token, str(payload), ex=global_settings.jwt_expire)
if _bool: if _bool:
return _token return token