Changed user logic to display name and refined requirements page design

This commit is contained in:
gulimabr
2025-12-02 10:00:42 -03:00
parent a52a669521
commit e152c07f65
7 changed files with 129 additions and 65 deletions

View File

@@ -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