Compare commits
2 Commits
6d6c4ee35d
...
0b285e6ef0
Author | SHA1 | Date | |
---|---|---|---|
![]() |
0b285e6ef0 | ||
![]() |
6854ba62d4 |
@ -101,7 +101,9 @@ class DatabaseInterface(ABC):
|
||||
"""Create a new user."""
|
||||
|
||||
@abstractmethod
|
||||
async def update_user_display_name(self, user_uuid: UUID, display_name: str) -> None:
|
||||
async def update_user_display_name(
|
||||
self, user_uuid: UUID, display_name: str
|
||||
) -> None:
|
||||
"""Update a user's display name."""
|
||||
|
||||
# Role operations
|
||||
@ -335,6 +337,7 @@ class DatabaseInterface(ABC):
|
||||
2. Optionally delete old session (e.g. reset token) if provided
|
||||
3. Optionally update user's display name
|
||||
4. Insert new session referencing the credential
|
||||
5. Update user's last_seen and increment visits (treat as a login)
|
||||
"""
|
||||
|
||||
|
||||
|
@ -271,7 +271,9 @@ class DB(DatabaseInterface):
|
||||
async with self.session() as session:
|
||||
session.add(UserModel.from_dataclass(user))
|
||||
|
||||
async def update_user_display_name(self, user_uuid: UUID, display_name: str) -> None:
|
||||
async def update_user_display_name(
|
||||
self, user_uuid: UUID, display_name: str
|
||||
) -> None:
|
||||
async with self.session() as session:
|
||||
stmt = (
|
||||
update(UserModel)
|
||||
@ -412,6 +414,11 @@ class DB(DatabaseInterface):
|
||||
) -> None:
|
||||
"""Atomic credential + (optional old session delete) + (optional rename) + new session."""
|
||||
async with self.session() as session:
|
||||
# Ensure credential has last_used / last_verified for immediate login semantics
|
||||
if credential.last_used is None:
|
||||
credential.last_used = credential.created_at
|
||||
if credential.last_verified is None:
|
||||
credential.last_verified = credential.last_used
|
||||
# Insert credential
|
||||
session.add(
|
||||
CredentialModel(
|
||||
@ -448,6 +455,12 @@ class DB(DatabaseInterface):
|
||||
info=session_info,
|
||||
)
|
||||
)
|
||||
# Login side-effects: update user analytics (last_seen + visits increment)
|
||||
await session.execute(
|
||||
update(UserModel)
|
||||
.where(UserModel.uuid == user_uuid.bytes)
|
||||
.values(last_seen=credential.last_used, visits=UserModel.visits + 1)
|
||||
)
|
||||
|
||||
async def delete_credential(self, uuid: UUID, user_uuid: UUID) -> None:
|
||||
async with self.session() as session:
|
||||
|
Loading…
x
Reference in New Issue
Block a user