diff --git a/ruma-federation-api/CHANGELOG.md b/ruma-federation-api/CHANGELOG.md index c8cbed3e..f599c833 100644 --- a/ruma-federation-api/CHANGELOG.md +++ b/ruma-federation-api/CHANGELOG.md @@ -5,6 +5,7 @@ Improvements: * Add endpoints: ``` + backfill::get_backfill::v1, device::get_devices::v1, keys::{ claim_keys::v1, diff --git a/ruma-federation-api/src/backfill.rs b/ruma-federation-api/src/backfill.rs new file mode 100644 index 00000000..35969056 --- /dev/null +++ b/ruma-federation-api/src/backfill.rs @@ -0,0 +1,3 @@ +//! Endpoints to request more history from another homeserver. + +pub mod get_backfill; diff --git a/ruma-federation-api/src/backfill/get_backfill/mod.rs b/ruma-federation-api/src/backfill/get_backfill/mod.rs new file mode 100644 index 00000000..540d0c19 --- /dev/null +++ b/ruma-federation-api/src/backfill/get_backfill/mod.rs @@ -0,0 +1,3 @@ +//! Endpoint to request more history from another homeserver. + +pub mod v1; diff --git a/ruma-federation-api/src/backfill/get_backfill/v1.rs b/ruma-federation-api/src/backfill/get_backfill/v1.rs new file mode 100644 index 00000000..c871e0ab --- /dev/null +++ b/ruma-federation-api/src/backfill/get_backfill/v1.rs @@ -0,0 +1,65 @@ +//! [GET /_matrix/federation/v1/backfill/{roomId}](https://matrix.org/docs/spec/server_server/r0.1.4#get-matrix-federation-v1-backfill-roomid) + +use std::time::SystemTime; + +use js_int::UInt; +use ruma_api::ruma_api; +use ruma_events::pdu::Pdu; +use ruma_identifiers::{EventId, RoomId}; + +ruma_api! { + metadata: { + description: "Request more history from another homeserver", + name: "get_backfill", + method: GET, + path: "/_matrix/federation/v1/backfill/:room_id", + rate_limited: false, + requires_authentication: true, + } + + request: { + /// The room ID to backfill. + #[ruma_api(path)] + pub room_id: &'a RoomId, + + /// The event IDs to backfill from. + #[ruma_api(query)] + pub v: &'a [EventId], + + /// The maximum number of PDUs to retrieve, including the given events. + #[ruma_api(query)] + pub limit: UInt, + } + + response: { + /// The `server_name` of the homeserver sending this transaction. + pub origin: String, + + /// POSIX timestamp in milliseconds on originating homeserver when this transaction started. + #[serde(with = "ruma_serde::time::ms_since_unix_epoch")] + pub origin_server_ts: SystemTime, + + /// List of persistent updates to rooms. + pub pdus: Vec, + } +} + +impl<'a> Request<'a> { + /// Creates a new `Request` with: + /// * the given room id. + /// * the event IDs to backfill from. + /// * the maximum number of PDUs to retrieve, including the given events. + pub fn new(room_id: &'a RoomId, v: &'a [EventId], limit: UInt) -> Self { + Self { room_id, v, limit } + } +} + +impl Response { + /// Creates a new `Response` with: + /// * the `server_name` of the homeserver. + /// * the timestamp in milliseconds of when this transaction started. + /// * the list of persistent updates to rooms. + pub fn new(origin: String, origin_server_ts: SystemTime, pdus: Vec) -> Self { + Self { origin, origin_server_ts, pdus } + } +} diff --git a/ruma-federation-api/src/lib.rs b/ruma-federation-api/src/lib.rs index 243b36d8..54c82b45 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 backfill; pub mod device; pub mod directory; pub mod discovery;