atagen

matrix-rust-sdk

public
Star0
Watch0
ssh://brewery@pls.lobotomise.me:33/atagen/matrix-rust-sdk.git

Blame: crates/matrix-sdk/src/pusher.rs

7ff8adafe9e4atagen2026-10-22 12:30 UTC1
// Copyright 2024 The Matrix.org Foundation C.I.C.
7ff8adafe9e4atagen2026-10-22 12:30 UTC2
// Copyright 2024 Hanadi Tamimi
7ff8adafe9e4atagen2026-10-22 12:30 UTC3
//
7ff8adafe9e4atagen2026-10-22 12:30 UTC4
// Licensed under the Apache License, Version 2.0 (the "License");
7ff8adafe9e4atagen2026-10-22 12:30 UTC5
// you may not use this file except in compliance with the License.
7ff8adafe9e4atagen2026-10-22 12:30 UTC6
// You may obtain a copy of the License at
7ff8adafe9e4atagen2026-10-22 12:30 UTC7
//
7ff8adafe9e4atagen2026-10-22 12:30 UTC8
//     http://www.apache.org/licenses/LICENSE-2.0
7ff8adafe9e4atagen2026-10-22 12:30 UTC9
//
7ff8adafe9e4atagen2026-10-22 12:30 UTC10
// Unless required by applicable law or agreed to in writing, software
7ff8adafe9e4atagen2026-10-22 12:30 UTC11
// distributed under the License is distributed on an "AS IS" BASIS,
7ff8adafe9e4atagen2026-10-22 12:30 UTC12
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
7ff8adafe9e4atagen2026-10-22 12:30 UTC13
// See the License for the specific language governing permissions and
7ff8adafe9e4atagen2026-10-22 12:30 UTC14
// limitations under the License.
7ff8adafe9e4atagen2026-10-22 12:30 UTC15
7ff8adafe9e4atagen2026-10-22 12:30 UTC16
//! High-level pusher API.
7ff8adafe9e4atagen2026-10-22 12:30 UTC17
7ff8adafe9e4atagen2026-10-22 12:30 UTC18
use ruma::api::client::push::{PusherIds, set_pusher};
7ff8adafe9e4atagen2026-10-22 12:30 UTC19
7ff8adafe9e4atagen2026-10-22 12:30 UTC20
use crate::{Client, Result};
7ff8adafe9e4atagen2026-10-22 12:30 UTC21
7ff8adafe9e4atagen2026-10-22 12:30 UTC22
/// A high-level API to interact with the pusher API.
7ff8adafe9e4atagen2026-10-22 12:30 UTC23
///
7ff8adafe9e4atagen2026-10-22 12:30 UTC24
/// All the methods in this struct send a request to the homeserver.
7ff8adafe9e4atagen2026-10-22 12:30 UTC25
#[derive(Debug, Clone)]
7ff8adafe9e4atagen2026-10-22 12:30 UTC26
pub struct Pusher {
7ff8adafe9e4atagen2026-10-22 12:30 UTC27
    /// The underlying HTTP client.
7ff8adafe9e4atagen2026-10-22 12:30 UTC28
    client: Client,
7ff8adafe9e4atagen2026-10-22 12:30 UTC29
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC30
7ff8adafe9e4atagen2026-10-22 12:30 UTC31
impl Pusher {
7ff8adafe9e4atagen2026-10-22 12:30 UTC32
    pub(crate) fn new(client: Client) -> Self {
7ff8adafe9e4atagen2026-10-22 12:30 UTC33
        Self { client }
7ff8adafe9e4atagen2026-10-22 12:30 UTC34
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC35
7ff8adafe9e4atagen2026-10-22 12:30 UTC36
    /// Sets a given pusher.
7ff8adafe9e4atagen2026-10-22 12:30 UTC37
    pub async fn set(&self, pusher: ruma::api::client::push::Pusher, append: bool) -> Result<()> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC38
        let mut request = set_pusher::v3::Request::post(pusher);
7ff8adafe9e4atagen2026-10-22 12:30 UTC39
        if let set_pusher::v3::PusherAction::Post(data) = &mut request.action {
7ff8adafe9e4atagen2026-10-22 12:30 UTC40
            data.append = append;
7ff8adafe9e4atagen2026-10-22 12:30 UTC41
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC42
        self.client.send(request).await?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC43
        Ok(())
7ff8adafe9e4atagen2026-10-22 12:30 UTC44
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC45
7ff8adafe9e4atagen2026-10-22 12:30 UTC46
    /// Deletes a pusher by its ids
7ff8adafe9e4atagen2026-10-22 12:30 UTC47
    pub async fn delete(&self, pusher_ids: PusherIds) -> Result<()> {
7ff8adafe9e4atagen2026-10-22 12:30 UTC48
        let request = set_pusher::v3::Request::delete(pusher_ids);
7ff8adafe9e4atagen2026-10-22 12:30 UTC49
        self.client.send(request).await?;
7ff8adafe9e4atagen2026-10-22 12:30 UTC50
        Ok(())
7ff8adafe9e4atagen2026-10-22 12:30 UTC51
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC52
}
7ff8adafe9e4atagen2026-10-22 12:30 UTC53
7ff8adafe9e4atagen2026-10-22 12:30 UTC54
// The http mocking library is not supported for wasm32
7ff8adafe9e4atagen2026-10-22 12:30 UTC55
#[cfg(all(test, not(target_family = "wasm")))]
7ff8adafe9e4atagen2026-10-22 12:30 UTC56
mod tests {
7ff8adafe9e4atagen2026-10-22 12:30 UTC57
    use matrix_sdk_test::{async_test, test_json};
7ff8adafe9e4atagen2026-10-22 12:30 UTC58
    use ruma::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC59
        api::client::push::{PusherIds, PusherInit, PusherKind},
7ff8adafe9e4atagen2026-10-22 12:30 UTC60
        push::HttpPusherData,
7ff8adafe9e4atagen2026-10-22 12:30 UTC61
    };
7ff8adafe9e4atagen2026-10-22 12:30 UTC62
    use serde_json::json;
7ff8adafe9e4atagen2026-10-22 12:30 UTC63
    use wiremock::{
7ff8adafe9e4atagen2026-10-22 12:30 UTC64
        Mock, MockServer, ResponseTemplate,
7ff8adafe9e4atagen2026-10-22 12:30 UTC65
        matchers::{body_partial_json, method, path},
7ff8adafe9e4atagen2026-10-22 12:30 UTC66
    };
7ff8adafe9e4atagen2026-10-22 12:30 UTC67
7ff8adafe9e4atagen2026-10-22 12:30 UTC68
    use crate::test_utils::logged_in_client;
7ff8adafe9e4atagen2026-10-22 12:30 UTC69
7ff8adafe9e4atagen2026-10-22 12:30 UTC70
    async fn mock_api(server: MockServer) {
7ff8adafe9e4atagen2026-10-22 12:30 UTC71
        Mock::given(method("POST"))
7ff8adafe9e4atagen2026-10-22 12:30 UTC72
            .and(path("_matrix/client/r0/pushers/set"))
7ff8adafe9e4atagen2026-10-22 12:30 UTC73
            .respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::EMPTY))
7ff8adafe9e4atagen2026-10-22 12:30 UTC74
            .mount(&server)
7ff8adafe9e4atagen2026-10-22 12:30 UTC75
            .await;
7ff8adafe9e4atagen2026-10-22 12:30 UTC76
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC77
7ff8adafe9e4atagen2026-10-22 12:30 UTC78
    fn dummy_pusher() -> PusherInit {
7ff8adafe9e4atagen2026-10-22 12:30 UTC79
        PusherInit {
7ff8adafe9e4atagen2026-10-22 12:30 UTC80
            ids: PusherIds::new("pushKey".to_owned(), "app_id".to_owned()),
7ff8adafe9e4atagen2026-10-22 12:30 UTC81
            app_display_name: "name".to_owned(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC82
            kind: PusherKind::Http(HttpPusherData::new("dummy".to_owned())),
7ff8adafe9e4atagen2026-10-22 12:30 UTC83
            lang: "EN".to_owned(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC84
            device_display_name: "name".to_owned(),
7ff8adafe9e4atagen2026-10-22 12:30 UTC85
            profile_tag: None,
7ff8adafe9e4atagen2026-10-22 12:30 UTC86
        }
7ff8adafe9e4atagen2026-10-22 12:30 UTC87
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC88
7ff8adafe9e4atagen2026-10-22 12:30 UTC89
    #[async_test]
7ff8adafe9e4atagen2026-10-22 12:30 UTC90
    async fn test_set_pusher() {
7ff8adafe9e4atagen2026-10-22 12:30 UTC91
        let server = MockServer::start().await;
7ff8adafe9e4atagen2026-10-22 12:30 UTC92
        let client = logged_in_client(Some(server.uri())).await;
7ff8adafe9e4atagen2026-10-22 12:30 UTC93
        mock_api(server).await;
7ff8adafe9e4atagen2026-10-22 12:30 UTC94
7ff8adafe9e4atagen2026-10-22 12:30 UTC95
        let response = client.pusher().set(dummy_pusher().into(), false).await;
7ff8adafe9e4atagen2026-10-22 12:30 UTC96
7ff8adafe9e4atagen2026-10-22 12:30 UTC97
        assert!(response.is_ok());
7ff8adafe9e4atagen2026-10-22 12:30 UTC98
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC99
7ff8adafe9e4atagen2026-10-22 12:30 UTC100
    #[async_test]
7ff8adafe9e4atagen2026-10-22 12:30 UTC101
    async fn test_set_pusher_forwards_append_flag() {
7ff8adafe9e4atagen2026-10-22 12:30 UTC102
        let server = MockServer::start().await;
7ff8adafe9e4atagen2026-10-22 12:30 UTC103
        let client = logged_in_client(Some(server.uri())).await;
7ff8adafe9e4atagen2026-10-22 12:30 UTC104
7ff8adafe9e4atagen2026-10-22 12:30 UTC105
        Mock::given(method("POST"))
7ff8adafe9e4atagen2026-10-22 12:30 UTC106
            .and(path("_matrix/client/r0/pushers/set"))
7ff8adafe9e4atagen2026-10-22 12:30 UTC107
            .and(body_partial_json(json!({ "append": true })))
7ff8adafe9e4atagen2026-10-22 12:30 UTC108
            .respond_with(ResponseTemplate::new(200).set_body_json(&*test_json::EMPTY))
7ff8adafe9e4atagen2026-10-22 12:30 UTC109
            .expect(1)
7ff8adafe9e4atagen2026-10-22 12:30 UTC110
            .mount(&server)
7ff8adafe9e4atagen2026-10-22 12:30 UTC111
            .await;
7ff8adafe9e4atagen2026-10-22 12:30 UTC112
7ff8adafe9e4atagen2026-10-22 12:30 UTC113
        let response = client.pusher().set(dummy_pusher().into(), true).await;
7ff8adafe9e4atagen2026-10-22 12:30 UTC114
7ff8adafe9e4atagen2026-10-22 12:30 UTC115
        assert!(response.is_ok());
7ff8adafe9e4atagen2026-10-22 12:30 UTC116
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC117
7ff8adafe9e4atagen2026-10-22 12:30 UTC118
    #[async_test]
7ff8adafe9e4atagen2026-10-22 12:30 UTC119
    async fn test_delete_pusher() {
7ff8adafe9e4atagen2026-10-22 12:30 UTC120
        let server = MockServer::start().await;
7ff8adafe9e4atagen2026-10-22 12:30 UTC121
        let client = logged_in_client(Some(server.uri())).await;
7ff8adafe9e4atagen2026-10-22 12:30 UTC122
        mock_api(server).await;
7ff8adafe9e4atagen2026-10-22 12:30 UTC123
7ff8adafe9e4atagen2026-10-22 12:30 UTC124
        // prepare pusher ids
7ff8adafe9e4atagen2026-10-22 12:30 UTC125
        let pusher_ids = PusherIds::new("pushKey".to_owned(), "app_id".to_owned());
7ff8adafe9e4atagen2026-10-22 12:30 UTC126
7ff8adafe9e4atagen2026-10-22 12:30 UTC127
        let response = client.pusher().delete(pusher_ids).await;
7ff8adafe9e4atagen2026-10-22 12:30 UTC128
7ff8adafe9e4atagen2026-10-22 12:30 UTC129
        assert!(response.is_ok());
7ff8adafe9e4atagen2026-10-22 12:30 UTC130
    }
7ff8adafe9e4atagen2026-10-22 12:30 UTC131
}