Skip to main content

gsm_telemetry/
auth.rs

1use crate::{MessageContext, TelemetryLabels, record_counter};
2use url::Url;
3
4const AUTH_CARD_RENDERED_COUNTER: &str = "auth_card_rendered";
5const AUTH_CARD_CLICKED_COUNTER: &str = "auth_card_clicked";
6
7#[derive(Debug, Clone, Copy)]
8pub enum AuthRenderMode {
9    Pending,
10    Native,
11    Downgrade,
12}
13
14impl AuthRenderMode {
15    pub fn as_str(&self) -> &'static str {
16        match self {
17            AuthRenderMode::Pending => "pending",
18            AuthRenderMode::Native => "native",
19            AuthRenderMode::Downgrade => "downgrade",
20        }
21    }
22}
23
24pub fn record_auth_card_render(
25    ctx: &MessageContext,
26    provider: &str,
27    mode: AuthRenderMode,
28    connection_name: Option<&str>,
29    start_url: Option<&str>,
30    team: Option<&str>,
31) {
32    record_auth_card_render_with_labels(
33        &ctx.labels,
34        provider,
35        mode,
36        connection_name,
37        start_url,
38        team,
39    );
40}
41
42pub fn record_auth_card_render_with_labels(
43    labels: &TelemetryLabels,
44    provider: &str,
45    mode: AuthRenderMode,
46    connection_name: Option<&str>,
47    start_url: Option<&str>,
48    team: Option<&str>,
49) {
50    let mut enriched = labels.clone();
51    enriched
52        .extra
53        .push(("event".into(), "auth.card.rendered".into()));
54    enriched
55        .extra
56        .push(("provider".into(), provider.to_string()));
57    enriched
58        .extra
59        .push(("mode".into(), mode.as_str().to_string()));
60    if let Some(team) = team {
61        enriched.extra.push(("team".into(), team.to_string()));
62    }
63    if let Some(connection) = connection_name.filter(|value| !value.is_empty()) {
64        enriched
65            .extra
66            .push(("connection_name".into(), connection.to_string()));
67    }
68    if let Some(url) = start_url
69        && let Some(domain) = start_url_domain(url)
70    {
71        enriched.extra.push(("start_url_domain".into(), domain));
72    }
73    record_counter(AUTH_CARD_RENDERED_COUNTER, 1, &enriched);
74}
75
76fn start_url_domain(raw: &str) -> Option<String> {
77    Url::parse(raw)
78        .ok()
79        .and_then(|parsed| parsed.host_str().map(|host| host.to_string()))
80}
81
82pub fn record_auth_card_clicked(
83    ctx: &MessageContext,
84    provider: &str,
85    platform: &str,
86    message_id: Option<&str>,
87    team: Option<&str>,
88) {
89    let mut labels = ctx.labels.clone();
90    labels
91        .extra
92        .push(("event".into(), "auth.card.clicked".into()));
93    labels.extra.push(("provider".into(), provider.to_string()));
94    labels.platform = Some(platform.to_string());
95    if let Some(message_id) = message_id {
96        labels
97            .extra
98            .push(("message_id".into(), message_id.to_string()));
99    }
100    if let Some(team) = team {
101        labels.extra.push(("team".into(), team.to_string()));
102    }
103    record_counter(AUTH_CARD_CLICKED_COUNTER, 1, &labels);
104}