systemprompt_users/
extension.rs1use systemprompt_extension::prelude::*;
7
8#[derive(Debug, Clone, Copy, Default)]
9pub struct UsersExtension;
10
11impl Extension for UsersExtension {
12 fn metadata(&self) -> ExtensionMetadata {
13 ExtensionMetadata {
14 id: "users",
15 name: "Users",
16 version: env!("CARGO_PKG_VERSION"),
17 }
18 }
19
20 fn is_required(&self) -> bool {
21 true
22 }
23
24 fn schemas(&self) -> Vec<SchemaDefinition> {
25 vec![
26 SchemaDefinition::new("users", include_str!("../schema/users.sql"))
27 .with_required_columns(vec![
28 "id".into(),
29 "name".into(),
30 "email".into(),
31 "created_at".into(),
32 ]),
33 SchemaDefinition::new("user_sessions", include_str!("../schema/user_sessions.sql"))
34 .with_required_columns(vec![
35 "session_id".into(),
36 "started_at".into(),
37 "bot_type".into(),
38 ]),
39 SchemaDefinition::sql_only(include_str!("../schema/session_bot_type.sql")),
40 SchemaDefinition::new("banned_ips", include_str!("../schema/banned_ips.sql"))
41 .with_required_columns(vec![
42 "ip_address".into(),
43 "reason".into(),
44 "banned_at".into(),
45 ]),
46 SchemaDefinition::new("user_api_keys", include_str!("../schema/user_api_keys.sql"))
47 .with_required_columns(vec![
48 "id".into(),
49 "user_id".into(),
50 "key_prefix".into(),
51 "key_hash".into(),
52 "model_allowlist".into(),
53 "request_window_seconds".into(),
54 ]),
55 SchemaDefinition::new(
56 "user_api_key_scopes",
57 include_str!("../schema/user_api_key_scopes.sql"),
58 )
59 .with_required_columns(vec![
60 "key_id".into(),
61 "dimension".into(),
62 "value".into(),
63 ]),
64 SchemaDefinition::new(
65 "user_device_certs",
66 include_str!("../schema/user_device_certs.sql"),
67 )
68 .with_required_columns(vec![
69 "id".into(),
70 "user_id".into(),
71 "fingerprint".into(),
72 "label".into(),
73 ]),
74 SchemaDefinition::new(
75 "user_rate_limit_buckets",
76 include_str!("../schema/user_rate_limit_buckets.sql"),
77 )
78 .with_required_columns(vec![
79 "user_id".into(),
80 "scope".into(),
81 "window_start".into(),
82 "hits".into(),
83 ]),
84 ]
85 .into_iter()
86 .chain(federation_schemas())
87 .collect()
88 }
89
90 fn dependencies(&self) -> Vec<&'static str> {
91 vec!["events"]
92 }
93
94 fn migrations(&self) -> Vec<Migration> {
95 extension_migrations!()
96 }
97}
98
99register_extension!(UsersExtension);
100
101fn federation_schemas() -> [SchemaDefinition; 2] {
102 [
103 SchemaDefinition::new(
104 "federated_identities",
105 include_str!("../schema/federated_identities.sql"),
106 )
107 .with_required_columns(vec![
108 "issuer".into(),
109 "external_sub".into(),
110 "user_id".into(),
111 ]),
112 SchemaDefinition::new(
113 "sso_login_events",
114 include_str!("../schema/sso_login_events.sql"),
115 )
116 .with_required_columns(vec![
117 "provider_id".into(),
118 "outcome".into(),
119 "occurred_at".into(),
120 ]),
121 ]
122}