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}