diff --git a/app/api/health.py b/app/api/health.py new file mode 100644 index 0000000..51608ff --- /dev/null +++ b/app/api/health.py @@ -0,0 +1,16 @@ +import logging + +from fastapi import APIRouter, status, Request + +router = APIRouter() + + +@router.get("/redis", status_code=status.HTTP_200_OK) +async def redis_check(request: Request): + _redis = await request.app.state.redis + _info = None + try: + _info = await _redis.info() + except Exception as e: + logging.error(f"Redis error: {e}") + return _info diff --git a/app/main.py b/app/main.py index 7a9e766..7482c8a 100644 --- a/app/main.py +++ b/app/main.py @@ -1,24 +1,35 @@ -from fastapi import FastAPI +from contextlib import asynccontextmanager + +from fastapi import FastAPI, Depends from app.api.nonsense import router as nonsense_router from app.api.shakespeare import router as shakespeare_router from app.api.stuff import router as stuff_router from app.utils.logging import AppLogger +from app.api.user import router as user_router +from app.api.health import router as health_router +from app.redis import get_redis +from app.services.auth import AuthBearer logger = AppLogger.__call__().get_logger() -app = FastAPI(title="Stuff And Nonsense API", version="0.5") + +@asynccontextmanager +async def lifespan(app: FastAPI): + # Load the redis connection + app.state.redis = await get_redis() + yield + # close redis connection and release the resources + app.state.redis.close() + + +app = FastAPI(title="Stuff And Nonsense API", version="0.6", lifespan=lifespan) app.include_router(stuff_router) app.include_router(nonsense_router) app.include_router(shakespeare_router) +app.include_router(user_router) -@app.on_event("startup") -async def startup_event(): - logger.info("Starting up...") - - -@app.on_event("shutdown") -async def shutdown_event(): - logger.info("Shutting down...") +app.include_router(health_router, prefix="/v1/public/health", tags=["Health, Public"]) +app.include_router(health_router, prefix="/v1/health", tags=["Health, Bearer"], dependencies=[Depends(AuthBearer())]) diff --git a/app/redis.py b/app/redis.py new file mode 100644 index 0000000..a755713 --- /dev/null +++ b/app/redis.py @@ -0,0 +1,14 @@ +import redis.asyncio as redis + +from app import config + + +global_settings = config.get_settings() + + +async def get_redis(): + return await redis.from_url( + global_settings.redis_url.unicode_string(), + encoding="utf-8", + decode_responses=True, + ) diff --git a/app/services/auth.py b/app/services/auth.py index d71e40e..ee9bc79 100644 --- a/app/services/auth.py +++ b/app/services/auth.py @@ -38,7 +38,7 @@ async def create_access_token(user: User, request: Request): _payload = { "email": user.email, "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) diff --git a/pyproject.toml b/pyproject.toml index 620a442..d767ab7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "fastapi-sqlalchemy-asyncpg" -version = "0.0.5" +version = "0.0.6" description = "" authors = ["Jakub Miazek "] packages = []