diff --git a/ruma-federation-api/CHANGELOG.md b/ruma-federation-api/CHANGELOG.md index 8e996ccf..aeb00caa 100644 --- a/ruma-federation-api/CHANGELOG.md +++ b/ruma-federation-api/CHANGELOG.md @@ -13,6 +13,7 @@ Improvements: backfill::get_backfill::v1, device::get_devices::v1, directory::get_public_rooms_filtered::v1, + event::get_missing_events::v1, keys::{ claim_keys::v1, query_keys::v1, diff --git a/ruma-federation-api/src/event.rs b/ruma-federation-api/src/event.rs new file mode 100644 index 00000000..9dad2955 --- /dev/null +++ b/ruma-federation-api/src/event.rs @@ -0,0 +1,3 @@ +//! Endpoints to get general information about events + +pub mod get_missing_events; diff --git a/ruma-federation-api/src/event/get_missing_events.rs b/ruma-federation-api/src/event/get_missing_events.rs new file mode 100644 index 00000000..8e276abb --- /dev/null +++ b/ruma-federation-api/src/event/get_missing_events.rs @@ -0,0 +1,3 @@ +//! Retrieves previous events that the sender is missing. + +pub mod v1; diff --git a/ruma-federation-api/src/event/get_missing_events/v1.rs b/ruma-federation-api/src/event/get_missing_events/v1.rs new file mode 100644 index 00000000..8cb29be1 --- /dev/null +++ b/ruma-federation-api/src/event/get_missing_events/v1.rs @@ -0,0 +1,75 @@ +//! [POST /_matrix/federation/v1/get_missing_events/{roomId}](https://matrix.org/docs/spec/server_server/r0.1.4#post-matrix-federation-v1-get-missing-events-roomid) + +use js_int::{uint, UInt}; +use ruma_api::ruma_api; +use ruma_events::pdu::Pdu; +use ruma_identifiers::{EventId, RoomId}; + +ruma_api! { + metadata: { + description: "Retrieves previous events that the sender is missing.", + method: POST, + name: "get_missing_events", + path: "/_matrix/federation/v1/get_missing_events/:room_id", + rate_limited: false, + requires_authentication: true, + } + + #[non_exhaustive] + request: { + /// The room ID to search in. + #[ruma_api(path)] + room_id: &'a RoomId, + + /// The maximum number of events to retrieve. Defaults to 10. + #[serde(default = "default_limit", skip_serializing_if = "is_default_limit")] + limit: UInt, + + /// The minimum depth of events to retrieve. Defaults to 0. + #[serde(default, skip_serializing_if = "ruma_serde::is_default")] + min_depth: UInt, + + /// The latest event IDs that the sender already has. These are skipped when retrieving the previous events of `latest_events`. + earliest_events: &'a [EventId], + + /// The event IDs to retrieve the previous events for. + latest_events: &'a [EventId], + } + + response: { + /// The missing events. + events: Vec + } +} + +impl<'a> Request<'a> { + /// Creates a new `Request` for events in the given room with the given constraints. + pub fn new( + room_id: &'a RoomId, + earliest_events: &'a [EventId], + latest_events: &'a [EventId], + ) -> Self { + Self { + room_id, + limit: default_limit(), + min_depth: UInt::default(), + earliest_events, + latest_events, + } + } +} + +impl Response { + /// Creates a new `Response` with the given events. + pub fn new(events: Vec) -> Self { + Self { events } + } +} + +fn default_limit() -> UInt { + uint!(10) +} + +fn is_default_limit(val: &UInt) -> bool { + *val == default_limit() +} diff --git a/ruma-federation-api/src/lib.rs b/ruma-federation-api/src/lib.rs index 54c82b45..c46eee6a 100644 --- a/ruma-federation-api/src/lib.rs +++ b/ruma-federation-api/src/lib.rs @@ -9,6 +9,7 @@ pub mod backfill; pub mod device; pub mod directory; pub mod discovery; +pub mod event; pub mod keys; pub mod membership; pub mod openid;