Skip to content

Commit 807e5c7

Browse files
committed
fix: update detail /me endpoint
1 parent d87732b commit 807e5c7

4 files changed

Lines changed: 47 additions & 2 deletions

File tree

src/modules/user/domain/entities/user.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,52 +9,65 @@
99
@dataclass
1010
class UserProfile:
1111
"""User profile containing personal information."""
12+
1213
user_id: UUID
1314
first_name: Optional[str] = None
1415
last_name: Optional[str] = None
1516
display_name: Optional[str] = None
1617
avatar_url: Optional[str] = None
1718
bio: Optional[str] = None
1819
birth_date: Optional[date] = None
20+
created_at: Optional[str] = None
21+
updated_at: Optional[str] = None
1922

2023

2124
@dataclass
2225
class UserSettings:
2326
"""User preferences and settings."""
27+
2428
user_id: UUID
2529
preferences: dict = field(default_factory=dict)
30+
created_at: Optional[str] = None
31+
updated_at: Optional[str] = None
2632

2733

2834
@dataclass
2935
class UserSecurity:
3036
"""User security configuration and state."""
37+
3138
user_id: UUID
3239
failed_login_attempts: int = 0
3340
locked_until: Optional[datetime] = None
3441
password_changed_at: Optional[datetime] = None
3542
two_factor_enabled: bool = False
3643
two_factor_secret: Optional[str] = None
3744
two_factor_backup_codes: Optional[str] = None
45+
created_at: Optional[str] = None
46+
updated_at: Optional[str] = None
3847

3948

4049
@dataclass
4150
class User:
4251
"""Core user identity and authentication aggregate root."""
52+
4353
id: UUID
4454
email: str
4555
password_hash: str
46-
56+
4757
# Identity
4858
username: Optional[str] = None
4959
auth_provider: str = "local"
5060
external_id: Optional[str] = None
5161
status: str = "pending_verification"
52-
62+
5363
# Related entities (loaded separately via repository methods)
5464
profile: Optional[UserProfile] = None
5565
settings: Optional[UserSettings] = None
5666
security: Optional[UserSecurity] = None
5767

68+
created_at: Optional[str] = None
69+
updated_at: Optional[str] = None
70+
5871
@classmethod
5972
def create(
6073
cls,

src/modules/user/infrastructure/repositories/user_repository.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,8 @@ def _map_to_entity(self, user_model: UserModel) -> User:
215215
auth_provider=user_model.auth_provider,
216216
status=user_model.status,
217217
external_id=user_model.external_id,
218+
created_at=user_model.created_at.isoformat(),
219+
updated_at=user_model.updated_at.isoformat(),
218220
)
219221

220222
def _map_to_entity_with_relations(self, user_model: UserModel) -> User:
@@ -240,6 +242,8 @@ def _map_profile_to_entity(self, profile_model: UserProfileModel) -> UserProfile
240242
avatar_url=profile_model.avatar_url,
241243
bio=profile_model.bio,
242244
birth_date=profile_model.birth_date,
245+
created_at=profile_model.created_at.isoformat(),
246+
updated_at=profile_model.updated_at.isoformat(),
243247
)
244248

245249
def _map_settings_to_entity(
@@ -248,6 +252,8 @@ def _map_settings_to_entity(
248252
return UserSettings(
249253
user_id=settings_model.user_id,
250254
preferences=settings_model.preferences or {},
255+
created_at=settings_model.created_at.isoformat(),
256+
updated_at=settings_model.updated_at.isoformat(),
251257
)
252258

253259
def _map_security_to_entity(
@@ -261,4 +267,6 @@ def _map_security_to_entity(
261267
two_factor_enabled=security_model.two_factor_enabled,
262268
two_factor_secret=security_model.two_factor_secret,
263269
two_factor_backup_codes=security_model.two_factor_backup_codes,
270+
created_at=security_model.created_at.isoformat(),
271+
updated_at=security_model.updated_at.isoformat(),
264272
)

src/modules/user/presentation/routers/user_router.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,15 @@ async def get_me(
118118
data=UserResponse(
119119
id=str(user.id),
120120
email=user.email,
121+
username=user.username,
122+
auth_provider=user.auth_provider,
123+
external_id=user.external_id,
124+
status=user.status,
125+
profile=user.profile,
126+
settings=user.settings,
127+
security=user.security,
128+
created_at=user.created_at,
129+
updated_at=user.updated_at,
121130
),
122131
)
123132

src/modules/user/presentation/schemas/response.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
from pydantic import BaseModel
22

3+
from src.modules.user.domain.entities.user import (
4+
UserProfile,
5+
UserSecurity,
6+
UserSettings,
7+
)
8+
39

410
class TokenResponse(BaseModel):
511
access_token: str
@@ -10,3 +16,12 @@ class TokenResponse(BaseModel):
1016
class UserResponse(BaseModel):
1117
id: str
1218
email: str
19+
username: str | None
20+
auth_provider: str = "local"
21+
external_id: str | None
22+
status: str = "pending_verification"
23+
created_at: str | None
24+
updated_at: str | None
25+
profile: UserProfile | None
26+
settings: UserSettings | None
27+
security: UserSecurity | None

0 commit comments

Comments
 (0)