Skip to content

Commit 6c61383

Browse files
committed
refactor: user repositories persist integer ids
1 parent d260fa8 commit 6c61383

3 files changed

Lines changed: 21 additions & 22 deletions

File tree

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ class User:
6666

6767
created_at: Optional[str] = None
6868
updated_at: Optional[str] = None
69+
tenant_id: int | None = None
6970

7071
@classmethod
7172
def create(

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from uuid import UUID
2-
31
from sqlalchemy import select, update
42

53
from src.modules.user.domain.entities.refresh_token import RefreshToken
@@ -12,7 +10,7 @@
1210

1311

1412
class SQLAlchemyRefreshTokenRepository(RefreshTokenRepository):
15-
def __init__(self, db, tenant_id: UUID | None = None):
13+
def __init__(self, db, tenant_id: int | None = None):
1614
self.db = db
1715
self._tenant_id = tenant_id
1816

@@ -36,14 +34,13 @@ async def get_by_token_hash(self, token_hash: str) -> RefreshToken | None:
3634

3735
async def save(self, refresh_token: RefreshToken) -> RefreshToken:
3836
model = RefreshTokenModel(
39-
id=refresh_token.id,
4037
user_id=refresh_token.user_id,
4138
tenant_id=self._tenant_id,
4239
refresh_token_hash=refresh_token.token_hash,
4340
expires_at=refresh_token.expires_at,
4441
is_revoked=refresh_token.is_revoked,
4542
)
46-
model = await self.db.merge(model)
43+
self.db.add(model)
4744
await self.db.flush()
4845
await self.db.refresh(model)
4946
return RefreshToken(
@@ -54,7 +51,7 @@ async def save(self, refresh_token: RefreshToken) -> RefreshToken:
5451
is_revoked=model.is_revoked,
5552
)
5653

57-
async def revoke_by_user_id(self, user_id: UUID) -> None:
54+
async def revoke_by_user_id(self, user_id: int) -> None:
5855
stmt = (
5956
update(RefreshTokenModel)
6057
.where(

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

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from typing import Optional
2-
from uuid import UUID
32

43
from sqlalchemy import select
54
from sqlalchemy.ext.asyncio import AsyncSession
@@ -19,7 +18,7 @@
1918

2019

2120
class SQLAlchemyUserRepository(UserRepository):
22-
def __init__(self, db: AsyncSession, tenant_id: UUID | None = None):
21+
def __init__(self, db: AsyncSession, tenant_id: int | None = None):
2322
self._db = db
2423
self._tenant_id = tenant_id
2524

@@ -34,7 +33,7 @@ async def get_by_email(self, email: str) -> Optional[User]:
3433

3534
return self._map_to_entity(user_model)
3635

37-
async def get_by_id(self, user_id: UUID) -> Optional[User]:
36+
async def get_by_id(self, user_id: int) -> Optional[User]:
3837
stmt = select(UserModel).where(UserModel.id == user_id)
3938
if self._tenant_id:
4039
stmt = stmt.where(UserModel.tenant_id == self._tenant_id)
@@ -44,7 +43,7 @@ async def get_by_id(self, user_id: UUID) -> Optional[User]:
4443
return None
4544
return self._map_to_entity(user_model)
4645

47-
async def get_by_id_with_relations(self, user_id: UUID) -> Optional[User]:
46+
async def get_by_id_with_relations(self, user_id: int) -> Optional[User]:
4847
"""Get user with profile, settings, and security eagerly loaded."""
4948
stmt = (
5049
select(UserModel)
@@ -78,16 +77,18 @@ async def save(self, user: User) -> User:
7877
user_model.external_id = user.external_id
7978
else:
8079
# Create new user
81-
user_model = UserModel(
82-
id=user.id,
83-
email=user.email,
84-
username=user.username,
85-
password_hash=user.password_hash,
86-
auth_provider=user.auth_provider,
87-
status=user.status,
88-
external_id=user.external_id,
89-
tenant_id=self._tenant_id or user.tenant_id,
90-
)
80+
model_kwargs = {
81+
"email": user.email,
82+
"username": user.username,
83+
"password_hash": user.password_hash,
84+
"auth_provider": user.auth_provider,
85+
"status": user.status,
86+
"external_id": user.external_id,
87+
"tenant_id": self._tenant_id or user.tenant_id,
88+
}
89+
if user.id is not None:
90+
model_kwargs["id"] = user.id
91+
user_model = UserModel(**model_kwargs)
9192
self._db.add(user_model)
9293

9394
# Create default related records
@@ -181,14 +182,14 @@ async def save_security(self, security: UserSecurity) -> UserSecurity:
181182
await self._db.refresh(security_model)
182183
return self._map_security_to_entity(security_model)
183184

184-
async def _get_user_model(self, user_id: UUID) -> UserModel:
185+
async def _get_user_model(self, user_id: int) -> UserModel:
185186
stmt = select(UserModel).where(UserModel.id == user_id)
186187
if self._tenant_id:
187188
stmt = stmt.where(UserModel.tenant_id == self._tenant_id)
188189
result = await self._db.execute(stmt)
189190
return result.scalar_one()
190191

191-
async def _create_default_related_records(self, user_id: UUID) -> None:
192+
async def _create_default_related_records(self, user_id: int) -> None:
192193
"""Create default profile, settings, and security records for a new user."""
193194
# Default profile
194195
profile_model = UserProfileModel(user_id=user_id, tenant_id=self._tenant_id)

0 commit comments

Comments
 (0)