summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTimo Kösters <timo@koesters.xyz>2022-10-30 20:36:14 +0100
committerTimo Kösters <timo@koesters.xyz>2022-10-30 20:41:32 +0100
commit02dd3d32f2ea7a40fe76402f321009f16579fd6b (patch)
tree4285219b2172159a99fa302044197abf5ef25960 /src
parente86fb115120a9d7bebe76727cc9fca8b8530fd9d (diff)
downloadconduit-02dd3d32f2ea7a40fe76402f321009f16579fd6b.zip
fix: element android did not reset notification counts
Diffstat (limited to 'src')
-rw-r--r--src/api/client_server/account.rs4
-rw-r--r--src/api/client_server/directory.rs11
-rw-r--r--src/api/client_server/sync.rs5
-rw-r--r--src/database/key_value/rooms/user.rs25
-rw-r--r--src/database/mod.rs2
-rw-r--r--src/service/rooms/user/data.rs3
-rw-r--r--src/service/rooms/user/mod.rs4
7 files changed, 40 insertions, 14 deletions
diff --git a/src/api/client_server/account.rs b/src/api/client_server/account.rs
index c9e3c9b..309a361 100644
--- a/src/api/client_server/account.rs
+++ b/src/api/client_server/account.rs
@@ -4,8 +4,8 @@ use ruma::{
api::client::{
account::{
change_password, deactivate, get_3pids, get_username_availability, register,
- request_3pid_management_token_via_email, request_3pid_management_token_via_msisdn, whoami,
- ThirdPartyIdRemovalStatus,
+ request_3pid_management_token_via_email, request_3pid_management_token_via_msisdn,
+ whoami, ThirdPartyIdRemovalStatus,
},
error::ErrorKind,
uiaa::{AuthFlow, AuthType, UiaaInfo},
diff --git a/src/api/client_server/directory.rs b/src/api/client_server/directory.rs
index a7381d8..f07a225 100644
--- a/src/api/client_server/directory.rs
+++ b/src/api/client_server/directory.rs
@@ -87,10 +87,7 @@ pub async fn set_room_visibility_route(
if !services().rooms.metadata.exists(&body.room_id)? {
// Return 404 if the room doesn't exist
- return Err(Error::BadRequest(
- ErrorKind::NotFound,
- "Room not found",
- ));
+ return Err(Error::BadRequest(ErrorKind::NotFound, "Room not found"));
}
match &body.visibility {
@@ -116,13 +113,9 @@ pub async fn set_room_visibility_route(
pub async fn get_room_visibility_route(
body: Ruma<get_room_visibility::v3::IncomingRequest>,
) -> Result<get_room_visibility::v3::Response> {
-
if !services().rooms.metadata.exists(&body.room_id)? {
// Return 404 if the room doesn't exist
- return Err(Error::BadRequest(
- ErrorKind::NotFound,
- "Room not found",
- ));
+ return Err(Error::BadRequest(ErrorKind::NotFound, "Room not found"));
}
Ok(get_room_visibility::v3::Response {
diff --git a/src/api/client_server/sync.rs b/src/api/client_server/sync.rs
index 828ae19..56f918a 100644
--- a/src/api/client_server/sync.rs
+++ b/src/api/client_server/sync.rs
@@ -282,9 +282,8 @@ async fn sync_helper(
let send_notification_counts = !timeline_pdus.is_empty()
|| services()
.rooms
- .edus
- .read_receipt
- .last_privateread_update(&sender_user, &room_id)?
+ .user
+ .last_notification_read(&sender_user, &room_id)?
> since;
let mut timeline_users = HashSet::new();
diff --git a/src/database/key_value/rooms/user.rs b/src/database/key_value/rooms/user.rs
index 3d8d1c8..4c43572 100644
--- a/src/database/key_value/rooms/user.rs
+++ b/src/database/key_value/rooms/user.rs
@@ -7,12 +7,20 @@ impl service::rooms::user::Data for KeyValueDatabase {
let mut userroom_id = user_id.as_bytes().to_vec();
userroom_id.push(0xff);
userroom_id.extend_from_slice(room_id.as_bytes());
+ let mut roomuser_id = room_id.as_bytes().to_vec();
+ roomuser_id.push(0xff);
+ roomuser_id.extend_from_slice(user_id.as_bytes());
self.userroomid_notificationcount
.insert(&userroom_id, &0_u64.to_be_bytes())?;
self.userroomid_highlightcount
.insert(&userroom_id, &0_u64.to_be_bytes())?;
+ self.roomuserid_lastnotificationread.insert(
+ &roomuser_id,
+ &services().globals.next_count()?.to_be_bytes(),
+ )?;
+
Ok(())
}
@@ -44,6 +52,23 @@ impl service::rooms::user::Data for KeyValueDatabase {
.unwrap_or(Ok(0))
}
+ fn last_notification_read(&self, user_id: &UserId, room_id: &RoomId) -> Result<u64> {
+ let mut key = room_id.as_bytes().to_vec();
+ key.push(0xff);
+ key.extend_from_slice(user_id.as_bytes());
+
+ Ok(self
+ .roomuserid_lastnotificationread
+ .get(&key)?
+ .map(|bytes| {
+ utils::u64_from_bytes(&bytes).map_err(|_| {
+ Error::bad_database("Count in roomuserid_lastprivatereadupdate is invalid.")
+ })
+ })
+ .transpose()?
+ .unwrap_or(0))
+ }
+
fn associate_token_shortstatehash(
&self,
room_id: &RoomId,
diff --git a/src/database/mod.rs b/src/database/mod.rs
index 15ee137..3746efe 100644
--- a/src/database/mod.rs
+++ b/src/database/mod.rs
@@ -98,6 +98,7 @@ pub struct KeyValueDatabase {
pub(super) userroomid_notificationcount: Arc<dyn KvTree>, // NotifyCount = u64
pub(super) userroomid_highlightcount: Arc<dyn KvTree>, // HightlightCount = u64
+ pub(super) roomuserid_lastnotificationread: Arc<dyn KvTree>, // LastNotificationRead = u64
/// Remember the current state hash of a room.
pub(super) roomid_shortstatehash: Arc<dyn KvTree>,
@@ -317,6 +318,7 @@ impl KeyValueDatabase {
userroomid_notificationcount: builder.open_tree("userroomid_notificationcount")?,
userroomid_highlightcount: builder.open_tree("userroomid_highlightcount")?,
+ roomuserid_lastnotificationread: builder.open_tree("userroomid_highlightcount")?,
statekey_shortstatekey: builder.open_tree("statekey_shortstatekey")?,
shortstatekey_statekey: builder.open_tree("shortstatekey_statekey")?,
diff --git a/src/service/rooms/user/data.rs b/src/service/rooms/user/data.rs
index 43c4c92..4b8a4ec 100644
--- a/src/service/rooms/user/data.rs
+++ b/src/service/rooms/user/data.rs
@@ -8,6 +8,9 @@ pub trait Data: Send + Sync {
fn highlight_count(&self, user_id: &UserId, room_id: &RoomId) -> Result<u64>;
+ // Returns the count at which the last reset_notification_counts was called
+ fn last_notification_read(&self, user_id: &UserId, room_id: &RoomId) -> Result<u64>;
+
fn associate_token_shortstatehash(
&self,
room_id: &RoomId,
diff --git a/src/service/rooms/user/mod.rs b/src/service/rooms/user/mod.rs
index a765cfd..2266d97 100644
--- a/src/service/rooms/user/mod.rs
+++ b/src/service/rooms/user/mod.rs
@@ -22,6 +22,10 @@ impl Service {
self.db.highlight_count(user_id, room_id)
}
+ pub fn last_notification_read(&self, user_id: &UserId, room_id: &RoomId) -> Result<u64> {
+ self.db.last_notification_read(user_id, room_id)
+ }
+
pub fn associate_token_shortstatehash(
&self,
room_id: &RoomId,