fix: persist message delivery status across server restarts
All checks were successful
CI / test (push) Successful in 21s
All checks were successful
CI / test (push) Successful in 21s
This commit is contained in:
@@ -180,6 +180,11 @@ async def create_message_receipt(
|
|||||||
return receipt
|
return receipt
|
||||||
|
|
||||||
|
|
||||||
|
async def list_chat_receipts(db: AsyncSession, *, chat_id: int) -> list[MessageReceipt]:
|
||||||
|
result = await db.execute(select(MessageReceipt).where(MessageReceipt.chat_id == chat_id))
|
||||||
|
return list(result.scalars().all())
|
||||||
|
|
||||||
|
|
||||||
async def get_message_reaction(db: AsyncSession, *, message_id: int, user_id: int) -> MessageReaction | None:
|
async def get_message_reaction(db: AsyncSession, *, message_id: int, user_id: int) -> MessageReaction | None:
|
||||||
result = await db.execute(
|
result = await db.execute(
|
||||||
select(MessageReaction)
|
select(MessageReaction)
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ class MessageRead(BaseModel):
|
|||||||
forwarded_from_message_id: int | None
|
forwarded_from_message_id: int | None
|
||||||
type: MessageType
|
type: MessageType
|
||||||
text: str | None
|
text: str | None
|
||||||
|
delivery_status: Literal["sending", "sent", "delivered", "read"] | None = None
|
||||||
created_at: datetime
|
created_at: datetime
|
||||||
updated_at: datetime
|
updated_at: datetime
|
||||||
|
|
||||||
|
|||||||
@@ -107,7 +107,26 @@ async def get_messages(
|
|||||||
) -> list[Message]:
|
) -> list[Message]:
|
||||||
await ensure_chat_membership(db, chat_id=chat_id, user_id=user_id)
|
await ensure_chat_membership(db, chat_id=chat_id, user_id=user_id)
|
||||||
safe_limit = max(1, min(limit, 100))
|
safe_limit = max(1, min(limit, 100))
|
||||||
return await repository.list_chat_messages(db, chat_id, user_id=user_id, limit=safe_limit, before_id=before_id)
|
messages = await repository.list_chat_messages(db, chat_id, user_id=user_id, limit=safe_limit, before_id=before_id)
|
||||||
|
if not messages:
|
||||||
|
return messages
|
||||||
|
receipts = await repository.list_chat_receipts(db, chat_id=chat_id)
|
||||||
|
other_receipts = [receipt for receipt in receipts if receipt.user_id != user_id]
|
||||||
|
if not other_receipts:
|
||||||
|
return messages
|
||||||
|
for message in messages:
|
||||||
|
if message.sender_id != user_id:
|
||||||
|
continue
|
||||||
|
is_read = any((receipt.last_read_message_id or 0) >= message.id for receipt in other_receipts)
|
||||||
|
if is_read:
|
||||||
|
setattr(message, "delivery_status", "read")
|
||||||
|
continue
|
||||||
|
is_delivered = any((receipt.last_delivered_message_id or 0) >= message.id for receipt in other_receipts)
|
||||||
|
if is_delivered:
|
||||||
|
setattr(message, "delivery_status", "delivered")
|
||||||
|
continue
|
||||||
|
setattr(message, "delivery_status", "sent")
|
||||||
|
return messages
|
||||||
|
|
||||||
|
|
||||||
async def search_messages(
|
async def search_messages(
|
||||||
|
|||||||
@@ -254,6 +254,7 @@ Rules:
|
|||||||
"forwarded_from_message_id": null,
|
"forwarded_from_message_id": null,
|
||||||
"type": "text",
|
"type": "text",
|
||||||
"text": "Hello",
|
"text": "Hello",
|
||||||
|
"delivery_status": "read",
|
||||||
"created_at": "2026-03-08T10:02:00Z",
|
"created_at": "2026-03-08T10:02:00Z",
|
||||||
"updated_at": "2026-03-08T10:02:00Z"
|
"updated_at": "2026-03-08T10:02:00Z"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user