diff --git a/docker-compose.yml b/docker-compose.yml index 621897162b4..3b7d90310bc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -193,7 +193,7 @@ services: /bin/sh -c " fga_migrations apply && diesel migration run --locked-schema && - editoast user add 'Example User' 'mock/mocked' && + editoast user add --skip-if-exists 'Example User' 'mock/mocked' && editoast roles add 'mock/mocked' Admin && exec editoast runserver" healthcheck: diff --git a/editoast/src/client/user.rs b/editoast/src/client/user.rs index d893ff78234..d001198051d 100644 --- a/editoast/src/client/user.rs +++ b/editoast/src/client/user.rs @@ -59,6 +59,9 @@ pub struct AddArgs { name: Option, /// Identities of the user identities: Vec, + /// Skip if one of the identities already exists + #[arg(short, long)] + skip_if_exists: bool, } #[derive(Debug, Args)] @@ -130,13 +133,27 @@ pub async fn list_user( /// Add a user pub async fn add_user( - AddArgs { name, identities }: AddArgs, + AddArgs { + name, + identities, + skip_if_exists, + }: AddArgs, pool: Arc, ) -> anyhow::Result<()> { if identities.is_empty() { println!("No identities provided."); return Ok(()); } + if skip_if_exists { + for identity in &identities { + let conn = pool.get().await?; + let user = editoast_models::User::retrieve_by_identity(identity, conn).await?; + if user.is_some() { + println!("Skipped: Identity '{identity}' already exists"); + return Ok(()); + } + } + } let conn = pool.get().await?; let created_user = editoast_models::User::register(conn, identities, name.unwrap_or_default()).await?;