Skip to main content

systemprompt_analytics/models/
engagement.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use sqlx::FromRow;
4use systemprompt_identifiers::{ContentId, EngagementEventId, SessionId, UserId};
5
6#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
7pub struct EngagementEvent {
8    pub id: EngagementEventId,
9    pub session_id: SessionId,
10    pub user_id: UserId,
11    pub page_url: String,
12    pub content_id: Option<ContentId>,
13    pub time_on_page_ms: i32,
14    pub time_to_first_interaction_ms: Option<i32>,
15    pub time_to_first_scroll_ms: Option<i32>,
16    pub max_scroll_depth: i32,
17    pub scroll_velocity_avg: Option<f32>,
18    pub scroll_direction_changes: Option<i32>,
19    pub click_count: i32,
20    pub mouse_move_distance_px: Option<i32>,
21    pub keyboard_events: Option<i32>,
22    pub copy_events: Option<i32>,
23    pub focus_time_ms: i32,
24    pub blur_count: i32,
25    pub tab_switches: i32,
26    pub visible_time_ms: i32,
27    pub hidden_time_ms: i32,
28    pub is_rage_click: Option<bool>,
29    pub is_dead_click: Option<bool>,
30    pub reading_pattern: Option<String>,
31    pub created_at: DateTime<Utc>,
32    pub updated_at: DateTime<Utc>,
33}
34
35#[derive(Debug, Clone, Deserialize, Default)]
36#[serde(default)]
37pub struct CreateEngagementEventInput {
38    #[serde(default)]
39    pub page_url: String,
40    #[serde(default)]
41    pub time_on_page_ms: i32,
42    #[serde(default)]
43    pub max_scroll_depth: i32,
44    #[serde(default)]
45    pub click_count: i32,
46    #[serde(flatten)]
47    pub optional_metrics: EngagementOptionalMetrics,
48}
49
50#[derive(Debug, Clone, Default, Deserialize)]
51pub struct EngagementOptionalMetrics {
52    pub time_to_first_interaction_ms: Option<i32>,
53    pub time_to_first_scroll_ms: Option<i32>,
54    pub scroll_velocity_avg: Option<f32>,
55    pub scroll_direction_changes: Option<i32>,
56    pub mouse_move_distance_px: Option<i32>,
57    pub keyboard_events: Option<i32>,
58    pub copy_events: Option<i32>,
59    pub focus_time_ms: Option<i32>,
60    pub blur_count: Option<i32>,
61    pub tab_switches: Option<i32>,
62    pub visible_time_ms: Option<i32>,
63    pub hidden_time_ms: Option<i32>,
64    pub is_rage_click: Option<bool>,
65    pub is_dead_click: Option<bool>,
66    pub reading_pattern: Option<String>,
67}