Skip to content

Commit f2cd801

Browse files
authored
chore: use TypeAdapter for list items validation (freeCodeCamp-2025-Summer-Hackathon#318)
1 parent 14ef86a commit f2cd801

File tree

2 files changed

+11
-4
lines changed

2 files changed

+11
-4
lines changed

backend/src/api/ideas.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44
from typing import Any, Literal
55

66
from odmantic import query
7+
from pydantic import TypeAdapter
78

89
from src.dependencies import Db
910
from src.models import Idea, IdeaDownvote, IdeaPublic, IdeasPublic, IdeaUpvote, User
1011

12+
idea_list_adapter = TypeAdapter(list[IdeaPublic])
13+
1114

1215
async def count_ideas(db: Db, user: User | None = None) -> int:
1316
if user is not None:
@@ -45,7 +48,7 @@ async def get_ideas(db: Db, skip: int, limit: int, sort: str | None = None):
4548
else:
4649
ideas = await db.find(Idea, limit=limit, skip=skip, sort=Idea.name)
4750
return IdeasPublic(
48-
data=[IdeaPublic(**idea.model_dump()) for idea in ideas],
51+
data=idea_list_adapter.validate_python(ideas, from_attributes=True),
4952
count=await count_ideas(db),
5053
)
5154

@@ -62,7 +65,7 @@ async def get_user_ideas(
6265
count = await count_ideas(db, user)
6366

6467
return IdeasPublic(
65-
data=[IdeaPublic(**idea.model_dump()) for idea in ideas], count=count
68+
data=idea_list_adapter.validate_python(ideas, from_attributes=True), count=count
6669
)
6770

6871

@@ -78,7 +81,8 @@ async def get_voted_ideas(
7881
Idea, query.in_(Idea.id, votes), limit=limit, skip=skip, sort=Idea.name
7982
)
8083
return IdeasPublic(
81-
data=[IdeaPublic(**idea.model_dump()) for idea in ideas], count=len(votes)
84+
data=idea_list_adapter.validate_python(ideas, from_attributes=True),
85+
count=len(votes),
8286
)
8387

8488

backend/src/api/routes/users.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from fastapi import APIRouter, Form, HTTPException, Response
44
from odmantic.exceptions import DuplicateKeyError
5+
from pydantic import TypeAdapter
56

67
from src.api.dependencies import AdminUser, PaginationParams, UserFromPathId
78
from src.api.ideas import get_user_ideas
@@ -77,8 +78,10 @@ async def create_user(db: Db, create_data: Annotated[AdminUserCreate, Form()]):
7778
async def list_users(db: Db, pagination: PaginationParams):
7879
users = await db.find(User, **pagination.model_dump(), sort=User.name)
7980
count = await db.count(User)
81+
user_list_adapter = TypeAdapter(list[UserMe])
8082
return UsersAdmin(
81-
users=[UserMe(**user.model_dump()) for user in users], count=count
83+
users=user_list_adapter.validate_python(users, from_attributes=True),
84+
count=count,
8285
)
8386

8487

0 commit comments

Comments
 (0)