Skip to content

Commit 0f85f0c

Browse files
authored
Merge pull request #8 from ArielMAJ/release/0.3.0
Release/0.3.0
2 parents 4962be7 + 061696e commit 0f85f0c

37 files changed

Lines changed: 206 additions & 101 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/database/models/model_base.py

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__ import annotations
22

33
from datetime import datetime
4-
from typing import Any, List
4+
from typing import Any, List, Union
55

66
from fastapi_async_sqlalchemy import db
77
from sqlalchemy import DateTime, MetaData, select
@@ -30,6 +30,8 @@ class ModelBase(DeclarativeBase):
3030
async def new(cls, **kwargs) -> Self:
3131
obj: Self = cls(**kwargs)
3232
await obj.save()
33+
await db.session.flush()
34+
await db.session.refresh(obj)
3335
return obj
3436

3537
@classmethod
@@ -55,7 +57,7 @@ async def get(
5557
return result.scalars().first()
5658

5759
@classmethod
58-
async def get_by_id(cls, id: int) -> Self:
60+
async def get_by_id(cls, id: int) -> Union[Self, None]:
5961
return await cls.get(cls.id == id)
6062

6163
async def save(self) -> None:
@@ -66,15 +68,5 @@ async def update(self, **kwargs):
6668
setattr(self, attr, value)
6769
await self.save()
6870

69-
@classmethod
70-
async def update_by_id(cls, id: int, **kwargs):
71-
obj = await cls.get_by_id(id)
72-
await obj.update(**kwargs)
73-
7471
async def delete(self):
7572
await db.session.delete(self)
76-
77-
@classmethod
78-
async def delete_by_id(cls, id: int):
79-
obj = await cls.get_by_id(id)
80-
await obj.delete()

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"])
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,25 @@
11
from typing import List
22

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

87
router = APIRouter()
98

109

11-
@router.get("/", response_model=List[UserCreate])
12-
async def get_users() -> List[UserCreate]:
10+
@router.get("/", response_model=List[UserOut])
11+
async def get_users() -> List[UserOut]:
1312
"""
1413
Retrieve a list of all users.
1514
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

22-
@router.get("/{user_id}", response_model=UserCreate)
23-
async def get_user(user_id: int):
21+
@router.get("/{user_id}", response_model=UserOut)
22+
async def get_user(user_id: int) -> UserOut:
2423
"""
2524
Retrieve a user by ID.
2625
@@ -30,10 +29,10 @@ 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

36-
@router.post("/", response_model=UserCreate)
35+
@router.post("/", response_model=UserOut)
3736
async def create_user(user: UserCreate):
3837
"""
3938
Create a new user.
@@ -44,12 +43,11 @@ 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)
52-
async def update_user(user_id: int, user: UserCreate):
50+
async def update_user(user_id: int, user: UserCreate) -> None:
5351
"""
5452
Update a user by ID.
5553
@@ -60,16 +58,15 @@ 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

66-
@router.delete("/{user_id}")
67-
async def delete_user(user_id: int):
64+
@router.delete("/{user_id}", response_model=None)
65+
async def delete_user(user_id: int) -> None:
6866
"""
6967
Delete a user by ID.
7068
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)

0 commit comments

Comments
 (0)