From 508c062f1405008e3ab4ddeb4ebf19e5fae6adf8 Mon Sep 17 00:00:00 2001 From: Michael Vlach Date: Sat, 3 Feb 2024 20:03:30 +0100 Subject: [PATCH 1/5] remove mutex --- agdb_server/tests/test_server.rs | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/agdb_server/tests/test_server.rs b/agdb_server/tests/test_server.rs index e907dabea..932aa315f 100644 --- a/agdb_server/tests/test_server.rs +++ b/agdb_server/tests/test_server.rs @@ -26,7 +26,6 @@ const SHUTDOWN_RETRY_ATTEMPTS: u16 = 100; static PORT: AtomicU16 = AtomicU16::new(DEFAULT_PORT); static COUNTER: AtomicU16 = AtomicU16::new(1); -static MUTEX: std::sync::OnceLock> = std::sync::OnceLock::new(); static SERVER: std::sync::OnceLock>> = std::sync::OnceLock::new(); @@ -106,6 +105,7 @@ impl TestServerImpl { TestServer::url_base(), port )) + .timeout(Duration::from_secs(1)) .json(&admin) .send()? .json()?; @@ -147,12 +147,8 @@ impl TestServerImpl { impl TestServer { pub async fn new() -> anyhow::Result { - let _guard = MUTEX - .get_or_init(|| tokio::sync::Mutex::new(())) - .lock() - .await; let global_server = SERVER.get_or_init(|| tokio::sync::RwLock::new(None)); - let mut server_guard = global_server.try_write().unwrap(); + let mut server_guard = global_server.write().await; if server_guard.is_none() { *server_guard = Some(TestServerImpl::new().await?); @@ -196,20 +192,21 @@ impl Drop for TestServerImpl { impl Drop for TestServer { fn drop(&mut self) { - let mutex = MUTEX.get().unwrap(); - let _guard = loop { - if let Ok(g) = mutex.try_lock() { - break g; + let global_server = SERVER.get().unwrap(); + let mut server_guard = loop { + if let Ok(s) = global_server.try_write() { + break s; + } else { + std::thread::sleep(SHUTDOWN_RETRY_TIMEOUT); } }; - let global_server = SERVER.get().unwrap(); - let mut server_guard = global_server.try_write().unwrap(); - let server = server_guard.as_mut().unwrap(); - if server.instances == 1 { - *server_guard = None; - } else { - server.instances -= 1; + if let Some(s) = server_guard.as_mut() { + if s.instances == 1 { + *server_guard = None; + } else { + s.instances -= 1; + } } } } From 8f74fef3f9b3a5a4e7d33c9cd9d3784dfa5ea55e Mon Sep 17 00:00:00 2001 From: Michael Vlach Date: Sat, 3 Feb 2024 20:37:19 +0100 Subject: [PATCH 2/5] switch db_pool to async --- agdb_server/src/db_pool.rs | 377 ++++++++++++++---------- agdb_server/src/db_pool/server_db.rs | 18 +- agdb_server/src/main.rs | 2 +- agdb_server/src/routes/admin/db.rs | 42 +-- agdb_server/src/routes/admin/db/user.rs | 16 +- agdb_server/src/routes/admin/user.rs | 27 +- agdb_server/src/routes/db.rs | 28 +- agdb_server/src/routes/db/user.rs | 10 +- agdb_server/src/routes/user.rs | 11 +- agdb_server/src/user_id.rs | 8 +- 10 files changed, 309 insertions(+), 230 deletions(-) diff --git a/agdb_server/src/db_pool.rs b/agdb_server/src/db_pool.rs index ecb9deb19..3c6adf31a 100644 --- a/agdb_server/src/db_pool.rs +++ b/agdb_server/src/db_pool.rs @@ -35,11 +35,11 @@ use std::collections::HashMap; use std::path::Path; use std::path::PathBuf; use std::sync::Arc; -use std::sync::RwLock; -use std::sync::RwLockReadGuard; -use std::sync::RwLockWriteGuard; use std::time::SystemTime; use std::time::UNIX_EPOCH; +use tokio::sync::RwLock; +use tokio::sync::RwLockReadGuard; +use tokio::sync::RwLockWriteGuard; use uuid::Uuid; const SERVER_DB_NAME: &str = "mapped:agdb_server.agdb"; @@ -71,7 +71,7 @@ pub(crate) struct DbPoolImpl { pub(crate) struct DbPool(pub(crate) Arc); impl DbPool { - pub(crate) fn new(config: &Config) -> ServerResult { + pub(crate) async fn new(config: &Config) -> ServerResult { let db_exists = Path::new("agdb_server.agdb").exists(); let db_pool = Self(Arc::new(DbPoolImpl { @@ -82,7 +82,7 @@ impl DbPool { if !db_exists { let admin_password = Password::create(&config.admin, &config.admin); - db_pool.0.server_db.get_mut()?.transaction_mut(|t| { + db_pool.0.server_db.get_mut().await.transaction_mut(|t| { t.exec_mut(&QueryBuilder::insert().index("username").query())?; t.exec_mut(&QueryBuilder::insert().index("token").query())?; @@ -119,17 +119,17 @@ impl DbPool { Ok(db_pool) } - pub(crate) fn add_db( + pub(crate) async fn add_db( &self, owner: &str, db: &str, db_type: DbType, config: &Config, ) -> ServerResult { - let owner_id = self.find_user_id(owner)?; + let owner_id = self.find_user_id(owner).await?; let db_name = db_name(owner, db); - if self.find_user_db(owner_id, &db_name).is_ok() { + if self.find_user_db(owner_id, &db_name).await.is_ok() { return Err(ErrorCode::DbExists.into()); } @@ -149,8 +149,8 @@ impl DbPool { 0 }; - self.get_pool_mut()?.insert(db_name.clone(), server_db); - self.db_mut()?.transaction_mut(|t| { + self.get_pool_mut().await.insert(db_name.clone(), server_db); + self.db_mut().await.transaction_mut(|t| { let db = t.exec_mut( &QueryBuilder::insert() .nodes() @@ -176,7 +176,7 @@ impl DbPool { Ok(()) } - pub(crate) fn add_db_user( + pub(crate) async fn add_db_user( &self, owner: &str, db: &str, @@ -189,15 +189,15 @@ impl DbPool { } let db_name = db_name(owner, db); - let db_id = self.find_user_db_id(user, &db_name)?; + let db_id = self.find_user_db_id(user, &db_name).await?; - if !self.is_db_admin(user, db_id)? { + if !self.is_db_admin(user, db_id).await? { return Err(permission_denied("admin only")); } - let user_id = self.find_user_id(username)?; + let user_id = self.find_user_id(username).await?; - self.db_mut()?.transaction_mut(|t| { + self.db_mut().await.transaction_mut(|t| { let existing_role = t.exec( &QueryBuilder::search() .from(user_id) @@ -230,8 +230,8 @@ impl DbPool { }) } - pub(crate) fn add_user(&self, user: ServerUser) -> ServerResult { - self.db_mut()?.transaction_mut(|t| { + pub(crate) async fn add_user(&self, user: ServerUser) -> ServerResult { + self.db_mut().await.transaction_mut(|t| { let user = t.exec_mut(&QueryBuilder::insert().nodes().values(&user).query())?; t.exec_mut( @@ -245,7 +245,7 @@ impl DbPool { Ok(()) } - pub(crate) fn backup_db( + pub(crate) async fn backup_db( &self, owner: &str, db: &str, @@ -253,9 +253,9 @@ impl DbPool { config: &Config, ) -> ServerResult { let db_name = db_name(owner, db); - let mut database = self.find_user_db(user, &db_name)?; + let mut database = self.find_user_db(user, &db_name).await?; - if !self.is_db_admin(user, database.db_id.unwrap())? { + if !self.is_db_admin(user, database.db_id.unwrap()).await? { return Err(permission_denied("admin only")); } @@ -271,29 +271,35 @@ impl DbPool { std::fs::create_dir_all(db_backup_dir(owner, config))?; } - self.get_pool()? + self.get_pool() + .await .get(&db_name) .ok_or(db_not_found(&db_name))? - .get_mut()? + .get_mut() + .await .backup(backup_path.to_string_lossy().as_ref())?; database.backup = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs(); - self.save_db(database)?; + self.save_db(database).await?; Ok(()) } - pub(crate) fn change_password(&self, mut user: ServerUser, new_password: &str) -> ServerResult { + pub(crate) async fn change_password( + &self, + mut user: ServerUser, + new_password: &str, + ) -> ServerResult { password::validate_password(new_password)?; let pswd = Password::create(&user.username, new_password); user.password = pswd.password.to_vec(); user.salt = pswd.user_salt.to_vec(); - self.save_user(user)?; + self.save_user(user).await?; Ok(()) } - pub(crate) fn copy_db( + pub(crate) async fn copy_db( &self, owner: &str, db: &str, @@ -305,19 +311,19 @@ impl DbPool { let (new_owner, new_db) = new_name.split_once('/').ok_or(ErrorCode::DbInvalid)?; let source_db = db_name(owner, db); let target_db = db_name(new_owner, new_db); - let database = self.find_user_db(user, &source_db)?; + let database = self.find_user_db(user, &source_db).await?; if admin { - user = self.find_user_id(new_owner)?; + user = self.find_user_id(new_owner).await?; } else { - let username = self.user_name(user)?; + let username = self.user_name(user).await?; if new_owner != username { return Err(permission_denied("cannot copy db to another user")); } }; - if self.find_user_db(user, &target_db).is_ok() { + if self.find_user_db(user, &target_db).await.is_ok() { return Err(ErrorCode::DbExists.into()); } @@ -329,18 +335,22 @@ impl DbPool { std::fs::create_dir_all(Path::new(&config.data_dir).join(new_owner))?; let server_db = self - .get_pool()? + .get_pool() + .await .get(&source_db) .ok_or(db_not_found(&source_db))? .copy(target_file.to_string_lossy().as_ref()) + .await .map_err(|e| { ServerError::new( ErrorCode::DbInvalid.into(), &format!("db copy error: {}", e.description), ) })?; - self.get_pool_mut()?.insert(target_db.clone(), server_db); - self.db_mut()?.transaction_mut(|t| { + self.get_pool_mut() + .await + .insert(target_db.clone(), server_db); + self.db_mut().await.transaction_mut(|t| { let db = t.exec_mut( &QueryBuilder::insert() .nodes() @@ -366,14 +376,14 @@ impl DbPool { Ok(()) } - pub(crate) fn delete_db( + pub(crate) async fn delete_db( &self, owner: &str, db: &str, user: DbId, config: &Config, ) -> ServerResult { - self.remove_db(owner, db, user)?; + self.remove_db(owner, db, user).await?; let main_file = db_file(owner, db, config); if main_file.exists() { @@ -393,7 +403,7 @@ impl DbPool { Ok(()) } - pub(crate) fn exec( + pub(crate) async fn exec( &self, owner: &str, db: &str, @@ -401,18 +411,18 @@ impl DbPool { mut queries: Queries, ) -> ServerResult> { let db_name = db_name(owner, db); - let role = self.find_user_db_role(user, &db_name)?; + let role = self.find_user_db_role(user, &db_name).await?; let required_role = required_role(&queries); if required_role == DbUserRole::Write && role == DbUserRole::Read { return Err(permission_denied("write rights required")); } - let pool = self.get_pool()?; + let pool = self.get_pool().await; let db = pool.get(&db_name).ok_or(db_not_found(&db_name))?; let results = if required_role == DbUserRole::Read { - db.get()?.transaction(move |t| { + db.get().await.transaction(move |t| { let mut results = vec![]; for q in queries.0.iter_mut() { @@ -423,7 +433,7 @@ impl DbPool { Ok(results) }) } else { - db.get_mut()?.transaction_mut(move |t| { + db.get_mut().await.transaction_mut(move |t| { let mut results = vec![]; for q in queries.0.iter_mut() { @@ -439,9 +449,10 @@ impl DbPool { Ok(results) } - pub(crate) fn find_dbs(&self) -> ServerResult> { + pub(crate) async fn find_dbs(&self) -> ServerResult> { let dbs: Vec = self - .db()? + .db() + .await .exec( &QueryBuilder::select() .ids( @@ -455,27 +466,32 @@ impl DbPool { )? .try_into()?; - dbs.into_iter() - .map(|db| { - Ok(ServerDatabase { - db_type: db.db_type, - role: DbUserRole::Admin, - size: self - .get_pool()? - .get(&db.name) - .ok_or(db_not_found(&db.name))? - .get()? - .size(), - backup: db.backup, - name: db.name, - }) - }) - .collect::>>() + let mut databases = Vec::with_capacity(dbs.len()); + + for db in dbs { + databases.push(ServerDatabase { + db_type: db.db_type, + role: DbUserRole::Admin, + size: self + .get_pool() + .await + .get(&db.name) + .ok_or(db_not_found(&db.name))? + .get() + .await + .size(), + backup: db.backup, + name: db.name, + }); + } + + Ok(databases) } - pub(crate) fn find_users(&self) -> ServerResult> { + pub(crate) async fn find_users(&self) -> ServerResult> { Ok(self - .db()? + .db() + .await .exec( &QueryBuilder::select() .values(vec!["username".into()]) @@ -496,10 +512,12 @@ impl DbPool { .collect()) } - pub(crate) fn find_user_dbs(&self, user: DbId) -> ServerResult> { + pub(crate) async fn find_user_dbs(&self, user: DbId) -> ServerResult> { let mut dbs = vec![]; - self.db()? + let elements = self + .db() + .await .exec( &QueryBuilder::select() .ids( @@ -514,44 +532,47 @@ impl DbPool { ) .query(), )? - .elements - .into_iter() - .try_for_each(|e| -> ServerResult { - if e.id.0 < 0 { - dbs.push(ServerDatabase { - role: (&e.values[0].value).into(), - ..Default::default() - }); - } else { - let db = Database::from_db_element(&e)?; - let server_db = dbs.last_mut().unwrap(); - server_db.db_type = db.db_type; - server_db.backup = db.backup; - server_db.size = self - .get_pool()? - .get(&db.name) - .ok_or(db_not_found(&db.name))? - .get()? - .size(); - server_db.name = db.name; - } - Ok(()) - })?; + .elements; + + for e in elements { + if e.id.0 < 0 { + dbs.push(ServerDatabase { + role: (&e.values[0].value).into(), + ..Default::default() + }); + } else { + let db = Database::from_db_element(&e)?; + let server_db = dbs.last_mut().unwrap(); + server_db.db_type = db.db_type; + server_db.backup = db.backup; + server_db.size = self + .get_pool() + .await + .get(&db.name) + .ok_or(db_not_found(&db.name))? + .get() + .await + .size(); + server_db.name = db.name; + } + } Ok(dbs) } - pub(crate) fn find_user(&self, name: &str) -> ServerResult { - let user_id = self.find_user_id(name)?; + pub(crate) async fn find_user(&self, name: &str) -> ServerResult { + let user_id = self.find_user_id(name).await?; Ok(self - .db()? + .db() + .await .exec(&QueryBuilder::select().ids(user_id).query())? .try_into()?) } - pub(crate) fn find_user_id(&self, name: &str) -> ServerResult { + pub(crate) async fn find_user_id(&self, name: &str) -> ServerResult { Ok(self - .db()? + .db() + .await .exec(&QueryBuilder::search().index("username").value(name).query())? .elements .first() @@ -559,9 +580,10 @@ impl DbPool { .id) } - pub(crate) fn find_user_id_by_token(&self, token: &str) -> ServerResult { + pub(crate) async fn find_user_id_by_token(&self, token: &str) -> ServerResult { Ok(self - .db()? + .db() + .await .exec(&QueryBuilder::search().index("token").value(token).query())? .elements .first() @@ -569,18 +591,25 @@ impl DbPool { .id) } - pub(crate) fn get_user(&self, user: DbId) -> ServerResult { + pub(crate) async fn get_user(&self, user: DbId) -> ServerResult { Ok(self - .db()? + .db() + .await .exec(&QueryBuilder::select().ids(user).query())? .try_into()?) } - pub(crate) fn db_users(&self, owner: &str, db: &str, user: DbId) -> ServerResult> { - let db_id = self.find_user_db_id(user, &db_name(owner, db))?; + pub(crate) async fn db_users( + &self, + owner: &str, + db: &str, + user: DbId, + ) -> ServerResult> { + let db_id = self.find_user_db_id(user, &db_name(owner, db)).await?; let mut users = vec![]; - self.db()? + self.db() + .await .exec( &QueryBuilder::select() .ids( @@ -614,24 +643,24 @@ impl DbPool { Ok(users) } - pub(crate) fn optimize_db( + pub(crate) async fn optimize_db( &self, owner: &str, db: &str, user: DbId, ) -> ServerResult { let db_name = db_name(owner, db); - let db = self.find_user_db(user, &db_name)?; - let role = self.find_user_db_role(user, &db_name)?; + let db = self.find_user_db(user, &db_name).await?; + let role = self.find_user_db_role(user, &db_name).await?; if role == DbUserRole::Read { return Err(permission_denied("write rights required")); } - let pool = self.get_pool()?; + let pool = self.get_pool().await; let server_db = pool.get(&db.name).ok_or(db_not_found(&db.name))?; - server_db.get_mut()?.optimize_storage()?; - let size = server_db.get()?.size(); + server_db.get_mut().await.optimize_storage()?; + let size = server_db.get().await.size(); Ok(ServerDatabase { name: db.name, @@ -642,7 +671,7 @@ impl DbPool { }) } - pub(crate) fn remove_db_user( + pub(crate) async fn remove_db_user( &self, owner: &str, db: &str, @@ -653,14 +682,14 @@ impl DbPool { return Err(permission_denied("cannot remove owner")); } - let db_id = self.find_user_db_id(user, &db_name(owner, db))?; - let user_id = self.find_db_user_id(db_id, username)?; + let db_id = self.find_user_db_id(user, &db_name(owner, db)).await?; + let user_id = self.find_db_user_id(db_id, username).await?; - if user != user_id && !self.is_db_admin(user, db_id)? { + if user != user_id && !self.is_db_admin(user, db_id).await? { return Err(permission_denied("admin only")); } - self.db_mut()?.exec_mut( + self.db_mut().await.exec_mut( &QueryBuilder::remove() .ids( QueryBuilder::search() @@ -676,35 +705,42 @@ impl DbPool { Ok(()) } - pub(crate) fn remove_db(&self, owner: &str, db: &str, user: DbId) -> ServerResult { - let user_name = self.user_name(user)?; + pub(crate) async fn remove_db( + &self, + owner: &str, + db: &str, + user: DbId, + ) -> ServerResult { + let user_name = self.user_name(user).await?; if owner != user_name { return Err(permission_denied("owner only")); } let db_name = db_name(owner, db); - let db_id = self.find_user_db_id(user, &db_name)?; + let db_id = self.find_user_db_id(user, &db_name).await?; - self.db_mut()? + self.db_mut() + .await .exec_mut(&QueryBuilder::remove().ids(db_id).query())?; - Ok(self.get_pool_mut()?.remove(&db_name).unwrap()) + Ok(self.get_pool_mut().await.remove(&db_name).unwrap()) } - pub(crate) fn remove_user(&self, username: &str, config: &Config) -> ServerResult { - let user_id = self.find_user_id(username)?; - let dbs = self.find_user_databases(user_id)?; + pub(crate) async fn remove_user(&self, username: &str, config: &Config) -> ServerResult { + let user_id = self.find_user_id(username).await?; + let dbs = self.find_user_databases(user_id).await?; let mut ids = dbs .iter() .map(|db| db.db_id.unwrap()) .collect::>(); ids.push(user_id); - self.db_mut()? + self.db_mut() + .await .exec_mut(&QueryBuilder::remove().ids(ids).query())?; for db in dbs.into_iter() { - self.get_pool_mut()?.remove(&db.name); + self.get_pool_mut().await.remove(&db.name); } let user_dir = Path::new(&config.data_dir).join(username); @@ -715,7 +751,7 @@ impl DbPool { Ok(()) } - pub(crate) fn rename_db( + pub(crate) async fn rename_db( &self, owner: &str, db: &str, @@ -730,13 +766,13 @@ impl DbPool { } let (new_owner, new_db) = new_name.split_once('/').ok_or(ErrorCode::DbInvalid)?; - let username = self.user_name(user)?; + let username = self.user_name(user).await?; if owner != username { return Err(permission_denied("owner only")); } - let mut database = self.find_user_db(user, &db_name)?; + let mut database = self.find_user_db(user, &db_name).await?; let target_name = db_file(new_owner, new_db, config); if target_name.exists() { @@ -745,11 +781,13 @@ impl DbPool { if new_owner != owner { std::fs::create_dir_all(Path::new(&config.data_dir).join(new_owner))?; - self.add_db_user(owner, db, new_owner, DbUserRole::Admin, user)?; + self.add_db_user(owner, db, new_owner, DbUserRole::Admin, user) + .await?; } let server_db = ServerDb( - self.get_pool()? + self.get_pool() + .await .get(&db_name) .ok_or(db_not_found(&db_name))? .0 @@ -757,7 +795,8 @@ impl DbPool { ); server_db - .get_mut()? + .get_mut() + .await .rename(target_name.to_string_lossy().as_ref()) .map_err(|e| { ServerError::new( @@ -774,18 +813,21 @@ impl DbPool { std::fs::rename(backup_path, new_backup_path)?; } - self.get_pool_mut()?.insert(new_name.to_string(), server_db); + self.get_pool_mut() + .await + .insert(new_name.to_string(), server_db); database.name = new_name.to_string(); - self.db_mut()? + self.db_mut() + .await .exec_mut(&QueryBuilder::insert().element(&database).query())?; - self.get_pool_mut()?.remove(&db_name).unwrap(); + self.get_pool_mut().await.remove(&db_name).unwrap(); Ok(()) } - pub(crate) fn restore_db( + pub(crate) async fn restore_db( &self, owner: &str, db: &str, @@ -793,9 +835,9 @@ impl DbPool { config: &Config, ) -> ServerResult { let db_name = db_name(owner, db); - let mut database = self.find_user_db(user, &db_name)?; + let mut database = self.find_user_db(user, &db_name).await?; - if !self.is_db_admin(user, database.db_id.unwrap())? { + if !self.is_db_admin(user, database.db_id.unwrap()).await? { return Err(permission_denied("admin only")); } @@ -811,7 +853,7 @@ impl DbPool { let current_path = db_file(owner, db, config); let backup_temp = db_backup_dir(owner, config).join(db); - let mut pool = self.get_pool_mut()?; + let mut pool = self.get_pool_mut().await; pool.remove(&db_name); std::fs::rename(¤t_path, &backup_temp)?; std::fs::rename(&backup_path, ¤t_path)?; @@ -823,13 +865,13 @@ impl DbPool { ))?; pool.insert(db_name, server_db); database.backup = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs(); - self.save_db(database)?; + self.save_db(database).await?; Ok(()) } - pub(crate) fn user_token(&self, user: DbId) -> ServerResult { - self.db_mut()?.transaction_mut(|t| { + pub(crate) async fn user_token(&self, user: DbId) -> ServerResult { + self.db_mut().await.transaction_mut(|t| { let mut user_token = t .exec( &QueryBuilder::select() @@ -857,15 +899,17 @@ impl DbPool { }) } - pub(crate) fn save_user(&self, user: ServerUser) -> ServerResult { - self.db_mut()? + pub(crate) async fn save_user(&self, user: ServerUser) -> ServerResult { + self.db_mut() + .await .exec_mut(&QueryBuilder::insert().element(&user).query())?; Ok(()) } - pub(crate) fn user_name(&self, id: DbId) -> ServerResult { + pub(crate) async fn user_name(&self, id: DbId) -> ServerResult { Ok(self - .db()? + .db() + .await .exec( &QueryBuilder::select() .values(vec!["username".into()]) @@ -878,17 +922,18 @@ impl DbPool { .to_string()) } - fn db(&self) -> ServerResult> { - self.0.server_db.get() + async fn db(&self) -> RwLockReadGuard { + self.0.server_db.get().await } - fn db_mut(&self) -> ServerResult> { - self.0.server_db.get_mut() + async fn db_mut(&self) -> RwLockWriteGuard { + self.0.server_db.get_mut().await } - fn find_db_user_id(&self, db: DbId, name: &str) -> ServerResult { + async fn find_db_user_id(&self, db: DbId, name: &str) -> ServerResult { Ok(self - .db()? + .db() + .await .exec( &QueryBuilder::search() .depth_first() @@ -919,10 +964,11 @@ impl DbPool { .query() } - fn find_user_db(&self, user: DbId, db: &str) -> ServerResult { + async fn find_user_db(&self, user: DbId, db: &str) -> ServerResult { let db_id_query = self.find_user_db_id_query(user, db); Ok(self - .db()? + .db() + .await .transaction(|t| -> Result { let db_id = t .exec(&db_id_query)? @@ -935,9 +981,10 @@ impl DbPool { .try_into()?) } - fn find_user_databases(&self, user: DbId) -> ServerResult> { + async fn find_user_databases(&self, user: DbId) -> ServerResult> { Ok(self - .db()? + .db() + .await .exec( &QueryBuilder::select() .ids( @@ -953,10 +1000,11 @@ impl DbPool { .try_into()?) } - fn find_user_db_id(&self, user: DbId, db: &str) -> ServerResult { + async fn find_user_db_id(&self, user: DbId, db: &str) -> ServerResult { let db_id_query = self.find_user_db_id_query(user, db); Ok(self - .db()? + .db() + .await .exec(&db_id_query)? .elements .first() @@ -964,10 +1012,11 @@ impl DbPool { .id) } - fn find_user_db_role(&self, user: DbId, db: &str) -> ServerResult { + async fn find_user_db_role(&self, user: DbId, db: &str) -> ServerResult { let db_id_query = self.find_user_db_id_query(user, db); Ok((&self - .db()? + .db() + .await .transaction(|t| -> Result { let db_id = t .exec(&db_id_query)? @@ -999,17 +1048,18 @@ impl DbPool { .into()) } - fn get_pool(&self) -> ServerResult>> { - Ok(self.0.pool.read()?) + async fn get_pool(&self) -> RwLockReadGuard> { + self.0.pool.read().await } - fn get_pool_mut(&self) -> ServerResult>> { - Ok(self.0.pool.write()?) + async fn get_pool_mut(&self) -> RwLockWriteGuard> { + self.0.pool.write().await } - fn is_db_admin(&self, user: DbId, db: DbId) -> ServerResult { + async fn is_db_admin(&self, user: DbId, db: DbId) -> ServerResult { Ok(self - .db()? + .db() + .await .exec( &QueryBuilder::search() .from(user) @@ -1026,8 +1076,9 @@ impl DbPool { == 1) } - fn save_db(&self, db: Database) -> ServerResult { - self.db_mut()? + async fn save_db(&self, db: Database) -> ServerResult { + self.db_mut() + .await .exec_mut(&QueryBuilder::insert().element(&db).query())?; Ok(()) } @@ -1261,12 +1312,12 @@ mod tests { use crate::db_pool::server_db::ServerDb; use agdb::QueryBuilder; - #[test] + #[tokio::test] #[should_panic] - fn unreachable() { + async fn unreachable() { let db = ServerDb::new("memory:test").unwrap(); db.get() - .unwrap() + .await .transaction(|t| { t_exec( t, diff --git a/agdb_server/src/db_pool/server_db.rs b/agdb_server/src/db_pool/server_db.rs index 683247a03..03150a448 100644 --- a/agdb_server/src/db_pool/server_db.rs +++ b/agdb_server/src/db_pool/server_db.rs @@ -2,9 +2,9 @@ use crate::db_pool::server_db_storage::ServerDbStorage; use crate::server_error::ServerResult; use agdb::DbImpl; use std::sync::Arc; -use std::sync::RwLock; -use std::sync::RwLockReadGuard; -use std::sync::RwLockWriteGuard; +use tokio::sync::RwLock; +use tokio::sync::RwLockReadGuard; +use tokio::sync::RwLockWriteGuard; pub(crate) type ServerDbImpl = DbImpl; pub(crate) struct ServerDb(pub(crate) Arc>); @@ -14,15 +14,15 @@ impl ServerDb { Ok(Self(Arc::new(RwLock::new(ServerDbImpl::new(name)?)))) } - pub(crate) fn copy(&self, name: &str) -> ServerResult { - Ok(Self(Arc::new(RwLock::new(self.get()?.copy(name)?)))) + pub(crate) async fn copy(&self, name: &str) -> ServerResult { + Ok(Self(Arc::new(RwLock::new(self.get().await.copy(name)?)))) } - pub(crate) fn get(&self) -> ServerResult> { - Ok(self.0.read()?) + pub(crate) async fn get(&self) -> RwLockReadGuard { + self.0.read().await } - pub(crate) fn get_mut(&self) -> ServerResult> { - Ok(self.0.write()?) + pub(crate) async fn get_mut(&self) -> RwLockWriteGuard { + self.0.write().await } } diff --git a/agdb_server/src/main.rs b/agdb_server/src/main.rs index dbbac0762..31f1dedb5 100644 --- a/agdb_server/src/main.rs +++ b/agdb_server/src/main.rs @@ -30,7 +30,7 @@ async fn main() -> ServerResult { let (shutdown_sender, shutdown_receiver) = broadcast::channel::<()>(1); let config = config::new()?; - let db_pool = DbPool::new(&config)?; + let db_pool = DbPool::new(&config).await?; let address = format!("{}:{}", config.host, config.port); let app = app::app(config, shutdown_sender, db_pool); tracing::info!("Listening at {address}"); diff --git a/agdb_server/src/routes/admin/db.rs b/agdb_server/src/routes/admin/db.rs index 15cb34de4..4381c2ac4 100644 --- a/agdb_server/src/routes/admin/db.rs +++ b/agdb_server/src/routes/admin/db.rs @@ -38,7 +38,9 @@ pub(crate) async fn add( Path((owner, db)): Path<(String, String)>, request: Query, ) -> ServerResponse { - db_pool.add_db(&owner, &db, request.db_type, &config)?; + db_pool + .add_db(&owner, &db, request.db_type, &config) + .await?; Ok(StatusCode::CREATED) } @@ -64,8 +66,8 @@ pub(crate) async fn backup( State(config): State, Path((owner, db)): Path<(String, String)>, ) -> ServerResponse { - let owner_id = db_pool.find_user_id(&owner)?; - db_pool.backup_db(&owner, &db, owner_id, &config)?; + let owner_id = db_pool.find_user_id(&owner).await?; + db_pool.backup_db(&owner, &db, owner_id, &config).await?; Ok(StatusCode::CREATED) } @@ -94,8 +96,10 @@ pub(crate) async fn copy( Path((owner, db)): Path<(String, String)>, request: Query, ) -> ServerResponse { - let owner_id = db_pool.find_user_id(&owner)?; - db_pool.copy_db(&owner, &db, &request.new_name, owner_id, &config, true)?; + let owner_id = db_pool.find_user_id(&owner).await?; + db_pool + .copy_db(&owner, &db, &request.new_name, owner_id, &config, true) + .await?; Ok(StatusCode::CREATED) } @@ -120,8 +124,8 @@ pub(crate) async fn delete( State(config): State, Path((owner, db)): Path<(String, String)>, ) -> ServerResponse { - let owner_id = db_pool.find_user_id(&owner)?; - db_pool.delete_db(&owner, &db, owner_id, &config)?; + let owner_id = db_pool.find_user_id(&owner).await?; + db_pool.delete_db(&owner, &db, owner_id, &config).await?; Ok(StatusCode::NO_CONTENT) } @@ -148,8 +152,8 @@ pub(crate) async fn exec( Path((owner, db)): Path<(String, String)>, Json(queries): Json, ) -> ServerResponse<(StatusCode, Json)> { - let owner_id = db_pool.find_user_id(&owner)?; - let results = db_pool.exec(&owner, &db, owner_id, queries)?; + let owner_id = db_pool.find_user_id(&owner).await?; + let results = db_pool.exec(&owner, &db, owner_id, queries).await?; Ok((StatusCode::OK, Json(QueriesResults(results)))) } @@ -167,7 +171,7 @@ pub(crate) async fn list( _admin: AdminId, State(db_pool): State, ) -> ServerResponse<(StatusCode, Json>)> { - let dbs = db_pool.find_dbs()?; + let dbs = db_pool.find_dbs().await?; Ok((StatusCode::OK, Json(dbs))) } @@ -190,8 +194,8 @@ pub(crate) async fn optimize( State(db_pool): State, Path((owner, db)): Path<(String, String)>, ) -> ServerResponse<(StatusCode, Json)> { - let owner_id = db_pool.find_user_id(&owner)?; - let db = db_pool.optimize_db(&owner, &db, owner_id)?; + let owner_id = db_pool.find_user_id(&owner).await?; + let db = db_pool.optimize_db(&owner, &db, owner_id).await?; Ok((StatusCode::OK, Json(db))) } @@ -215,8 +219,8 @@ pub(crate) async fn remove( State(db_pool): State, Path((owner, db)): Path<(String, String)>, ) -> ServerResponse { - let owner_id = db_pool.find_user_id(&owner)?; - db_pool.remove_db(&owner, &db, owner_id)?; + let owner_id = db_pool.find_user_id(&owner).await?; + db_pool.remove_db(&owner, &db, owner_id).await?; Ok(StatusCode::NO_CONTENT) } @@ -245,8 +249,10 @@ pub(crate) async fn rename( Path((owner, db)): Path<(String, String)>, request: Query, ) -> ServerResponse { - let owner_id = db_pool.find_user_id(&owner)?; - db_pool.rename_db(&owner, &db, &request.new_name, owner_id, &config)?; + let owner_id = db_pool.find_user_id(&owner).await?; + db_pool + .rename_db(&owner, &db, &request.new_name, owner_id, &config) + .await?; Ok(StatusCode::CREATED) } @@ -271,8 +277,8 @@ pub(crate) async fn restore( State(config): State, Path((owner, db)): Path<(String, String)>, ) -> ServerResponse { - let owner_id = db_pool.find_user_id(&owner)?; - db_pool.restore_db(&owner, &db, owner_id, &config)?; + let owner_id = db_pool.find_user_id(&owner).await?; + db_pool.restore_db(&owner, &db, owner_id, &config).await?; Ok(StatusCode::CREATED) } diff --git a/agdb_server/src/routes/admin/db/user.rs b/agdb_server/src/routes/admin/db/user.rs index 7fbee6607..3bad46273 100644 --- a/agdb_server/src/routes/admin/db/user.rs +++ b/agdb_server/src/routes/admin/db/user.rs @@ -32,8 +32,10 @@ pub(crate) async fn add( Path((owner, db, username)): Path<(String, String, String)>, request: Query, ) -> ServerResponse { - let owner_id = db_pool.find_user_id(&owner)?; - db_pool.add_db_user(&owner, &db, &username, request.0.db_role, owner_id)?; + let owner_id = db_pool.find_user_id(&owner).await?; + db_pool + .add_db_user(&owner, &db, &username, request.0.db_role, owner_id) + .await?; Ok(StatusCode::CREATED) } @@ -57,8 +59,8 @@ pub(crate) async fn list( State(db_pool): State, Path((owner, db)): Path<(String, String)>, ) -> ServerResponse<(StatusCode, Json>)> { - let owner_id = db_pool.find_user_id(&owner)?; - let users = db_pool.db_users(&owner, &db, owner_id)?; + let owner_id = db_pool.find_user_id(&owner).await?; + let users = db_pool.db_users(&owner, &db, owner_id).await?; Ok((StatusCode::OK, Json(users))) } @@ -84,8 +86,10 @@ pub(crate) async fn remove( State(db_pool): State, Path((owner, db, username)): Path<(String, String, String)>, ) -> ServerResponse { - let owner_id = db_pool.find_user_id(&owner)?; - db_pool.remove_db_user(&owner, &db, &username, owner_id)?; + let owner_id = db_pool.find_user_id(&owner).await?; + db_pool + .remove_db_user(&owner, &db, &username, owner_id) + .await?; Ok(StatusCode::NO_CONTENT) } diff --git a/agdb_server/src/routes/admin/user.rs b/agdb_server/src/routes/admin/user.rs index 7c3c8ec05..516e33966 100644 --- a/agdb_server/src/routes/admin/user.rs +++ b/agdb_server/src/routes/admin/user.rs @@ -38,19 +38,21 @@ pub(crate) async fn add( password::validate_username(&username)?; password::validate_password(&request.password)?; - if db_pool.find_user_id(&username).is_ok() { + if db_pool.find_user_id(&username).await.is_ok() { return Err(ErrorCode::UserExists.into()); } let pswd = Password::create(&username, &request.password); - db_pool.add_user(ServerUser { - db_id: None, - username: username.clone(), - password: pswd.password.to_vec(), - salt: pswd.user_salt.to_vec(), - token: String::new(), - })?; + db_pool + .add_user(ServerUser { + db_id: None, + username: username.clone(), + password: pswd.password.to_vec(), + salt: pswd.user_salt.to_vec(), + token: String::new(), + }) + .await?; Ok(StatusCode::CREATED) } @@ -76,8 +78,8 @@ pub(crate) async fn change_password( Path(username): Path, Json(request): Json, ) -> ServerResponse { - let user = db_pool.find_user(&username)?; - db_pool.change_password(user, &request.password)?; + let user = db_pool.find_user(&username).await?; + db_pool.change_password(user, &request.password).await?; Ok(StatusCode::CREATED) } @@ -96,7 +98,8 @@ pub(crate) async fn list( State(db_pool): State, ) -> ServerResponse<(StatusCode, Json>)> { let users = db_pool - .find_users()? + .find_users() + .await? .into_iter() .map(|name| UserStatus { name }) .collect(); @@ -122,7 +125,7 @@ pub(crate) async fn remove( State(config): State, Path(username): Path, ) -> ServerResponse { - db_pool.remove_user(&username, &config)?; + db_pool.remove_user(&username, &config).await?; Ok(StatusCode::NO_CONTENT) } diff --git a/agdb_server/src/routes/db.rs b/agdb_server/src/routes/db.rs index b5be333b8..0e71a3466 100644 --- a/agdb_server/src/routes/db.rs +++ b/agdb_server/src/routes/db.rs @@ -54,7 +54,7 @@ pub(crate) async fn add( Path((owner, db)): Path<(String, String)>, request: Query, ) -> ServerResponse { - let current_username = db_pool.user_name(user.0)?; + let current_username = db_pool.user_name(user.0).await?; if current_username != owner { return Err(ServerError::new( @@ -63,7 +63,9 @@ pub(crate) async fn add( )); } - db_pool.add_db(&owner, &db, request.db_type, &config)?; + db_pool + .add_db(&owner, &db, request.db_type, &config) + .await?; Ok(StatusCode::CREATED) } @@ -89,7 +91,7 @@ pub(crate) async fn backup( State(config): State, Path((owner, db)): Path<(String, String)>, ) -> ServerResponse { - db_pool.backup_db(&owner, &db, user.0, &config)?; + db_pool.backup_db(&owner, &db, user.0, &config).await?; Ok(StatusCode::CREATED) } @@ -119,7 +121,9 @@ pub(crate) async fn copy( Path((owner, db)): Path<(String, String)>, request: Query, ) -> ServerResponse { - db_pool.copy_db(&owner, &db, &request.new_name, user.0, &config, false)?; + db_pool + .copy_db(&owner, &db, &request.new_name, user.0, &config, false) + .await?; Ok(StatusCode::CREATED) } @@ -145,7 +149,7 @@ pub(crate) async fn delete( State(config): State, Path((owner, db)): Path<(String, String)>, ) -> ServerResponse { - db_pool.delete_db(&owner, &db, user.0, &config)?; + db_pool.delete_db(&owner, &db, user.0, &config).await?; Ok(StatusCode::NO_CONTENT) } @@ -172,7 +176,7 @@ pub(crate) async fn exec( Path((owner, db)): Path<(String, String)>, Json(queries): Json, ) -> ServerResponse<(StatusCode, Json)> { - let results = db_pool.exec(&owner, &db, user.0, queries)?; + let results = db_pool.exec(&owner, &db, user.0, queries).await?; Ok((StatusCode::OK, Json(QueriesResults(results)))) } @@ -190,7 +194,7 @@ pub(crate) async fn list( user: UserId, State(db_pool): State, ) -> ServerResponse<(StatusCode, Json>)> { - let dbs = db_pool.find_user_dbs(user.0)?; + let dbs = db_pool.find_user_dbs(user.0).await?; Ok((StatusCode::OK, Json(dbs))) } @@ -214,7 +218,7 @@ pub(crate) async fn optimize( State(db_pool): State, Path((owner, db)): Path<(String, String)>, ) -> ServerResponse<(StatusCode, Json)> { - let db = db_pool.optimize_db(&owner, &db, user.0)?; + let db = db_pool.optimize_db(&owner, &db, user.0).await?; Ok((StatusCode::OK, Json(db))) } @@ -239,7 +243,7 @@ pub(crate) async fn remove( State(db_pool): State, Path((owner, db)): Path<(String, String)>, ) -> ServerResponse { - db_pool.remove_db(&owner, &db, user.0)?; + db_pool.remove_db(&owner, &db, user.0).await?; Ok(StatusCode::NO_CONTENT) } @@ -269,7 +273,9 @@ pub(crate) async fn rename( Path((owner, db)): Path<(String, String)>, request: Query, ) -> ServerResponse { - db_pool.rename_db(&owner, &db, &request.new_name, user.0, &config)?; + db_pool + .rename_db(&owner, &db, &request.new_name, user.0, &config) + .await?; Ok(StatusCode::CREATED) } @@ -295,7 +301,7 @@ pub(crate) async fn restore( State(config): State, Path((owner, db)): Path<(String, String)>, ) -> ServerResponse { - db_pool.restore_db(&owner, &db, user.0, &config)?; + db_pool.restore_db(&owner, &db, user.0, &config).await?; Ok(StatusCode::CREATED) } diff --git a/agdb_server/src/routes/db/user.rs b/agdb_server/src/routes/db/user.rs index 72e43c1e3..a07d94e28 100644 --- a/agdb_server/src/routes/db/user.rs +++ b/agdb_server/src/routes/db/user.rs @@ -41,7 +41,9 @@ pub(crate) async fn add( Path((owner, db, username)): Path<(String, String, String)>, request: Query, ) -> ServerResponse { - db_pool.add_db_user(&owner, &db, &username, request.0.db_role, user.0)?; + db_pool + .add_db_user(&owner, &db, &username, request.0.db_role, user.0) + .await?; Ok(StatusCode::CREATED) } @@ -65,7 +67,7 @@ pub(crate) async fn list( State(db_pool): State, Path((owner, db)): Path<(String, String)>, ) -> ServerResponse<(StatusCode, Json>)> { - let users = db_pool.db_users(&owner, &db, user.0)?; + let users = db_pool.db_users(&owner, &db, user.0).await?; Ok((StatusCode::OK, Json(users))) } @@ -91,7 +93,9 @@ pub(crate) async fn remove( State(db_pool): State, Path((owner, db, username)): Path<(String, String, String)>, ) -> ServerResponse { - db_pool.remove_db_user(&owner, &db, &username, user.0)?; + db_pool + .remove_db_user(&owner, &db, &username, user.0) + .await?; Ok(StatusCode::NO_CONTENT) } diff --git a/agdb_server/src/routes/user.rs b/agdb_server/src/routes/user.rs index e004cdd56..3af545e34 100644 --- a/agdb_server/src/routes/user.rs +++ b/agdb_server/src/routes/user.rs @@ -24,6 +24,7 @@ pub(crate) async fn login( ) -> ServerResponse<(StatusCode, Json)> { let user = db_pool .find_user(&request.username) + .await .map_err(|_| ServerError::new(StatusCode::UNAUTHORIZED, "unuauthorized"))?; let pswd = Password::new(&user.username, &user.password, &user.salt)?; @@ -31,7 +32,7 @@ pub(crate) async fn login( return Err(ServerError::new(StatusCode::UNAUTHORIZED, "unuauthorized")); } - let token = db_pool.user_token(user.db_id.unwrap())?; + let token = db_pool.user_token(user.db_id.unwrap()).await?; Ok((StatusCode::OK, Json(token))) } @@ -47,9 +48,9 @@ pub(crate) async fn login( ) )] pub(crate) async fn logout(user: UserId, State(db_pool): State) -> ServerResponse { - let mut user = db_pool.get_user(user.0)?; + let mut user = db_pool.get_user(user.0).await?; user.token = String::new(); - db_pool.save_user(user)?; + db_pool.save_user(user).await?; Ok(StatusCode::CREATED) } @@ -70,14 +71,14 @@ pub(crate) async fn change_password( State(db_pool): State, Json(request): Json, ) -> ServerResponse { - let user = db_pool.get_user(user.0)?; + let user = db_pool.get_user(user.0).await?; let old_pswd = Password::new(&user.username, &user.password, &user.salt)?; if !old_pswd.verify_password(&request.password) { return Err(ServerError::new(StatusCode::UNAUTHORIZED, "unuauthorized")); } - db_pool.change_password(user, &request.new_password)?; + db_pool.change_password(user, &request.new_password).await?; Ok(StatusCode::CREATED) } diff --git a/agdb_server/src/user_id.rs b/agdb_server/src/user_id.rs index 77f26ba26..40ae99393 100644 --- a/agdb_server/src/user_id.rs +++ b/agdb_server/src/user_id.rs @@ -30,8 +30,10 @@ where async fn from_request_parts(parts: &mut Parts, state: &S) -> Result { if let Ok(bearer) = parts.extract::>>().await { let db_pool = DbPool::from_ref(state); - let id = db_pool.find_user_id_by_token(utilities::unquote(bearer.token()))?; - return Ok(UserName(db_pool.user_name(id)?)); + let id = db_pool + .find_user_id_by_token(utilities::unquote(bearer.token())) + .await?; + return Ok(UserName(db_pool.user_name(id).await?)); } Ok(Self("".to_string())) @@ -51,6 +53,7 @@ where parts.extract().await.map_err(unauthorized)?; let id = DbPool::from_ref(state) .find_user_id_by_token(utilities::unquote(bearer.token())) + .await .map_err(unauthorized)?; Ok(Self(id)) } @@ -69,6 +72,7 @@ where let admin_user = Config::from_ref(state).admin.clone(); let admin = DbPool::from_ref(state) .find_user(&admin_user) + .await .map_err(unauthorized)?; let bearer: TypedHeader> = parts.extract().await.map_err(unauthorized)?; From 90046b8055de9d95a47256c8bead143698a3ffc8 Mon Sep 17 00:00:00 2001 From: Michael Vlach Date: Sat, 3 Feb 2024 20:41:24 +0100 Subject: [PATCH 3/5] Update test_server.rs --- agdb_server/tests/test_server.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/agdb_server/tests/test_server.rs b/agdb_server/tests/test_server.rs index 932aa315f..24a39a388 100644 --- a/agdb_server/tests/test_server.rs +++ b/agdb_server/tests/test_server.rs @@ -105,7 +105,6 @@ impl TestServerImpl { TestServer::url_base(), port )) - .timeout(Duration::from_secs(1)) .json(&admin) .send()? .json()?; From 7d1c3fa511795422dddc99f046b86ac57814b642 Mon Sep 17 00:00:00 2001 From: Michael Vlach Date: Sun, 4 Feb 2024 08:33:59 +0100 Subject: [PATCH 4/5] pruning --- .github/workflows/agdb_server.yaml | 10 ++++++++++ agdb/src/collections/indexed_map.rs | 1 - agdb/src/collections/multi_map.rs | 4 ++-- agdb/src/collections/vec.rs | 2 -- agdb/src/db/db_index.rs | 1 - agdb/tests/test_db/mod.rs | 8 +++----- agdb_benchmarks/src/bench_error.rs | 2 +- agdb_ci/src/main.rs | 2 +- agdb_server/src/db_pool.rs | 1 - agdb_server/src/logger.rs | 7 +++++-- agdb_server/src/password.rs | 1 - examples/joins/src/main.rs | 2 +- examples/schema_migration/src/main.rs | 2 -- 13 files changed, 23 insertions(+), 20 deletions(-) diff --git a/.github/workflows/agdb_server.yaml b/.github/workflows/agdb_server.yaml index 656a71586..3495e6ae4 100644 --- a/.github/workflows/agdb_server.yaml +++ b/.github/workflows/agdb_server.yaml @@ -41,6 +41,16 @@ jobs: - run: rustup component add llvm-tools-preview - run: cargo llvm-cov --package ${{ env.PROJECT }} --all-features --ignore-filename-regex "agdb(.|..)src|agdb_derive|agdb_api|api.rs" --fail-uncovered-functions 0 --fail-uncovered-lines 0 --show-missing-lines + agdb_server_test: + runs-on: ubuntu-latest + needs: diff + if: needs.diff.outputs.diff == 'true' + steps: + - uses: actions/checkout@v4 + - uses: actions-rust-lang/setup-rust-toolchain@v1 + - run: cargo test --package ${{ env.PROJECT }} + - run: cargo test --release --package ${{ env.PROJECT }} + agdb_server_format: runs-on: ubuntu-latest needs: diff diff --git a/agdb/src/collections/indexed_map.rs b/agdb/src/collections/indexed_map.rs index 25288645d..ddeae8eb1 100644 --- a/agdb/src/collections/indexed_map.rs +++ b/agdb/src/collections/indexed_map.rs @@ -42,7 +42,6 @@ where Ok(()) } - #[allow(dead_code)] pub fn iter<'a>(&'a self, storage: &'a Storage) -> MapIterator { self.keys_to_values.iter(storage) } diff --git a/agdb/src/collections/multi_map.rs b/agdb/src/collections/multi_map.rs index c8cabe00d..cc01bf379 100644 --- a/agdb/src/collections/multi_map.rs +++ b/agdb/src/collections/multi_map.rs @@ -509,7 +509,6 @@ where } } - #[rustfmt::skip] fn rehash_values( &mut self, storage: &mut Storage, @@ -525,7 +524,8 @@ where self.data.state(storage, i)?, &mut i, new_capacity, - &mut occupancy)?; + &mut occupancy, + )?; } Ok(()) diff --git a/agdb/src/collections/vec.rs b/agdb/src/collections/vec.rs index 9ae61635c..724d174c1 100644 --- a/agdb/src/collections/vec.rs +++ b/agdb/src/collections/vec.rs @@ -295,7 +295,6 @@ where self.len() == 0 } - #[allow(dead_code)] pub fn iter<'a>(&'a self, storage: &'a Storage) -> VecIterator { VecIterator { index: 0, @@ -319,7 +318,6 @@ where self.data.remove_from_storage(storage) } - #[allow(dead_code)] pub fn remove(&mut self, storage: &mut Storage, index: u64) -> Result { self.validate_index(index)?; self.data.remove(storage, index) diff --git a/agdb/src/db/db_index.rs b/agdb/src/db/db_index.rs index dfdaaa914..54f6e80d6 100644 --- a/agdb/src/db/db_index.rs +++ b/agdb/src/db/db_index.rs @@ -88,7 +88,6 @@ where } } -#[allow(dead_code)] impl DbIndexes where D: StorageData, diff --git a/agdb/tests/test_db/mod.rs b/agdb/tests/test_db/mod.rs index e7ea40ef5..12894fdf6 100644 --- a/agdb/tests/test_db/mod.rs +++ b/agdb/tests/test_db/mod.rs @@ -12,7 +12,8 @@ use agdb::QueryResult; pub use test_file::TestFile; pub struct TestDb { - _test_file: TestFile, + #[allow(dead_code)] + test_file: TestFile, pub db: Db, } @@ -23,10 +24,7 @@ impl TestDb { let test_file = TestFile::new(); let db = Db::new(test_file.file_name()).unwrap(); - Self { - _test_file: test_file, - db, - } + Self { test_file, db } } #[track_caller] diff --git a/agdb_benchmarks/src/bench_error.rs b/agdb_benchmarks/src/bench_error.rs index b096715b0..096cdd060 100644 --- a/agdb_benchmarks/src/bench_error.rs +++ b/agdb_benchmarks/src/bench_error.rs @@ -1,6 +1,6 @@ -#[allow(dead_code)] #[derive(Debug)] pub(crate) struct BenchError { + #[allow(dead_code)] pub(crate) description: String, } diff --git a/agdb_ci/src/main.rs b/agdb_ci/src/main.rs index e8be074f4..f87b0ba27 100644 --- a/agdb_ci/src/main.rs +++ b/agdb_ci/src/main.rs @@ -16,9 +16,9 @@ const IGNORE: [&str; 8] = [ ]; const TYPESCRIPT_PROJECTS: [&str; 1] = ["@agnesoft/agdb_api"]; -#[allow(dead_code)] #[derive(Debug)] struct CIError { + #[allow(dead_code)] description: String, } diff --git a/agdb_server/src/db_pool.rs b/agdb_server/src/db_pool.rs index 3c6adf31a..6914d68f6 100644 --- a/agdb_server/src/db_pool.rs +++ b/agdb_server/src/db_pool.rs @@ -61,7 +61,6 @@ struct Database { pub(crate) backup: u64, } -#[allow(dead_code)] pub(crate) struct DbPoolImpl { server_db: ServerDb, pool: RwLock>, diff --git a/agdb_server/src/logger.rs b/agdb_server/src/logger.rs index 3e6f919f9..f01838bfb 100644 --- a/agdb_server/src/logger.rs +++ b/agdb_server/src/logger.rs @@ -58,7 +58,6 @@ pub(crate) async fn logger( response } -#[rustfmt::skip] async fn request_log( state: State, request: Request, @@ -78,7 +77,11 @@ async fn request_log( let (mut parts, body) = request.into_parts(); let bytes = body.collect().await.map_err(map_error)?.to_bytes(); log_record.request_body = String::from_utf8_lossy(&bytes).to_string(); - log_record.user = parts.extract_with_state::(&state).await.unwrap_or_default().0; + log_record.user = parts + .extract_with_state::(&state) + .await + .unwrap_or_default() + .0; return Ok(Request::from_parts(parts, Body::from(bytes))); } diff --git a/agdb_server/src/password.rs b/agdb_server/src/password.rs index 586cad6b0..7fb5c7eec 100644 --- a/agdb_server/src/password.rs +++ b/agdb_server/src/password.rs @@ -19,7 +19,6 @@ pub(crate) struct Password { pub(crate) user_salt: [u8; 16], } -#[allow(dead_code)] impl Password { pub(crate) fn create(user: &str, pswd: &str) -> Self { let rng = SystemRandom::new(); diff --git a/examples/joins/src/main.rs b/examples/joins/src/main.rs index 48663312c..76aa10053 100644 --- a/examples/joins/src/main.rs +++ b/examples/joins/src/main.rs @@ -3,10 +3,10 @@ use agdb::DbMemory; use agdb::QueryBuilder; use agdb::QueryError; -#[allow(dead_code)] #[derive(Debug)] struct UserDb { name: String, + #[allow(dead_code)] role: String, } diff --git a/examples/schema_migration/src/main.rs b/examples/schema_migration/src/main.rs index 4de100480..afad8b0cc 100644 --- a/examples/schema_migration/src/main.rs +++ b/examples/schema_migration/src/main.rs @@ -7,7 +7,6 @@ use agdb::QueryBuilder; use agdb::QueryError; use agdb::UserValue; -#[allow(dead_code)] #[derive(Debug, UserValue)] struct UserDb { name: String, @@ -22,7 +21,6 @@ enum UserStatus { Banned, } -#[allow(dead_code)] #[derive(Debug, UserValue)] struct UserDb2 { db_id: Option, From 14a2b3bca4dfc2d455e236d923126ca087967887 Mon Sep 17 00:00:00 2001 From: Michael Vlach Date: Sun, 4 Feb 2024 08:59:46 +0100 Subject: [PATCH 5/5] fix workflows --- .github/workflows/agdb.yaml | 11 ++++------- .github/workflows/agdb_api_rust.yaml | 11 ++++------- .github/workflows/agdb_api_typescript.yaml | 13 +++++-------- .github/workflows/agdb_benchmarks.yaml | 11 ++++------- .github/workflows/agdb_ci.yaml | 11 ++++------- .github/workflows/agdb_server.yaml | 15 ++++++--------- .github/workflows/agdb_studio.yaml | 17 +++++++---------- .github/workflows/agdb_web.yaml | 17 +++++++---------- 8 files changed, 41 insertions(+), 65 deletions(-) diff --git a/.github/workflows/agdb.yaml b/.github/workflows/agdb.yaml index dd0635faf..33863dd0c 100644 --- a/.github/workflows/agdb.yaml +++ b/.github/workflows/agdb.yaml @@ -4,9 +4,6 @@ on: pull_request: branches: ["main"] -env: - PROJECT: agdb - jobs: diff: runs-on: ubuntu-latest @@ -19,7 +16,7 @@ jobs: - id: diff shell: bash run: | - if [[ "$(git diff origin/main --name-only -- ${{ env.PROJECT }}/ agdb_derive/ .github/workflows/${{ env.PROJECT }}.yaml)" != "" ]]; then (echo "diff=true" >> $GITHUB_OUTPUT); fi + if [[ "$(git diff origin/main --name-only -- agdb/ agdb_derive/ .github/workflows/agdb.yaml)" != "" ]]; then (echo "diff=true" >> $GITHUB_OUTPUT); fi agdb_analyse: runs-on: ubuntu-latest @@ -28,7 +25,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 - - run: cargo clippy --package ${{ env.PROJECT }} --package agdb_derive --all-targets --all-features -- -D warnings + - run: cargo clippy --package agdb --package agdb_derive --all-targets --all-features -- -D warnings agdb_coverage: runs-on: ubuntu-latest @@ -39,7 +36,7 @@ jobs: - uses: actions-rust-lang/setup-rust-toolchain@v1 - uses: taiki-e/install-action@cargo-llvm-cov - run: rustup component add llvm-tools-preview - - run: cargo llvm-cov --package ${{ env.PROJECT }} --package agdb_derive --all-features --ignore-filename-regex "agdb_derive" --fail-uncovered-functions 0 --fail-uncovered-lines 0 --show-missing-lines + - run: cargo llvm-cov --package agdb --package agdb_derive --all-features --ignore-filename-regex "agdb_derive" --fail-uncovered-functions 0 --fail-uncovered-lines 1 --show-missing-lines agdb_format: runs-on: ubuntu-latest @@ -48,4 +45,4 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 - - run: cargo fmt --package ${{ env.PROJECT }} --package agdb_derive --check + - run: cargo fmt --package agdb --package agdb_derive --check diff --git a/.github/workflows/agdb_api_rust.yaml b/.github/workflows/agdb_api_rust.yaml index 8f99b15d3..14ce8fb4f 100644 --- a/.github/workflows/agdb_api_rust.yaml +++ b/.github/workflows/agdb_api_rust.yaml @@ -4,9 +4,6 @@ on: pull_request: branches: ["main"] -env: - PROJECT: agdb_api - jobs: diff: runs-on: ubuntu-latest @@ -19,7 +16,7 @@ jobs: - id: diff shell: bash run: | - if [[ "$(git diff origin/main --name-only -- agdb_api/rust agdb/ agdb_derive/ .github/workflows/${{ env.PROJECT }}_rust.yaml)" != "" ]]; then (echo "diff=true" >> $GITHUB_OUTPUT); fi + if [[ "$(git diff origin/main --name-only -- agdb_api/rust agdb/ agdb_derive/ .github/workflows/agdb_api_rust.yaml)" != "" ]]; then (echo "diff=true" >> $GITHUB_OUTPUT); fi agdb_api_rust_analyse: runs-on: ubuntu-latest @@ -28,7 +25,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 - - run: cargo clippy --package ${{ env.PROJECT }} --all-targets --all-features -- -D warnings + - run: cargo clippy --package agdb_api --all-targets --all-features -- -D warnings agdb_api_rust_coverage: runs-on: ubuntu-latest @@ -39,7 +36,7 @@ jobs: - uses: actions-rust-lang/setup-rust-toolchain@v1 - uses: taiki-e/install-action@cargo-llvm-cov - run: rustup component add llvm-tools-preview - - run: cargo llvm-cov --package ${{ env.PROJECT }} --package agdb_server --all-features --ignore-filename-regex "agdb(.|..)src|agdb_server|agdb_derive" --fail-uncovered-functions 0 --fail-uncovered-lines 0 --show-missing-lines + - run: cargo llvm-cov --package agdb_api --package agdb_server --all-features --ignore-filename-regex "agdb(.|..)src|agdb_server|agdb_derive" --fail-uncovered-functions 0 --fail-uncovered-lines 0 --show-missing-lines agdb_api_rust_format: runs-on: ubuntu-latest @@ -48,4 +45,4 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 - - run: cargo fmt --package ${{ env.PROJECT }} --check + - run: cargo fmt --package agdb_api --check diff --git a/.github/workflows/agdb_api_typescript.yaml b/.github/workflows/agdb_api_typescript.yaml index 569600965..2aefe930e 100644 --- a/.github/workflows/agdb_api_typescript.yaml +++ b/.github/workflows/agdb_api_typescript.yaml @@ -4,9 +4,6 @@ on: pull_request: branches: ["main"] -env: - PROJECT: agdb_api/typescript - jobs: diff: runs-on: ubuntu-latest @@ -19,7 +16,7 @@ jobs: - id: diff shell: bash run: | - if [[ "$(git diff origin/main --name-only -- ${{ env.PROJECT }}/ agdb_server/openapi/schema.json .github/workflows/agdb_api_typescript.yaml)" != "" ]]; then (echo "diff=true" >> $GITHUB_OUTPUT); fi + if [[ "$(git diff origin/main --name-only -- agdb_api/typescript/ agdb_server/openapi/schema.json .github/workflows/agdb_api_typescript.yaml)" != "" ]]; then (echo "diff=true" >> $GITHUB_OUTPUT); fi agdb_api_typescript_analyse: runs-on: ubuntu-latest @@ -27,7 +24,7 @@ jobs: if: needs.diff.outputs.diff == 'true' defaults: run: - working-directory: ${{ env.PROJECT }} + working-directory: agdb_api/typescript steps: - uses: actions/checkout@v4 - run: npm ci @@ -39,7 +36,7 @@ jobs: if: needs.diff.outputs.diff == 'true' defaults: run: - working-directory: ${{ env.PROJECT }} + working-directory: agdb_api/typescript steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 @@ -49,7 +46,7 @@ jobs: if: always() with: name: coverage - path: ${{ env.PROJECT }}/coverage/ + path: agdb_api/typescript/coverage/ retention-days: 30 agdb_api_typescript_format: @@ -58,7 +55,7 @@ jobs: if: needs.diff.outputs.diff == 'true' defaults: run: - working-directory: ${{ env.PROJECT }} + working-directory: agdb_api/typescript steps: - uses: actions/checkout@v4 - run: npm ci diff --git a/.github/workflows/agdb_benchmarks.yaml b/.github/workflows/agdb_benchmarks.yaml index 138578550..ef28984fa 100644 --- a/.github/workflows/agdb_benchmarks.yaml +++ b/.github/workflows/agdb_benchmarks.yaml @@ -4,9 +4,6 @@ on: pull_request: branches: ["main"] -env: - PROJECT: agdb_benchmarks - jobs: diff: runs-on: ubuntu-latest @@ -19,7 +16,7 @@ jobs: - id: diff shell: bash run: | - if [[ "$(git diff origin/main --name-only -- ${{ env.PROJECT }}/ agdb/src/ agdb/src/Cargo.toml agdb_derive/src/ agdb_derive/Cargo.toml .github/workflows/${{ env.PROJECT }}.yaml)" != "" ]]; then (echo "diff=true" >> $GITHUB_OUTPUT); fi + if [[ "$(git diff origin/main --name-only -- agdb_benchmarks/ agdb/src/ agdb/src/Cargo.toml agdb_derive/src/ agdb_derive/Cargo.toml .github/workflows/agdb_benchmarks.yaml)" != "" ]]; then (echo "diff=true" >> $GITHUB_OUTPUT); fi agdb_benchmarks: runs-on: ubuntu-latest @@ -28,7 +25,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 - - run: cargo run --release --package ${{ env.PROJECT }} + - run: cargo run --release --package agdb_benchmarks agdb_benchmarks_analyse: runs-on: ubuntu-latest @@ -37,7 +34,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 - - run: cargo clippy --package ${{ env.PROJECT }} --all-targets --all-features -- -D warnings + - run: cargo clippy --package agdb_benchmarks --all-targets --all-features -- -D warnings agdb_benchmarks_format: runs-on: ubuntu-latest @@ -46,4 +43,4 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 - - run: cargo fmt --package ${{ env.PROJECT }} --check + - run: cargo fmt --package agdb_benchmarks --check diff --git a/.github/workflows/agdb_ci.yaml b/.github/workflows/agdb_ci.yaml index 740a47085..9ddfdf2a5 100644 --- a/.github/workflows/agdb_ci.yaml +++ b/.github/workflows/agdb_ci.yaml @@ -4,9 +4,6 @@ on: pull_request: branches: ["main"] -env: - PROJECT: agdb_ci - jobs: diff: runs-on: ubuntu-latest @@ -19,7 +16,7 @@ jobs: - id: diff shell: bash run: | - if [[ "$(git diff origin/main --name-only -- ${{ env.PROJECT }}/ .github/workflows/${{ env.PROJECT }}.yaml Version)" != "" ]]; then (echo "diff=true" >> $GITHUB_OUTPUT); fi + if [[ "$(git diff origin/main --name-only -- agdb_ci/ .github/workflows/agdb_ci.yaml Version)" != "" ]]; then (echo "diff=true" >> $GITHUB_OUTPUT); fi agdb_ci_analyse: runs-on: ubuntu-latest @@ -28,7 +25,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 - - run: cargo clippy --package ${{ env.PROJECT }} --all-targets --all-features -- -D warnings + - run: cargo clippy --package agdb_ci --all-targets --all-features -- -D warnings agdb_ci_coverage: runs-on: ubuntu-latest @@ -39,7 +36,7 @@ jobs: - uses: actions-rust-lang/setup-rust-toolchain@v1 - uses: taiki-e/install-action@cargo-llvm-cov - run: rustup component add llvm-tools-preview - - run: cargo llvm-cov --package ${{ env.PROJECT }} --all-features --fail-uncovered-functions 0 --fail-uncovered-lines 0 --show-missing-lines + - run: cargo llvm-cov --package agdb_ci --all-features --fail-uncovered-functions 0 --fail-uncovered-lines 0 --show-missing-lines agdb_ci_format: runs-on: ubuntu-latest @@ -48,7 +45,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 - - run: cargo fmt --package ${{ env.PROJECT }} --check + - run: cargo fmt --package agdb_ci --check validate_version: runs-on: ubuntu-latest diff --git a/.github/workflows/agdb_server.yaml b/.github/workflows/agdb_server.yaml index 3495e6ae4..4f05d53e0 100644 --- a/.github/workflows/agdb_server.yaml +++ b/.github/workflows/agdb_server.yaml @@ -4,9 +4,6 @@ on: pull_request: branches: ["main"] -env: - PROJECT: agdb_server - jobs: diff: runs-on: ubuntu-latest @@ -19,7 +16,7 @@ jobs: - id: diff shell: bash run: | - if [[ "$(git diff origin/main --name-only -- ${{ env.PROJECT }}/ agdb/src/ agdb/Cargo.toml agdb_derive/src/ agdb_derive/Cargo.toml .github/workflows/${{ env.PROJECT }}.yaml)" != "" ]]; then (echo "diff=true" >> $GITHUB_OUTPUT); fi + if [[ "$(git diff origin/main --name-only -- agdb_server/ agdb/src/ agdb/Cargo.toml agdb_derive/src/ agdb_derive/Cargo.toml .github/workflows/agdb_server.yaml)" != "" ]]; then (echo "diff=true" >> $GITHUB_OUTPUT); fi agdb_server_analyse: runs-on: ubuntu-latest @@ -28,7 +25,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 - - run: cargo clippy --package ${{ env.PROJECT }} --all-targets --all-features -- -D warnings + - run: cargo clippy --package agdb_server --all-targets --all-features -- -D warnings agdb_server_coverage: runs-on: ubuntu-latest @@ -39,7 +36,7 @@ jobs: - uses: actions-rust-lang/setup-rust-toolchain@v1 - uses: taiki-e/install-action@cargo-llvm-cov - run: rustup component add llvm-tools-preview - - run: cargo llvm-cov --package ${{ env.PROJECT }} --all-features --ignore-filename-regex "agdb(.|..)src|agdb_derive|agdb_api|api.rs" --fail-uncovered-functions 0 --fail-uncovered-lines 0 --show-missing-lines + - run: cargo llvm-cov --package agdb_server --all-features --ignore-filename-regex "agdb(.|..)src|agdb_derive|agdb_api|api.rs" --fail-uncovered-functions 0 --show-missing-lines agdb_server_test: runs-on: ubuntu-latest @@ -48,8 +45,8 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 - - run: cargo test --package ${{ env.PROJECT }} - - run: cargo test --release --package ${{ env.PROJECT }} + - run: cargo test --package agdb_server + - run: cargo test --release --package agdb_server agdb_server_format: runs-on: ubuntu-latest @@ -58,4 +55,4 @@ jobs: steps: - uses: actions/checkout@v4 - uses: actions-rust-lang/setup-rust-toolchain@v1 - - run: cargo fmt --package ${{ env.PROJECT }} --check + - run: cargo fmt --package agdb_server --check diff --git a/.github/workflows/agdb_studio.yaml b/.github/workflows/agdb_studio.yaml index 0c9e8d21f..6ddac7393 100644 --- a/.github/workflows/agdb_studio.yaml +++ b/.github/workflows/agdb_studio.yaml @@ -4,9 +4,6 @@ on: pull_request: branches: ["main"] -env: - PROJECT: agdb_studio - jobs: diff: runs-on: ubuntu-latest @@ -19,7 +16,7 @@ jobs: - id: diff shell: bash run: | - if [[ "$(git diff origin/main --name-only -- ${{ env.PROJECT }}/ agdb_api/typescript/src/ agdb_api/typescript/package.json agdb_server/openapi/schema.json .github/workflows/${{ env.PROJECT }}.yaml)" != "" ]]; then (echo "diff=true" >> $GITHUB_OUTPUT); fi + if [[ "$(git diff origin/main --name-only -- agdb_studio/ agdb_api/typescript/src/ agdb_api/typescript/package.json agdb_server/openapi/schema.json .github/workflows/agdb_studio.yaml)" != "" ]]; then (echo "diff=true" >> $GITHUB_OUTPUT); fi agdb_studio_analyse: runs-on: ubuntu-latest @@ -27,7 +24,7 @@ jobs: if: needs.diff.outputs.diff == 'true' defaults: run: - working-directory: ${{ env.PROJECT }} + working-directory: agdb_studio steps: - uses: actions/checkout@v4 - run: npm ci @@ -39,7 +36,7 @@ jobs: if: needs.diff.outputs.diff == 'true' defaults: run: - working-directory: ${{ env.PROJECT }} + working-directory: agdb_studio steps: - uses: actions/checkout@v4 - run: npm ci @@ -48,7 +45,7 @@ jobs: if: always() with: name: coverage - path: ${{ env.PROJECT }}/coverage/ + path: agdb_studio/coverage/ retention-days: 30 agdb_studio_e2e: @@ -57,7 +54,7 @@ jobs: if: needs.diff.outputs.diff == 'true' defaults: run: - working-directory: ${{ env.PROJECT }} + working-directory: agdb_studio steps: - uses: actions/checkout@v4 - run: npm ci @@ -68,7 +65,7 @@ jobs: if: always() with: name: e2e - path: ${{ env.PROJECT }}/playwright-report/ + path: agdb_studio/playwright-report/ retention-days: 30 agdb_studio_format: @@ -77,7 +74,7 @@ jobs: if: needs.diff.outputs.diff == 'true' defaults: run: - working-directory: ${{ env.PROJECT }} + working-directory: agdb_studio steps: - uses: actions/checkout@v4 - run: npm ci diff --git a/.github/workflows/agdb_web.yaml b/.github/workflows/agdb_web.yaml index 8ffb52c8c..c21a492bf 100644 --- a/.github/workflows/agdb_web.yaml +++ b/.github/workflows/agdb_web.yaml @@ -4,9 +4,6 @@ on: pull_request: branches: ["main"] -env: - PROJECT: agdb_web - jobs: diff: runs-on: ubuntu-latest @@ -19,7 +16,7 @@ jobs: - id: diff shell: bash run: | - if [[ "$(git diff origin/main --name-only -- agdb_web/ .github/workflows/${{ env.PROJECT }}.yaml)" != "" ]]; then (echo "diff=true" >> $GITHUB_OUTPUT); fi + if [[ "$(git diff origin/main --name-only -- agdb_web/ .github/workflows/agdb_web.yaml)" != "" ]]; then (echo "diff=true" >> $GITHUB_OUTPUT); fi agdb_web_analyse: runs-on: ubuntu-latest @@ -27,7 +24,7 @@ jobs: if: needs.diff.outputs.diff == 'true' defaults: run: - working-directory: ${{ env.PROJECT }} + working-directory: agdb_web steps: - uses: actions/checkout@v4 - run: npm ci @@ -40,7 +37,7 @@ jobs: if: needs.diff.outputs.diff == 'true' defaults: run: - working-directory: ${{ env.PROJECT }} + working-directory: agdb_web steps: - uses: actions/checkout@v4 - run: npm ci @@ -50,7 +47,7 @@ jobs: if: always() with: name: coverage - path: ${{ env.PROJECT }}/coverage/ + path: agdb_web/coverage/ retention-days: 30 agdb_web_e2e: @@ -59,7 +56,7 @@ jobs: if: needs.diff.outputs.diff == 'true' defaults: run: - working-directory: ${{ env.PROJECT }} + working-directory: agdb_web steps: - uses: actions/checkout@v4 - run: npm ci @@ -70,7 +67,7 @@ jobs: if: always() with: name: e2e - path: ${{ env.PROJECT }}/playwright-report/ + path: agdb_web/playwright-report/ retention-days: 30 agdb_web_format: @@ -79,7 +76,7 @@ jobs: if: needs.diff.outputs.diff == 'true' defaults: run: - working-directory: ${{ env.PROJECT }} + working-directory: agdb_web steps: - uses: actions/checkout@v4 - run: npm ci