fix(channels): eliminate N+1 query in get_pinned_messages endpoint (#20459)

Replaced per-message user lookup with batch fetch using SQL IN clause.

Changes:
- Fetch all message user_ids in a single pass
- Use Users.get_users_by_user_ids() for batch lookup
- Build user mapping to avoid DB calls in loop
- Add early return for empty message lists

Performance: Reduces N+1 queries to 2 queries (messages + users)
This commit is contained in:
Classic298
2026-01-07 20:36:38 +01:00
committed by GitHub
parent b8fb9e815b
commit 48f1b2d547

View File

@@ -843,14 +843,16 @@ async def get_pinned_channel_messages(
limit = PAGE_ITEM_COUNT_PINNED
message_list = Messages.get_pinned_messages_by_channel_id(id, skip, limit, db=db)
users = {}
if not message_list:
return []
# Batch fetch all users in a single query (fixes N+1 problem)
user_ids = list(set(m.user_id for m in message_list))
users = {u.id: u for u in Users.get_users_by_user_ids(user_ids, db=db)}
messages = []
for message in message_list:
if message.user_id not in users:
user = Users.get_user_by_id(message.user_id, db=db)
users[message.user_id] = user
messages.append(
MessageWithReactionsResponse(
**{