Skip to content

Commit d10f39d

Browse files
committed
feat(#5): add example user service;
refactor entrypoints and schemas fix tests and use anyio/asyncio for running async tests
1 parent 71cec2a commit d10f39d

30 files changed

Lines changed: 149 additions & 74 deletions

.vscode/settings.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"python.testing.pytestArgs": ["tests"],
3+
"python.testing.unittestEnabled": false,
4+
"python.testing.pytestEnabled": true
5+
}

api/app.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,27 @@
1+
from contextlib import asynccontextmanager
12
from pathlib import Path
23

34
from api.config import Config
4-
from api.entrypoints.router import api_router
5+
from api.entrypoints import router
56
from fastapi import FastAPI
67
from fastapi.middleware.cors import CORSMiddleware
78
from fastapi_async_sqlalchemy import SQLAlchemyMiddleware
89

910
# from fastapi.responses import JSONResponse
1011
from fastapi_cache import FastAPICache
1112
from fastapi_cache.backends.inmemory import InMemoryBackend
13+
from loguru import logger
1214

1315
APP_ROOT = Path(__file__).parent
1416

1517

18+
@asynccontextmanager
19+
async def lifespan(app: FastAPI):
20+
logger.info("starting up")
21+
yield
22+
logger.info("shutting down")
23+
24+
1625
def get_app() -> FastAPI:
1726
"""
1827
Get FastAPI application.
@@ -23,6 +32,8 @@ def get_app() -> FastAPI:
2332
"""
2433
_app = FastAPI(
2534
title="fastapi-backend-template",
35+
description="FastAPI backend template.",
36+
lifespan=lifespan,
2637
# default_response_class=JSONResponse,
2738
)
2839

@@ -39,7 +50,7 @@ def get_app() -> FastAPI:
3950
engine_args=Config.DATABASE.ENGINE_ARGS,
4051
commit_on_exit=True,
4152
)
42-
_app.include_router(router=api_router)
53+
_app.include_router(router=router)
4354

4455
FastAPICache.init(InMemoryBackend(), prefix="fastapi-cache")
4556
return _app

api/entrypoints/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from api.entrypoints.router import router
2+
3+
__all__ = ["router"]

api/entrypoints/monitoring/__init__.py

Lines changed: 0 additions & 4 deletions
This file was deleted.
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from api.entrypoints.v1.random_number.schema import RandomResponse
2-
from api.services.random_number_service import RandomNumberService
1+
from api.schemas.random_number import RandomResponse
2+
from api.services.random_number_service import RandomResponseService
33
from fastapi import APIRouter
44
from fastapi_cache.decorator import cache
55

@@ -14,4 +14,4 @@ async def random_number():
1414
1515
:returns: random number to user.
1616
"""
17-
return await RandomNumberService.get_random_number()
17+
return await RandomResponseService.get_random_number()
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from api.entrypoints.v1.root_response.schema import RootResponse
1+
from api.schemas.root_response import RootResponse
22
from api.services.root_response_service import RootResponseService
33
from fastapi import APIRouter
44
from fastapi_cache.decorator import cache

api/entrypoints/router.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1-
from api.entrypoints import monitoring, v1
1+
from api.entrypoints import monitoring, random_response, root_response, user
22
from fastapi.routing import APIRouter
33

4-
api_router = APIRouter()
5-
api_router.include_router(monitoring.router)
6-
api_router.include_router(v1.router, prefix="/v1", tags=["v1"])
4+
router = APIRouter()
5+
router.include_router(monitoring.router, tags=["Monitoring"])
6+
router.include_router(
7+
random_response.router, prefix="/random_number", tags=["Random Number"]
8+
)
9+
router.include_router(root_response.router, prefix="", tags=["Root Response"])
10+
router.include_router(user.router, prefix="/user", tags=["User"])
Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
from typing import List
22

3-
from api.database.models.users import User
43
from api.schemas.user import UserCreate
4+
from api.services.user_service import UserService
55
from fastapi import APIRouter
6-
from loguru import logger
76

87
router = APIRouter()
98

@@ -16,7 +15,7 @@ async def get_users() -> List[UserCreate]:
1615
Returns:
1716
List[User]: A list of User objects.
1817
"""
19-
return await User.get_all()
18+
return await UserService.get_all()
2019

2120

2221
@router.get("/{user_id}", response_model=UserCreate)
@@ -30,7 +29,7 @@ async def get_user(user_id: int):
3029
Returns:
3130
User: The User object.
3231
"""
33-
return await User.get_by_id(user_id)
32+
return await UserService.get_user(user_id)
3433

3534

3635
@router.post("/", response_model=UserCreate)
@@ -44,8 +43,7 @@ async def create_user(user: UserCreate):
4443
Returns:
4544
User: The created User object.
4645
"""
47-
logger.info(user.model_dump())
48-
return await User.new(**user.model_dump())
46+
return await UserService.create_user(user)
4947

5048

5149
@router.put("/{user_id}", response_model=None)
@@ -60,7 +58,7 @@ async def update_user(user_id: int, user: UserCreate):
6058
Returns:
6159
User: The updated User object.
6260
"""
63-
return await User.update_by_id(user_id, **user.model_dump())
61+
return await UserService.update_user(user_id, user)
6462

6563

6664
@router.delete("/{user_id}")
@@ -71,5 +69,4 @@ async def delete_user(user_id: int):
7169
Args:
7270
user_id (int): The ID of the user.
7371
"""
74-
await User.delete_by_id(user_id)
75-
return {"message": "User deleted successfully"}
72+
return await UserService.delete_user(user_id)

api/entrypoints/v1/__init__.py

Lines changed: 0 additions & 4 deletions
This file was deleted.

0 commit comments

Comments
 (0)