fcm_push_listener/
register.rs1use 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}