main
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 service_token_revocations",
"DROP INDEX IF EXISTS idx_space_join_requests_pending",
])
.after([
// 邮箱查询一律走 lower(email),表达式唯一索引把大小写变体挡在数据库层。
"CREATE UNIQUE INDEX IF NOT EXISTS auth_users_lower_email_idx ON auth_users (lower(email))",
"CREATE UNIQUE INDEX IF NOT EXISTS idx_space_join_requests_pending ON space_join_requests (organization_id, user_id) WHERE status = 'pending'",
])
.run(db.write())
.await?;
Ok(())
}