use crate::errors::AuthResult; const USER_PREFIX: &str = "models::users::"; const SPACE_PREFIX: &str = "models::space::"; pub async fn sync_schema(db: &crate::db::DbConn) -> AuthResult<()> { crate::db::migrate::EntityFirst::new(&[USER_PREFIX, SPACE_PREFIX]) .before([ "DROP TABLE IF EXISTS oauth_refresh_tokens", "DROP TABLE IF EXISTS oauth_consents", "DROP TABLE IF EXISTS oauth_clients", "DROP TABLE IF EXISTS user_access_tokens", "DROP TABLE IF EXISTS service_token_revocations", ]) .after([ // 邮箱查询一律走 lower(email),表达式唯一索引把大小写变体挡在数据库层。 "CREATE UNIQUE INDEX IF NOT EXISTS auth_users_lower_email_idx ON auth_users (lower(email))", ]) .run(db.write()) .await?; // 事件 outbox 与业务表一起在启动时建好,relay 随后才能领取。 crate::events::outbox::sync_schema(db.write()).await?; Ok(()) }