Add query to get last read receipt for room.

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk
2025-10-10 05:52:03 +00:00
parent 9e00f70197
commit 4918868632
2 changed files with 34 additions and 1 deletions

View File

@@ -7,7 +7,7 @@ use ruma::{
serde::Raw,
};
use tuwunel_core::{
Result, trace,
Result, err, is_equal_to, trace,
utils::{ReadyExt, stream::TryIgnore},
};
use tuwunel_database::{Deserialized, Interfix, Json, Map};
@@ -84,6 +84,28 @@ impl Data {
.ignore_err()
}
#[inline]
pub(super) async fn last_receipt_count<'a>(
&'a self,
room_id: &'a RoomId,
since: Option<u64>,
user_id: Option<&'a UserId>,
) -> Result<u64> {
type Key<'a> = (&'a RoomId, u64, &'a UserId);
let key = (room_id, u64::MAX);
self.readreceiptid_readreceipt
.rev_keys_prefix(&key)
.ignore_err()
.ready_take_while(|(_, c, _): &Key<'_>| since.is_none_or(|since| since.gt(&c)))
.ready_filter(|(_, _, u): &Key<'_>| user_id.as_ref().is_none_or(is_equal_to!(u)))
.map(|(_, c, _): Key<'_>| c)
.boxed()
.next()
.await
.ok_or_else(|| err!(Request(NotFound("No receipts found in room"))))
}
#[inline]
pub(super) fn private_read_set(&self, room_id: &RoomId, user_id: &UserId, pdu_count: u64) {
let key = (room_id, user_id);

View File

@@ -146,6 +146,17 @@ impl Service {
.await
}
pub async fn last_receipt_count(
&self,
room_id: &RoomId,
user_id: Option<&UserId>,
since: Option<u64>,
) -> Result<u64> {
self.db
.last_receipt_count(room_id, since, user_id)
.await
}
pub async fn delete_all_read_receipts(&self, room_id: &RoomId) -> Result {
self.db.delete_all_read_receipts(room_id).await
}