user.write_to_database
This commit is contained in:
parent
50bfe09bcf
commit
86d49c56dc
54
src/demo.rs
54
src/demo.rs
@ -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"
|
||||||
|
70
src/user.rs
70
src/user.rs
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user