33Spring Boot 사용자 동기화를 위한 비즈니스 로직 계층입니다.
44"""
55
6- from datetime import datetime
7-
86from sqlalchemy .ext .asyncio import AsyncSession
97
108from app .core .logging import get_logger
119from app .core .middlewares .context import get_request_id
10+ from app .core .utils .datetime import now_utc
1211from app .domains .users .exceptions import UserNotFoundException
1312from app .domains .users .models import User
1413from app .domains .users .repository import UserRepository
@@ -87,7 +86,7 @@ async def upsert_user(self, user_data: UserSync) -> User:
8786 if existing .deleted_at :
8887 existing .deleted_at = None # 복구
8988
90- existing .last_sync_at = datetime . now ()
89+ existing .last_sync_at = now_utc ()
9190 user = await self .repository .update (existing )
9291
9392 logger .info (
@@ -101,7 +100,7 @@ async def upsert_user(self, user_data: UserSync) -> User:
101100 return user
102101 else :
103102 # 생성
104- user = User (id = user_data .id , last_sync_at = datetime . now ())
103+ user = User (id = user_data .id , last_sync_at = now_utc ())
105104 created_user = await self .repository .create (user )
106105
107106 logger .info (
@@ -131,42 +130,43 @@ async def bulk_upsert_users(
131130 restored = 0
132131
133132 for user_data in users :
134- existing = await self .repository .get_by_id (
135- user_data .id , include_deleted = True
136- )
137-
138- if existing :
139- was_deleted = existing .deleted_at is not None
140- if was_deleted :
141- existing .deleted_at = None
142- restored += 1
133+ try :
134+ existing = await self .repository .get_by_id (
135+ user_data .id , include_deleted = True
136+ )
137+
138+ if existing :
139+ was_deleted = existing .deleted_at is not None
140+ if was_deleted :
141+ existing .deleted_at = None
142+ restored += 1
143+ else :
144+ updated += 1
145+
146+ existing .last_sync_at = now_utc ()
147+ await self .repository .update (existing )
143148 else :
144- updated += 1
145-
146- existing .last_sync_at = datetime .now ()
147- await self .repository .update (existing )
148- else :
149- user = User (id = user_data .id , last_sync_at = datetime .now ())
150- await self .repository .create (user )
151- created += 1
152-
153- result = BulkSyncResponse (
154- total = total , created = created , updated = updated , restored = restored
155- )
156-
157- logger .info (
158- "Bulk sync completed" ,
159- extra = {
160- "request_id" : get_request_id (),
161- "sync_total" : total ,
162- "sync_created" : created ,
163- "sync_updated" : updated ,
164- "sync_restored" : restored ,
165- },
149+ user = User (id = user_data .id , last_sync_at = now_utc ())
150+ await self .repository .create (user )
151+ created += 1
152+
153+ except Exception :
154+ logger .exception (
155+ "Failed to sync user" ,
156+ extra = {
157+ "request_id" : get_request_id (),
158+ "user_id" : getattr (user_data , "id" , None ),
159+ },
160+ )
161+ raise
162+
163+ return BulkSyncResponse (
164+ total = total ,
165+ created = created ,
166+ updated = updated ,
167+ restored = restored ,
166168 )
167169
168- return result
169-
170170 async def delete_user (self , user_id : int ) -> None :
171171 """사용자 Soft Delete
172172
0 commit comments