diff --git a/src/service/account_data/mod.rs b/src/service/account_data/mod.rs index cd43a708..0968a572 100644 --- a/src/service/account_data/mod.rs +++ b/src/service/account_data/mod.rs @@ -14,10 +14,10 @@ use ruma::{ }; use serde::Deserialize; use tuwunel_core::{ - Err, Result, err, implement, + Err, Result, at, err, implement, utils::{ReadyExt, result::LogErr, stream::TryIgnore}, }; -use tuwunel_database::{Deserialized, Handle, Ignore, Json, Map}; +use tuwunel_database::{Deserialized, Handle, Ignore, Interfix, Json, Map}; pub struct Service { services: Arc, @@ -162,3 +162,27 @@ pub fn changes_since<'a>( }) .ignore_err() } + +/// Returns all changes to the account data that happened after `since`. +#[implement(Service)] +pub async fn last_count<'a>( + &'a self, + room_id: Option<&'a RoomId>, + user_id: &'a UserId, + upper: u64, +) -> Result { + type Key<'a> = (Option<&'a RoomId>, &'a UserId, u64, Ignore); + + let key = (room_id, user_id, upper, Interfix); + self.db + .roomuserdataid_accountdata + .rev_keys_from(&key) + .ignore_err() + .ready_take_while(move |(room_id_, user_id_, ..): &Key<'_>| { + room_id == *room_id_ && user_id == *user_id_ + }) + .map(at!(2)) + .next() + .await + .ok_or_else(|| err!(Request(NotFound("No account data found.")))) +}