Simplify device metadata update interface.

Add broadcast argument; reorder notify to after write.

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk
2025-11-01 20:03:54 +00:00
parent 084facf474
commit 15627bc8d0
2 changed files with 19 additions and 20 deletions

View File

@@ -61,18 +61,21 @@ pub(crate) async fn update_device_route(
.await
{
| Ok(mut device) => {
let notify = device.display_name != body.display_name;
device.display_name.clone_from(&body.display_name);
device
.last_seen_ip
.clone_from(&Some(client.to_string()));
device
.last_seen_ts
.clone_from(&Some(MilliSecondsSinceUnixEpoch::now()));
assert_eq!(device.device_id, body.device_id, "device_id mismatch");
services
.users
.update_device_metadata(sender_user, &body.device_id, &device)
.await?;
.put_device_metadata(sender_user, notify, &device);
Ok(update_device::v3::Response {})
},
@@ -80,6 +83,7 @@ pub(crate) async fn update_device_route(
let Some(appservice) = appservice else {
return Err!(Request(NotFound("Device not found.")));
};
if !appservice.registration.device_management {
return Err!(Request(NotFound("Device not found.")));
}

View File

@@ -40,16 +40,13 @@ pub async fn create_device(
))));
}
let key = (user_id, device_id);
let val = Device {
let notify = true;
self.put_device_metadata(user_id, notify, &Device {
device_id: device_id.into(),
display_name: initial_device_display_name,
last_seen_ip: client_ip,
last_seen_ts: Some(MilliSecondsSinceUnixEpoch::now()),
};
increment(&self.db.userid_devicelistversion, user_id.as_bytes());
self.db.userdeviceid_metadata.put(key, Json(val));
});
if let Some(access_token) = access_token {
self.set_access_token(user_id, device_id, access_token, expires_in, refresh_token)
@@ -97,11 +94,11 @@ pub async fn remove_device(&self, user_id: &UserId, device_id: &DeviceId) {
// TODO: Remove onetimekeys
increment(&self.db.userid_devicelistversion, user_id.as_bytes());
let userdeviceid = (user_id, device_id);
self.db.userdeviceid_metadata.del(userdeviceid);
self.mark_device_key_update(user_id).await;
increment(&self.db.userid_devicelistversion, user_id.as_bytes());
}
/// Returns an iterator over all device ids of this user.
@@ -366,20 +363,15 @@ pub async fn remove_to_device_events<Until>(
}
#[implement(super::Service)]
pub async fn update_device_metadata(
&self,
user_id: &UserId,
device_id: &DeviceId,
device: &Device,
) -> Result {
increment(&self.db.userid_devicelistversion, user_id.as_bytes());
let key = (user_id, device_id);
pub fn put_device_metadata(&self, user_id: &UserId, notify: bool, device: &Device) {
let key = (user_id, &device.device_id);
self.db
.userdeviceid_metadata
.put(key, Json(device));
Ok(())
if notify {
increment(&self.db.userid_devicelistversion, user_id.as_bytes());
}
}
/// Get device metadata.
@@ -394,6 +386,9 @@ pub async fn get_device_metadata(
.qry(&(user_id, device_id))
.await
.deserialized()
.inspect(|device: &Device| {
debug_assert_eq!(&device.device_id, device_id, "device_id mismatch");
})
}
#[implement(super::Service)]