22Pad service for business logic related to pads.
33"""
44
5- from typing import List , Optional , Dict , Any
5+ from typing import List , Optional , Dict , Any , TYPE_CHECKING
66from uuid import UUID
77
88from sqlalchemy .ext .asyncio import AsyncSession
99
1010from ..repository import PadRepository , UserRepository
1111from .user_service import UserService
1212
13+ # Use TYPE_CHECKING to avoid circular imports
14+ if TYPE_CHECKING :
15+ from dependencies import UserSession
16+
1317class PadService :
1418 """Service for pad-related business logic"""
1519
@@ -19,7 +23,7 @@ def __init__(self, session: AsyncSession):
1923 self .repository = PadRepository (session )
2024 self .user_repository = UserRepository (session )
2125
22- async def create_pad (self , owner_id : UUID , display_name : str , data : Dict [str , Any ], token_data : Dict [ str , Any ] ) -> Dict [str , Any ]:
26+ async def create_pad (self , owner_id : UUID , display_name : str , data : Dict [str , Any ], user_session : "UserSession" = None ) -> Dict [str , Any ]:
2327 """Create a new pad"""
2428 # Validate input
2529 if not display_name :
@@ -28,20 +32,37 @@ async def create_pad(self, owner_id: UUID, display_name: str, data: Dict[str, An
2832 if not data :
2933 raise ValueError ("Pad data is required" )
3034
31- if not token_data :
32- raise ValueError ("Token data is required for user creation failsafe" )
33-
3435 # Check if owner exists
3536 owner = await self .user_repository .get_by_id (owner_id )
36- if not owner :
37- # User doesn't exist, create a user record from token data
38- print (f"WARNING : User with ID '{ owner_id } ' does not exist but is trying to save a pad . Creating user as failsafe." )
37+ if not owner and user_session :
38+ # User doesn't exist, create a user record from user session
39+ print (f"ANOMALY DETECTED : User with ID '{ owner_id } ' does not exist but has valid authentication . Creating user as failsafe." )
3940
4041 # Create a UserService instance
4142 user_service = UserService (self .session )
4243
43- # Use token data to create a complete user record
44- await user_service .sync_user_with_token_data (owner_id , token_data )
44+ # Create user with data from UserSession
45+ try :
46+ await user_service .create_user (
47+ user_id = user_session .id ,
48+ username = user_session .username ,
49+ email = user_session .email ,
50+ email_verified = user_session .email_verified ,
51+ name = user_session .name ,
52+ given_name = user_session .given_name ,
53+ family_name = user_session .family_name ,
54+ roles = user_session .roles
55+ )
56+ print (f"Successfully created user with ID '{ owner_id } ' as failsafe." )
57+ except ValueError as e :
58+ print (f"Error creating user as failsafe: { str (e )} " )
59+ # If user creation fails due to race condition, try to get the user again
60+ if "already exists" in str (e ):
61+ owner = await self .user_repository .get_by_id (owner_id )
62+ if not owner :
63+ raise ValueError (f"Failed to create user with ID '{ owner_id } '" )
64+ else :
65+ raise
4566
4667 # Check if pad with same name already exists for this owner
4768 existing_pad = await self .repository .get_by_name (owner_id , display_name )
0 commit comments