diff --git a/src/backend/src/domain/user.rs b/src/backend/src/domain/user.rs index b4b7b6b..f1afeac 100644 --- a/src/backend/src/domain/user.rs +++ b/src/backend/src/domain/user.rs @@ -116,3 +116,16 @@ impl User { self.permissions = UserPermissions::from(permissions); } } + +impl NewUser { + pub fn new_root() -> Self { + Self { + username: "root".to_string(), + email: None, + password: "rootpassword".to_string(), + first_name: None, + last_name: None, + permissions: UserPermissions::root(), + } + } +} diff --git a/src/backend/src/domain/user_prems.rs b/src/backend/src/domain/user_prems.rs index b89817e..58af8f3 100644 --- a/src/backend/src/domain/user_prems.rs +++ b/src/backend/src/domain/user_prems.rs @@ -25,3 +25,13 @@ impl Default for UserPermissions { } } } + +impl UserPermissions { + pub fn root() -> Self { + Self { + root: true, + manage_users: true, + login: true, + } + } +} diff --git a/src/backend/src/infra/db/user.rs b/src/backend/src/infra/db/user.rs index 9ae2146..23333ec 100644 --- a/src/backend/src/infra/db/user.rs +++ b/src/backend/src/infra/db/user.rs @@ -146,7 +146,7 @@ pub async fn exists_by_username(pool: &PgPool, username: &str) -> Result { SELECT EXISTS( SELECT 1 FROM users - WHERE uuid = $1 + WHERE username = $1 ) "#, ) diff --git a/src/backend/src/main.rs b/src/backend/src/main.rs index 2e160ac..78710e9 100644 --- a/src/backend/src/main.rs +++ b/src/backend/src/main.rs @@ -1,7 +1,11 @@ use std::sync::Arc; use anyhow::{Ok, Result}; -use rustymine_daemon::{config::AppCfg, router, state::AppState}; +use rustymine_daemon::{ + config::AppCfg, + router, + state::{AppState, check_root}, +}; use tracing::{Level, debug, info}; pub const APP_NAME: &str = env!("CARGO_PKG_NAME"); @@ -57,6 +61,7 @@ async fn main() -> Result<()> { }; let state = Arc::new(AppState::new(&config).await); + check_root(state.clone()).await; let app_result = router::init_router(state.clone()).await; diff --git a/src/backend/src/state.rs b/src/backend/src/state.rs index 7921564..68bde00 100644 --- a/src/backend/src/state.rs +++ b/src/backend/src/state.rs @@ -1,6 +1,10 @@ -use std::process::exit; +use std::{process::exit, sync::Arc}; -use crate::prelude::*; +use crate::{ + core, + domain::user::{InternalNewUser, NewUser}, + prelude::*, +}; use sqlx::PgPool; @@ -31,6 +35,30 @@ impl AppState { }) .unwrap(); info!("database ready after connect and migrate"); + Self { db_pool: db_pool } } } + +pub async fn check_root(state: Arc) { + let root_exists = db::user::exists_by_username(&state.db_pool, "root") + .await + .map_err(|e| { + error!(error = %e, "check root exists failed"); + exit(23); + }) + .unwrap(); + + if !root_exists { + info!("No root user found in db, creating one"); + let new_root = NewUser::new_root(); + core::user_routines::create(state, new_root) + .await + .map_err(|e| { + error!(error = %e, "create root failed"); + exit(24); + }) + .unwrap(); + info!("New default root created username: root, password: rootpassword"); + } +}