feat(chats): add per-user pinned chats and pinned sorting

This commit is contained in:
2026-03-08 09:54:43 +03:00
parent fdf973eeab
commit 8cdcd9531d
9 changed files with 139 additions and 4 deletions

View File

@@ -70,7 +70,11 @@ def _user_chats_query(user_id: int, query: str | None = None) -> Select[tuple[Ch
Chat.type.cast(String).ilike(q),
)
)
return stmt.order_by(Chat.id.desc())
return stmt.order_by(
func.coalesce(ChatUserSetting.pinned, False).desc(),
ChatUserSetting.pinned_at.desc().nullslast(),
Chat.id.desc(),
)
async def list_user_chats(
@@ -103,7 +107,11 @@ async def list_archived_user_chats(
(ChatUserSetting.chat_id == Chat.id) & (ChatUserSetting.user_id == user_id),
)
.where(ChatMember.user_id == user_id, ChatUserSetting.archived.is_(True))
.order_by(Chat.id.desc())
.order_by(
func.coalesce(ChatUserSetting.pinned, False).desc(),
ChatUserSetting.pinned_at.desc().nullslast(),
Chat.id.desc(),
)
.limit(limit)
)
if before_id is not None:
@@ -287,3 +295,28 @@ async def upsert_chat_archived_setting(
db.add(setting)
await db.flush()
return setting
async def upsert_chat_pinned_setting(
db: AsyncSession,
*,
chat_id: int,
user_id: int,
pinned: bool,
) -> ChatUserSetting:
setting = await get_chat_user_setting(db, chat_id=chat_id, user_id=user_id)
if setting:
setting.pinned = pinned
setting.pinned_at = func.now() if pinned else None
await db.flush()
return setting
setting = ChatUserSetting(
chat_id=chat_id,
user_id=user_id,
archived=False,
pinned=pinned,
pinned_at=func.now() if pinned else None,
)
db.add(setting)
await db.flush()
return setting