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:
@@ -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.")));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)]
|
||||||
|
|||||||
Reference in New Issue
Block a user