Skip to main content

yauth_migration/
core.rs

1//! Core table definitions: users, sessions, audit_log, challenges, rate_limits, revocations.
2//! These are always included regardless of enabled features.
3
4use super::types::*;
5
6/// Returns the core yauth tables.
7pub 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}