99 RefreshTokenRepository ,
1010)
1111from src .shared .exceptions .credential_exception import InvalidRefreshTokenError
12+ from src .shared .unit_of_work import UnitOfWork
1213
1314
1415class RefreshTokenCommandHandler :
15- def __init__ (self , refresh_token_repo : RefreshTokenRepository ):
16+ def __init__ (
17+ self ,
18+ refresh_token_repo : RefreshTokenRepository ,
19+ unit_of_work : UnitOfWork ,
20+ ):
1621 self ._refresh_token_repo = refresh_token_repo
22+ self ._unit_of_work = unit_of_work
1723
1824 def _hash_token (self , token : str ) -> str :
1925 return hashlib .sha256 (token .encode ()).hexdigest ()
@@ -29,30 +35,35 @@ async def execute(self, command: RefreshTokenCommand) -> dict:
2935 if stored_token .expires_at < datetime .now (timezone .utc ):
3036 raise InvalidRefreshTokenError ("Refresh token has expired" )
3137
32- stored_token .revoke ()
33- await self ._refresh_token_repo .save (stored_token )
38+ try :
39+ stored_token .revoke ()
40+ await self ._refresh_token_repo .save (stored_token )
3441
35- new_access_token = JWTService .create_access_token (
36- data = {"sub" : str (stored_token .user_id )}
37- )
42+ new_access_token = JWTService .create_access_token (
43+ data = {"sub" : str (stored_token .user_id )}
44+ )
3845
39- new_refresh_token_str = JWTService .create_refresh_token (
40- data = {"sub" : str (stored_token .user_id )}
41- )
46+ new_refresh_token_str = JWTService .create_refresh_token (
47+ data = {"sub" : str (stored_token .user_id )}
48+ )
4249
43- new_token_hash = self ._hash_token (new_refresh_token_str )
50+ new_token_hash = self ._hash_token (new_refresh_token_str )
4451
45- expires_at = datetime .now (timezone .utc ) + timedelta (
46- minutes = settings .REFRESH_TOKEN_EXPIRE_MINUTES ,
47- )
52+ expires_at = datetime .now (timezone .utc ) + timedelta (
53+ minutes = settings .REFRESH_TOKEN_EXPIRE_MINUTES ,
54+ )
4855
49- new_refresh_token_entity = RefreshToken .create (
50- user_id = stored_token .user_id ,
51- token_hash = new_token_hash ,
52- expires_at = expires_at ,
53- )
56+ new_refresh_token_entity = RefreshToken .create (
57+ user_id = stored_token .user_id ,
58+ token_hash = new_token_hash ,
59+ expires_at = expires_at ,
60+ )
5461
55- await self ._refresh_token_repo .save (new_refresh_token_entity )
62+ await self ._refresh_token_repo .save (new_refresh_token_entity )
63+ await self ._unit_of_work .commit ()
64+ except Exception :
65+ await self ._unit_of_work .rollback ()
66+ raise
5667
5768 return {
5869 "access_token" : new_access_token ,
0 commit comments