Changed user logic to display name and refined requirements page design
This commit is contained in:
@@ -111,18 +111,20 @@ class UserRepository:
|
||||
)
|
||||
return result.scalar_one_or_none()
|
||||
|
||||
async def create(self, sub: str, role_id: int) -> User:
|
||||
async def create(self, sub: str, role_id: int, username: str, full_name: str | None = None) -> User:
|
||||
"""
|
||||
Create a new user.
|
||||
|
||||
Args:
|
||||
sub: The Keycloak subject ID
|
||||
role_id: The role ID to assign
|
||||
username: The Keycloak preferred_username
|
||||
full_name: The Keycloak name claim (optional)
|
||||
|
||||
Returns:
|
||||
The created User
|
||||
"""
|
||||
user = User(sub=sub, role_id=role_id)
|
||||
user = User(sub=sub, role_id=role_id, username=username, full_name=full_name)
|
||||
self.session.add(user)
|
||||
await self.session.flush()
|
||||
await self.session.refresh(user)
|
||||
@@ -148,6 +150,25 @@ class UserRepository:
|
||||
await self.session.refresh(user)
|
||||
return user
|
||||
|
||||
async def update_profile(self, user: User, username: str, full_name: str | None = None) -> User:
|
||||
"""
|
||||
Update a user's profile info (username and full_name) from Keycloak.
|
||||
Called on subsequent logins to sync changes from Keycloak.
|
||||
|
||||
Args:
|
||||
user: The user to update
|
||||
username: The Keycloak preferred_username
|
||||
full_name: The Keycloak name claim (optional)
|
||||
|
||||
Returns:
|
||||
The updated User
|
||||
"""
|
||||
user.username = username
|
||||
user.full_name = full_name
|
||||
await self.session.flush()
|
||||
await self.session.refresh(user)
|
||||
return user
|
||||
|
||||
async def get_or_create_default_role(self) -> Role:
|
||||
"""
|
||||
Get the default user role, creating it if it doesn't exist.
|
||||
@@ -164,13 +185,16 @@ class UserRepository:
|
||||
|
||||
return role
|
||||
|
||||
async def get_or_create_user(self, sub: str) -> tuple[User, bool]:
|
||||
async def get_or_create_user(self, sub: str, username: str, full_name: str | None = None) -> tuple[User, bool]:
|
||||
"""
|
||||
Get an existing user or create a new one (Just-in-Time Provisioning).
|
||||
This is the main method called during login.
|
||||
Also updates username/full_name on subsequent logins to sync with Keycloak.
|
||||
|
||||
Args:
|
||||
sub: The Keycloak subject ID
|
||||
username: The Keycloak preferred_username
|
||||
full_name: The Keycloak name claim (optional)
|
||||
|
||||
Returns:
|
||||
Tuple of (User, created) where created is True if a new user was created
|
||||
@@ -180,6 +204,8 @@ class UserRepository:
|
||||
|
||||
if user is not None:
|
||||
logger.debug(f"Found existing user with sub: {sub}")
|
||||
# Update profile info on subsequent logins to sync with Keycloak
|
||||
user = await self.update_profile(user, username, full_name)
|
||||
return user, False
|
||||
|
||||
# User doesn't exist, create them with default role
|
||||
@@ -189,7 +215,7 @@ class UserRepository:
|
||||
default_role = await self.get_or_create_default_role()
|
||||
|
||||
# Create the user
|
||||
user = await self.create(sub=sub, role_id=default_role.id)
|
||||
user = await self.create(sub=sub, role_id=default_role.id, username=username, full_name=full_name)
|
||||
|
||||
logger.info(f"Created new user with id: {user.id}, sub: {sub}")
|
||||
logger.info(f"Created new user with id: {user.id}, sub: {sub}, username: {username}")
|
||||
return user, True
|
||||
|
||||
Reference in New Issue
Block a user