feat(reactions): add message reactions API and web quick reactions
This commit is contained in:
@@ -8,7 +8,14 @@ from app.chats.service import ensure_chat_membership
|
||||
from app.messages import repository
|
||||
from app.messages.models import Message
|
||||
from app.messages.spam_guard import enforce_message_spam_policy
|
||||
from app.messages.schemas import MessageCreateRequest, MessageForwardRequest, MessageStatusUpdateRequest, MessageUpdateRequest
|
||||
from app.messages.schemas import (
|
||||
MessageCreateRequest,
|
||||
MessageForwardRequest,
|
||||
MessageReactionRead,
|
||||
MessageReactionToggleRequest,
|
||||
MessageStatusUpdateRequest,
|
||||
MessageUpdateRequest,
|
||||
)
|
||||
from app.notifications.service import dispatch_message_notifications
|
||||
from app.users.repository import has_block_relation_between_users
|
||||
from app.users.service import get_user_by_id
|
||||
@@ -267,3 +274,43 @@ async def forward_message(
|
||||
await db.commit()
|
||||
await db.refresh(forwarded)
|
||||
return forwarded
|
||||
|
||||
|
||||
async def list_message_reactions(
|
||||
db: AsyncSession,
|
||||
*,
|
||||
message_id: int,
|
||||
user_id: int,
|
||||
) -> list[MessageReactionRead]:
|
||||
message = await repository.get_message_by_id(db, message_id)
|
||||
if not message:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Message not found")
|
||||
await ensure_chat_membership(db, chat_id=message.chat_id, user_id=user_id)
|
||||
counts = await repository.list_message_reactions(db, message_id=message_id)
|
||||
mine = await repository.get_message_reaction(db, message_id=message_id, user_id=user_id)
|
||||
mine_emoji = mine.emoji if mine else None
|
||||
return [
|
||||
MessageReactionRead(emoji=emoji, count=count, reacted=(emoji == mine_emoji))
|
||||
for emoji, count in counts
|
||||
]
|
||||
|
||||
|
||||
async def toggle_message_reaction(
|
||||
db: AsyncSession,
|
||||
*,
|
||||
message_id: int,
|
||||
user_id: int,
|
||||
payload: MessageReactionToggleRequest,
|
||||
) -> list[MessageReactionRead]:
|
||||
message = await repository.get_message_by_id(db, message_id)
|
||||
if not message:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Message not found")
|
||||
await ensure_chat_membership(db, chat_id=message.chat_id, user_id=user_id)
|
||||
await repository.upsert_message_reaction(
|
||||
db,
|
||||
message_id=message_id,
|
||||
user_id=user_id,
|
||||
emoji=payload.emoji.strip(),
|
||||
)
|
||||
await db.commit()
|
||||
return await list_message_reactions(db, message_id=message_id, user_id=user_id)
|
||||
|
||||
Reference in New Issue
Block a user