systemprompt-cli 0.2.1

Unified CLI for systemprompt.io AI governance: agent orchestration, MCP governance, analytics, profiles, cloud deploy, and self-hosted operations.
Documentation
use anyhow::{Result, anyhow};
use clap::Args;
use systemprompt_runtime::AppContext;
use systemprompt_users::{UserAdminService, UserService, UserStatus};

use super::list::StatusFilter;
use super::types::UserUpdatedOutput;
use crate::CliConfig;
use crate::shared::CommandResult;

#[derive(Debug, Args)]
pub struct UpdateArgs {
    #[arg(value_name = "USER_ID")]
    pub user: String,

    #[arg(long)]
    pub email: Option<String>,

    #[arg(long)]
    pub full_name: Option<String>,

    #[arg(long)]
    pub display_name: Option<String>,

    #[arg(long, value_enum)]
    pub status: Option<StatusFilter>,

    #[arg(long)]
    pub email_verified: Option<bool>,
}

pub async fn execute(
    args: UpdateArgs,
    _config: &CliConfig,
) -> Result<CommandResult<UserUpdatedOutput>> {
    let ctx = AppContext::new().await?;
    let user_service = UserService::new(ctx.db_pool())?;
    let admin_service = UserAdminService::new(user_service.clone());

    let existing = admin_service.find_user(&args.user).await?;
    let Some(mut user) = existing else {
        return Err(anyhow!("User not found: {}", args.user));
    };
    let user_id = user.id.clone();

    let has_updates = args.email.is_some()
        || args.full_name.is_some()
        || args.display_name.is_some()
        || args.status.is_some()
        || args.email_verified.is_some();

    if !has_updates {
        return Err(anyhow!("No fields to update"));
    }

    if let Some(ref email) = args.email {
        user = user_service.update_email(&user_id, email).await?;
    }

    if let Some(ref full_name) = args.full_name {
        user = user_service.update_full_name(&user_id, full_name).await?;
    }

    if let Some(ref display_name) = args.display_name {
        user = user_service
            .update_display_name(&user_id, display_name)
            .await?;
    }

    if let Some(status_filter) = args.status {
        let status: UserStatus = status_filter.into();
        user = user_service.update_status(&user_id, status).await?;
    }

    if let Some(verified) = args.email_verified {
        user = user_service
            .update_email_verified(&user_id, verified)
            .await?;
    }

    let output = UserUpdatedOutput {
        id: user.id.clone(),
        name: user.name.clone(),
        email: user.email.clone(),
        message: format!("User '{}' updated successfully", user.name),
    };

    Ok(CommandResult::text(output).with_title("User Updated"))
}