feat(chats): add per-user pinned chats and pinned sorting
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user