Skip to main content

systemprompt_users/
extension.rs

1use systemprompt_extension::prelude::*;
2
3const MIGRATION_001_UTM_CONTENT_TERM: &str = r"
4ALTER TABLE user_sessions ADD COLUMN IF NOT EXISTS utm_source VARCHAR(100);
5ALTER TABLE user_sessions ADD COLUMN IF NOT EXISTS utm_medium VARCHAR(100);
6ALTER TABLE user_sessions ADD COLUMN IF NOT EXISTS utm_campaign VARCHAR(100);
7ALTER TABLE user_sessions ADD COLUMN IF NOT EXISTS utm_content VARCHAR(100);
8ALTER TABLE user_sessions ADD COLUMN IF NOT EXISTS utm_term VARCHAR(100);
9";
10
11#[derive(Debug, Clone, Copy, Default)]
12pub struct UsersExtension;
13
14impl Extension for UsersExtension {
15    fn metadata(&self) -> ExtensionMetadata {
16        ExtensionMetadata {
17            id: "users",
18            name: "Users",
19            version: env!("CARGO_PKG_VERSION"),
20        }
21    }
22
23    fn migration_weight(&self) -> u32 {
24        10
25    }
26
27    fn is_required(&self) -> bool {
28        true
29    }
30
31    fn schemas(&self) -> Vec<SchemaDefinition> {
32        vec![
33            SchemaDefinition::inline("users", include_str!("../schema/users.sql"))
34                .with_required_columns(vec![
35                    "id".into(),
36                    "name".into(),
37                    "email".into(),
38                    "created_at".into(),
39                ]),
40            SchemaDefinition::inline("user_sessions", include_str!("../schema/user_sessions.sql"))
41                .with_required_columns(vec!["session_id".into(), "started_at".into()]),
42            SchemaDefinition::inline("banned_ips", include_str!("../schema/banned_ips.sql"))
43                .with_required_columns(vec![
44                    "ip_address".into(),
45                    "reason".into(),
46                    "banned_at".into(),
47                ]),
48            SchemaDefinition::inline(
49                "session_analytics_views",
50                include_str!("../schema/session_analytics_views.sql"),
51            ),
52            SchemaDefinition::inline(
53                "referrer_analytics_views",
54                include_str!("../schema/referrer_analytics_views.sql"),
55            ),
56            SchemaDefinition::inline(
57                "bot_analytics_views",
58                include_str!("../schema/bot_analytics_views.sql"),
59            ),
60            SchemaDefinition::inline("user_api_keys", include_str!("../schema/user_api_keys.sql"))
61                .with_required_columns(vec![
62                    "id".into(),
63                    "user_id".into(),
64                    "key_prefix".into(),
65                    "key_hash".into(),
66                ]),
67            SchemaDefinition::inline(
68                "user_device_certs",
69                include_str!("../schema/user_device_certs.sql"),
70            )
71            .with_required_columns(vec![
72                "id".into(),
73                "user_id".into(),
74                "fingerprint".into(),
75                "label".into(),
76            ]),
77        ]
78    }
79
80    fn dependencies(&self) -> Vec<&'static str> {
81        vec![]
82    }
83
84    fn migrations(&self) -> Vec<Migration> {
85        vec![Migration::new(
86            1,
87            "add_user_sessions_utm_content_term",
88            MIGRATION_001_UTM_CONTENT_TERM,
89        )]
90    }
91}
92
93register_extension!(UsersExtension);