diff --git a/ruma-federation-api/CHANGELOG.md b/ruma-federation-api/CHANGELOG.md index 05219e20..71afea7d 100644 --- a/ruma-federation-api/CHANGELOG.md +++ b/ruma-federation-api/CHANGELOG.md @@ -1,5 +1,13 @@ # [unreleased] +Improvements: + +* Add endpoints: + + ``` + device::get_devices::v1, + ``` + # 0.0.3 Breaking Changes: diff --git a/ruma-federation-api/src/device.rs b/ruma-federation-api/src/device.rs new file mode 100644 index 00000000..7e06927b --- /dev/null +++ b/ruma-federation-api/src/device.rs @@ -0,0 +1,2 @@ +//! Endpoints to retrieve information about user devices +pub mod get_devices; diff --git a/ruma-federation-api/src/device/get_devices/mod.rs b/ruma-federation-api/src/device/get_devices/mod.rs new file mode 100644 index 00000000..8a4cfac6 --- /dev/null +++ b/ruma-federation-api/src/device/get_devices/mod.rs @@ -0,0 +1,2 @@ +//! Endpoint to get information about a user's devices +pub mod v1; diff --git a/ruma-federation-api/src/device/get_devices/v1.rs b/ruma-federation-api/src/device/get_devices/v1.rs new file mode 100644 index 00000000..5bdb32b9 --- /dev/null +++ b/ruma-federation-api/src/device/get_devices/v1.rs @@ -0,0 +1,65 @@ +//! [GET /_matrix/federation/v1/user/devices/](https://matrix.org/docs/spec/server_server/r0.1.4#get-matrix-federation-v1-user-devices-userid) + +use js_int::UInt; +use ruma_api::ruma_api; +use ruma_common::encryption::DeviceKeys; +use ruma_identifiers::{DeviceId, UserId}; +use serde::{Deserialize, Serialize}; + +ruma_api! { + metadata: { + description: "Gets information on all of the user's devices.", + name: "get_devices", + method: GET, + path: "/_matrix/federation/v1/user/devices", + rate_limited: false, + requires_authentication: true, + } + + request: { + /// The user ID to retrieve devices for. Must be a user local to the receiving homeserver. + #[ruma_api(query)] + pub user_id: &'a UserId, + } + + response: { + /// The user ID devices were requested for. + pub user_id: UserId, + + /// A unique ID for a given user_id which describes the version of the returned device + /// list. This is matched with the `stream_id` field in `m.device_list_update` EDUs in + /// order to incrementally update the returned device_list. + pub stream_id: UInt, + + /// The user's devices. May be empty. + pub devices: Vec, + } +} + +/// Information about a user's device. +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct UserDevice { + /// The device ID. + pub device_id: Box, + + /// Identity keys for the device. + pub keys: DeviceKeys, + + /// Optional display name for the device + #[serde(skip_serializing_if = "Option::is_none")] + pub device_display_name: Option, +} + +impl<'a> Request<'a> { + /// Creates a new `Request` with the given user id + pub fn new(user_id: &'a UserId) -> Self { + Self { user_id } + } +} + +impl Response { + /// Creates a new `Response` with the given user id, stream id and devices. + pub fn new(user_id: UserId, stream_id: UInt, devices: Vec) -> Self { + Self { user_id, stream_id, devices } + } +} diff --git a/ruma-federation-api/src/lib.rs b/ruma-federation-api/src/lib.rs index 29c17d62..bf036757 100644 --- a/ruma-federation-api/src/lib.rs +++ b/ruma-federation-api/src/lib.rs @@ -5,6 +5,7 @@ mod serde; pub mod authorization; +pub mod device; pub mod directory; pub mod discovery; pub mod membership;