Skip to content

Commit c2c635a

Browse files
committed
added dto validation
1 parent f1da544 commit c2c635a

File tree

4 files changed

+24
-27
lines changed

4 files changed

+24
-27
lines changed

fastapi_project/api/v1/user.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ async def create_order(request: Request):
1616
request_data = await the_query(request)
1717
data = UserCreateSchema(**request_data)
1818

19-
output = user_service.s_create_user(data)
19+
# validated_data = request.state.validated_data
20+
# output = user_service.s_create_user(request, validated_data)
21+
22+
output = user_service.s_create_user(request, data)
2023
return JSONResponse(content=output, status_code=status.HTTP_200_OK)
2124

2225
@router.get("/users")

fastapi_project/services/user_service.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from fastapi import HTTPException
1+
from fastapi import HTTPException, Request
22
from fastapi_project.database.database import SessionLocal
33
from fastapi_project.utils.base import the_sorting, paginate
44
from fastapi_project.models.users import User
@@ -9,7 +9,8 @@ class UserService:
99
def __init__(self):
1010
self.db = SessionLocal()
1111

12-
def s_create_user(self, user: UserCreateSchema):
12+
def s_create_user(self, request: Request, user: UserCreateSchema):
13+
1314
db_user = self.db.query(User).filter(User.email == user.email).first()
1415
if db_user:
1516
raise HTTPException(status_code=400, detail="Email already registered")
@@ -19,7 +20,7 @@ def s_create_user(self, user: UserCreateSchema):
1920
self.db.refresh(new_user)
2021
return new_user
2122

22-
def s_get_users(self, request):
23+
def s_get_users(self, request: Request):
2324
users = self.db.query(User)
2425
users = the_sorting(request, users)
2526
return paginate(request, users, serilizer=UserSerializer, wrap='users')

fastapi_project/utils/base.py

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
from fastapi import Request, HTTPException
1+
from fastapi import Request
22
from typing import Any, Dict, Optional, Union
33
from pydantic import BaseModel, ValidationError
44
from sqlalchemy import desc
55
from urllib.parse import urlparse
6-
from fastapi.responses import JSONResponse
7-
from fastapi import FastAPI
86

97
async def the_query(request: Request, name = None) -> Dict[str, str]:
108
data = {}
@@ -23,22 +21,17 @@ async def the_query(request: Request, name = None) -> Dict[str, str]:
2321

2422

2523
async def validate_data(data: Dict[str, Any], model: BaseModel) -> Dict[str, Union[str, Dict[str, Any]]]:
24+
output = {'status': 'valid'}
25+
2626
try:
2727
instance = model(**data)
28-
return {'success': True, 'data': instance.dict()}
28+
output['data'] = instance.dict()
2929
except ValidationError as e:
30-
errors = {}
31-
for error in e.errors():
32-
field = error['loc'][0]
33-
message = field + " " + error['msg']
34-
if field not in errors:
35-
errors[field] = []
36-
errors[field].append(message)
37-
38-
return {
39-
'success': False,
40-
'errors': errors["details"]
41-
}
30+
# If validation fails, return status as invalid and the validation errors
31+
output['status'] = 'invalid'
32+
output['errors'] = e.errors()
33+
34+
return output
4235

4336

4437
def the_sorting(request, query):
@@ -103,8 +96,4 @@ def paginate(request: Request, query, serilizer, the_page: int = 1, the_per_page
10396
'from': offset + 1 if data else None,
10497
'to': offset + len(data) if data else None,
10598
wrap: data
106-
}
107-
108-
109-
# Update the __all__ list
110-
__all__ = []
99+
}

fastapi_project/utils/validation.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ async def wrapper(request: Request, *args, **kwargs):
2727
try:
2828
request_data = await the_query(request)
2929
validated_data = schema(**request_data)
30-
return await func(validated_data, *args, **kwargs)
30+
31+
# Attach validated data to request object
32+
request.state.validated_data = validated_data
33+
34+
return await func(request, *args, **kwargs)
3135
except ValidationError as e:
3236
errors = {}
3337
for error in e.errors():
@@ -48,4 +52,4 @@ async def wrapper(request: Request, *args, **kwargs):
4852
return decorator
4953

5054
# Update the __all__ list
51-
__all__ = ['dto', 'ValidationException', 'setup_validation_exception_handler']
55+
__all__ = ['dto', 'ValidationException', 'setup_validation_exception_handler']

0 commit comments

Comments
 (0)