#[derive(sqlx::FromRow)] pub struct User { id: u64, password: String, op: bool, } impl User { pub async fn create_user( conn: &sqlx::SqlitePool, nick: &[u8], password: bytes::Bytes, ) -> Result<(), sqlx::Error> { let mut tx = conn.begin().await?; sqlx::query("INSERT INTO users (password) VALUES (?)") .bind( tokio::task::spawn_blocking(move || bcrypt::hash(&password, 10).unwrap()) .await .unwrap(), ) .execute(&mut tx) .await?; sqlx::query("INSERT INTO users_aliases (nick, user_id) VALUES (?, LAST_INSERT_ROWID())") .bind(nick) .execute(&mut tx) .await?; tx.commit().await?; Ok(()) } pub async fn fetch_by_nick( conn: &sqlx::SqlitePool, nick: &[u8], ) -> Result, sqlx::Error> { sqlx::query_as::<_, Self>("SELECT * FROM users WHERE users.id = (SELECT user_id FROM users_aliases WHERE nick = ?)") .bind(&nick) .fetch_optional(conn) .await } pub fn password_matches(&self, password: &[u8]) -> bool { bcrypt::verify(password, &self.password).unwrap() } }