1use super::types::*;
5
6pub fn core_schema() -> Vec<TableDef> {
8 vec![
9 users_table(),
10 sessions_table(),
11 audit_log_table(),
12 challenges_table(),
13 rate_limits_table(),
14 revocations_table(),
15 ]
16}
17
18fn users_table() -> TableDef {
19 TableDef::new("yauth_users")
20 .column(
21 ColumnDef::new("id", ColumnType::Uuid)
22 .primary_key()
23 .default("gen_random_uuid()"),
24 )
25 .column(ColumnDef::new("email", ColumnType::Varchar).unique())
26 .column(ColumnDef::new("display_name", ColumnType::Varchar).nullable())
27 .column(ColumnDef::new("email_verified", ColumnType::Boolean).default("false"))
28 .column(ColumnDef::new("role", ColumnType::Varchar).default("'user'"))
29 .column(ColumnDef::new("banned", ColumnType::Boolean).default("false"))
30 .column(ColumnDef::new("banned_reason", ColumnType::Varchar).nullable())
31 .column(ColumnDef::new("banned_until", ColumnType::DateTime).nullable())
32 .column(ColumnDef::new("created_at", ColumnType::DateTime).default("now()"))
33 .column(ColumnDef::new("updated_at", ColumnType::DateTime).default("now()"))
34}
35
36fn sessions_table() -> TableDef {
37 TableDef::new("yauth_sessions")
38 .column(
39 ColumnDef::new("id", ColumnType::Uuid)
40 .primary_key()
41 .default("gen_random_uuid()"),
42 )
43 .column(ColumnDef::new("user_id", ColumnType::Uuid).references(
44 "yauth_users",
45 "id",
46 OnDelete::Cascade,
47 ))
48 .column(ColumnDef::new("token_hash", ColumnType::VarcharN(64)).unique())
49 .column(ColumnDef::new("ip_address", ColumnType::Varchar).nullable())
50 .column(ColumnDef::new("user_agent", ColumnType::Varchar).nullable())
51 .column(ColumnDef::new("expires_at", ColumnType::DateTime))
52 .column(ColumnDef::new("created_at", ColumnType::DateTime).default("now()"))
53}
54
55fn audit_log_table() -> TableDef {
56 TableDef::new("yauth_audit_log")
57 .column(
58 ColumnDef::new("id", ColumnType::Uuid)
59 .primary_key()
60 .default("gen_random_uuid()"),
61 )
62 .column(
63 ColumnDef::new("user_id", ColumnType::Uuid)
64 .nullable()
65 .references("yauth_users", "id", OnDelete::SetNull),
66 )
67 .column(ColumnDef::new("event_type", ColumnType::Varchar))
68 .column(ColumnDef::new("metadata", ColumnType::Json).nullable())
69 .column(ColumnDef::new("ip_address", ColumnType::Varchar).nullable())
70 .column(ColumnDef::new("created_at", ColumnType::DateTime).default("now()"))
71}
72
73fn challenges_table() -> TableDef {
74 TableDef::new("yauth_challenges")
75 .column(ColumnDef::new("key", ColumnType::VarcharN(255)).primary_key())
76 .column(ColumnDef::new("value", ColumnType::Json))
77 .column(ColumnDef::new("expires_at", ColumnType::DateTime))
78}
79
80fn rate_limits_table() -> TableDef {
81 TableDef::new("yauth_rate_limits")
82 .column(ColumnDef::new("key", ColumnType::VarcharN(255)).primary_key())
83 .column(ColumnDef::new("count", ColumnType::Int).default("1"))
84 .column(ColumnDef::new("window_start", ColumnType::DateTime).default("now()"))
85}
86
87fn revocations_table() -> TableDef {
88 TableDef::new("yauth_revocations")
89 .column(ColumnDef::new("key", ColumnType::VarcharN(255)).primary_key())
90 .column(ColumnDef::new("expires_at", ColumnType::DateTime))
91}