fcm_push_listener/
register.rs

1use crate::{fcm, firebase, gcm, Error};
2use serde::Deserialize;
3use serde::Serialize;
4use uuid::Uuid;
5
6#[derive(Clone, Serialize, Deserialize)]
7pub struct Registration {
8    pub fcm_token: String,
9    pub gcm: gcm::Session,
10    pub keys: fcm::WebPushKeys,
11}
12
13pub async fn register(
14    http: &reqwest::Client,
15    firebase_app_id: &str,
16    firebase_project_id: &str,
17    firebase_api_key: &str,
18    vapid_key: Option<&str>,
19) -> Result<Registration, Error> {
20    log::debug!("Checking in to GCM");
21    let gcm_session = gcm::Session::create(http).await?;
22
23    let id = Uuid::new_v4();
24    let gcm_app_id = format!("wp:receiver.push.com#{id}");
25
26    log::debug!("Registering to GCM");
27    let gcm_token = gcm_session.request_token(&gcm_app_id).await?;
28
29    log::debug!("Getting Firebase installation token");
30    let firebase_installation_token = firebase::InstallationAuthToken::request(
31        http,
32        firebase_app_id,
33        firebase_project_id,
34        firebase_api_key,
35    )
36    .await?;
37
38    log::debug!("Calling FCM register");
39    let fcm_register_result = fcm::Registration::request(
40        http,
41        firebase_project_id,
42        firebase_api_key,
43        vapid_key,
44        &firebase_installation_token.value,
45        &gcm_token,
46    )
47    .await?;
48
49    log::debug!("Registration complete");
50
51    Ok(Registration {
52        gcm: gcm_session,
53        fcm_token: fcm_register_result.fcm_token,
54        keys: fcm_register_result.keys,
55    })
56}