systemprompt_analytics/models/
engagement.rs1use 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}