firebae_cm/client/
client.rs

1use reqwest::header::{AUTHORIZATION, CONTENT_LENGTH, CONTENT_TYPE};
2
3use crate::{FcmResponse, Message};
4
5/// A reqwest client wrapper to send Firebase messages.
6pub struct Client {
7    client: reqwest::Client,
8}
9
10impl Default for Client {
11    fn default() -> Self {
12        Self::new()
13    }
14}
15
16impl Client {
17    /// Creates a client
18    pub fn new() -> Self {
19        let client = reqwest::ClientBuilder::new()
20            .use_rustls_tls()
21            .build()
22            .unwrap();
23
24        Self { client }
25    }
26
27    /// Sends the given message and returns the result.
28    /// # Example
29    /// ```
30    /// use firebae_cm::{Client, Message, MessageBody, Receiver};
31    ///
32    /// async fn send_message() {
33    ///   // Setup message
34    ///   let receiver = Receiver::topic("subscribers");
35    ///   let empty_body = MessageBody::new(receiver);
36    ///   let message = Message::new("your_project_id", "your_jwt_token", empty_body);
37    ///
38    ///   // Create client and send message
39    ///   let client = Client::new();
40    ///   let res: Result<String, firebae_cm::Error> = client.send(message).await;
41    /// }
42    /// ```
43    pub async fn send(&self, message: Message) -> crate::Result<String> {
44        let payload = serde_json::to_vec(&message)?;
45
46        let fcm_response = self
47            .client
48            .post(format!(
49                "https://fcm.googleapis.com/v1/projects/{}/messages:send",
50                message.project_id
51            ))
52            .header(CONTENT_TYPE, "application/json; UTF-8")
53            .header(CONTENT_LENGTH, payload.len())
54            .header(AUTHORIZATION, format!("Bearer {}", message.jwt).as_bytes())
55            .json(&message)
56            .send()
57            .await?
58            .json()
59            .await?;
60
61        match fcm_response {
62            FcmResponse::Error(e) => Err(crate::Error::FcmError(e)),
63            FcmResponse::Success(s) => Ok(s),
64        }
65    }
66}