user.write_to_database

This commit is contained in:
Greg Shuflin 2025-02-04 01:15:55 -08:00
parent 50bfe09bcf
commit 86d49c56dc
2 changed files with 64 additions and 76 deletions

View File

@ -1,49 +1,33 @@
use uuid::Uuid;
use crate::feeds::Feed; use crate::feeds::Feed;
use crate::user::User;
pub async fn setup_demo_data(pool: &sqlx::SqlitePool) { pub async fn setup_demo_data(pool: &sqlx::SqlitePool) {
// Create admin user // Create admin user
let admin_id = Uuid::new_v4(); let mut admin = User::new(
let admin_id_str = admin_id.to_string(); "admin".to_string(),
let admin_hash = bcrypt::hash("admin", bcrypt::DEFAULT_COST).unwrap(); bcrypt::hash("admin", bcrypt::DEFAULT_COST).unwrap(),
let now = chrono::Utc::now().to_rfc3339(); None,
None,
sqlx::query( );
"INSERT INTO users (id, username, password_hash, email, display_name, created_at, admin) admin.admin = true;
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)", admin
) .write_to_database(pool)
.bind(&admin_id_str)
.bind("admin")
.bind(&admin_hash)
.bind(Option::<String>::None)
.bind(Option::<String>::None)
.bind(&now)
.bind(true)
.execute(pool)
.await .await
.expect("Failed to create admin user"); .expect("Failed to create admin user");
// Create demo user // Create demo user
let demo_id = Uuid::new_v4(); let demo = User::new(
let demo_id_str = demo_id.to_string(); "demo".to_string(),
let demo_hash = bcrypt::hash("demo", bcrypt::DEFAULT_COST).unwrap(); bcrypt::hash("demo", bcrypt::DEFAULT_COST).unwrap(),
None,
sqlx::query( None,
"INSERT INTO users (id, username, password_hash, email, display_name, created_at, admin) );
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)", demo.write_to_database(pool)
)
.bind(&demo_id_str)
.bind("demo")
.bind(&demo_hash)
.bind(Option::<String>::None)
.bind(Option::<String>::None)
.bind(&now)
.bind(false)
.execute(pool)
.await .await
.expect("Failed to create demo user"); .expect("Failed to create demo user");
let demo_id = demo.id;
let mut bbc_news = Feed::new( let mut bbc_news = Feed::new(
"BBC News".to_string(), "BBC News".to_string(),
"https://feeds.bbci.co.uk/news/world/us_and_canada/rss.xml" "https://feeds.bbci.co.uk/news/world/us_and_canada/rss.xml"

View File

@ -81,6 +81,29 @@ impl User {
admin: false, admin: false,
} }
} }
pub async fn write_to_database<'a, E>(&self, executor: E) -> sqlx::Result<()>
where
E: sqlx::Executor<'a, Database = sqlx::Sqlite>,
{
sqlx::query(
r#"
INSERT INTO users (id, username, password_hash, email, display_name, created_at, admin)
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)
"#,
)
.bind(self.id.to_string())
.bind(self.username.clone())
.bind(self.password_hash.clone())
.bind(self.email.clone())
.bind(self.display_name.clone())
.bind(self.created_at.to_rfc3339())
.bind(self.admin)
.execute(executor)
.await?;
Ok(())
}
} }
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
@ -130,19 +153,7 @@ pub async fn create_user(
new_user.display_name, new_user.display_name,
); );
let query = sqlx::query( match user.write_to_database(&mut **db).await {
"INSERT INTO users (id, username, password_hash, email, display_name, created_at, admin) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)"
)
.bind(user.id.to_string())
.bind(user.username.as_str())
.bind(user.password_hash.as_str())
.bind(user.email.as_ref())
.bind(user.display_name.as_ref())
.bind(user.created_at.to_rfc3339())
.bind(false)
.execute(&mut **db).await;
match query {
Ok(_) => Ok(Json(user)), Ok(_) => Ok(Json(user)),
Err(e) => { Err(e) => {
eprintln!("Database error: {}", e); eprintln!("Database error: {}", e);
@ -350,6 +361,8 @@ pub async fn setup(
mut db: Connection<Db>, mut db: Connection<Db>,
new_user: Json<NewUser>, new_user: Json<NewUser>,
) -> Result<Status, Json<SetupError>> { ) -> Result<Status, Json<SetupError>> {
let new_user = new_user.into_inner();
// Check if any users exist // Check if any users exist
let count = sqlx::query!("SELECT COUNT(*) as count FROM users") let count = sqlx::query!("SELECT COUNT(*) as count FROM users")
.fetch_one(&mut **db) .fetch_one(&mut **db)
@ -368,34 +381,25 @@ pub async fn setup(
})); }));
} }
let password = new_user.password.as_bytes();
// Hash the password // Hash the password
let password_hash = let password_hash = bcrypt::hash(password, bcrypt::DEFAULT_COST).map_err(|e| {
bcrypt::hash(new_user.password.as_bytes(), bcrypt::DEFAULT_COST).map_err(|e| {
eprintln!("Password hashing error: {}", e); eprintln!("Password hashing error: {}", e);
Json(SetupError { Json(SetupError {
error: "Failed to process password".to_string(), error: "Failed to process password".to_string(),
}) })
})?; })?;
// Create admin user let mut user = User::new(
let user_id = Uuid::new_v4().to_string(); new_user.username,
let now = chrono::Utc::now().to_rfc3339(); password_hash,
new_user.email,
new_user.display_name,
);
user.admin = true; // This is an admin user
let result = sqlx::query( match user.write_to_database(&mut **db).await {
"INSERT INTO users (id, username, password_hash, email, display_name, created_at, admin)
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)",
)
.bind(&user_id)
.bind(&new_user.username)
.bind(&password_hash)
.bind(&new_user.email)
.bind(&new_user.display_name)
.bind(&now)
.bind(true) // This is an admin user
.execute(&mut **db)
.await;
match result {
Ok(_) => Ok(Status::Created), Ok(_) => Ok(Status::Created),
Err(e) => { Err(e) => {
eprintln!("Database error: {}", e); eprintln!("Database error: {}", e);