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 .await
{ {
| Ok(mut device) => { | Ok(mut device) => {
let notify = device.display_name != body.display_name;
device.display_name.clone_from(&body.display_name); device.display_name.clone_from(&body.display_name);
device device
.last_seen_ip .last_seen_ip
.clone_from(&Some(client.to_string())); .clone_from(&Some(client.to_string()));
device device
.last_seen_ts .last_seen_ts
.clone_from(&Some(MilliSecondsSinceUnixEpoch::now())); .clone_from(&Some(MilliSecondsSinceUnixEpoch::now()));
assert_eq!(device.device_id, body.device_id, "device_id mismatch");
services services
.users .users
.update_device_metadata(sender_user, &body.device_id, &device) .put_device_metadata(sender_user, notify, &device);
.await?;
Ok(update_device::v3::Response {}) Ok(update_device::v3::Response {})
}, },
@@ -80,6 +83,7 @@ pub(crate) async fn update_device_route(
let Some(appservice) = appservice else { let Some(appservice) = appservice else {
return Err!(Request(NotFound("Device not found."))); return Err!(Request(NotFound("Device not found.")));
}; };
if !appservice.registration.device_management { if !appservice.registration.device_management {
return Err!(Request(NotFound("Device not found."))); 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 notify = true;
let val = Device { self.put_device_metadata(user_id, notify, &Device {
device_id: device_id.into(), device_id: device_id.into(),
display_name: initial_device_display_name, display_name: initial_device_display_name,
last_seen_ip: client_ip, last_seen_ip: client_ip,
last_seen_ts: Some(MilliSecondsSinceUnixEpoch::now()), 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 { if let Some(access_token) = access_token {
self.set_access_token(user_id, device_id, access_token, expires_in, refresh_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 // TODO: Remove onetimekeys
increment(&self.db.userid_devicelistversion, user_id.as_bytes());
let userdeviceid = (user_id, device_id); let userdeviceid = (user_id, device_id);
self.db.userdeviceid_metadata.del(userdeviceid); self.db.userdeviceid_metadata.del(userdeviceid);
self.mark_device_key_update(user_id).await; 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. /// 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)] #[implement(super::Service)]
pub async fn update_device_metadata( pub fn put_device_metadata(&self, user_id: &UserId, notify: bool, device: &Device) {
&self, let key = (user_id, &device.device_id);
user_id: &UserId,
device_id: &DeviceId,
device: &Device,
) -> Result {
increment(&self.db.userid_devicelistversion, user_id.as_bytes());
let key = (user_id, device_id);
self.db self.db
.userdeviceid_metadata .userdeviceid_metadata
.put(key, Json(device)); .put(key, Json(device));
Ok(()) if notify {
increment(&self.db.userid_devicelistversion, user_id.as_bytes());
}
} }
/// Get device metadata. /// Get device metadata.
@@ -394,6 +386,9 @@ pub async fn get_device_metadata(
.qry(&(user_id, device_id)) .qry(&(user_id, device_id))
.await .await
.deserialized() .deserialized()
.inspect(|device: &Device| {
debug_assert_eq!(&device.device_id, device_id, "device_id mismatch");
})
} }
#[implement(super::Service)] #[implement(super::Service)]