use anyhow::Result;
use clap::Args;
use systemprompt_oauth::services::issue_bridge_exchange_code;
use super::types::ExchangeCodeIssuedOutput;
use crate::context::CommandContext;
use crate::shared::CommandOutput;
#[derive(Debug, Args)]
pub struct IssueCodeArgs {
#[arg(
long = "user-id",
value_name = "USER_ID",
help = "User id, email, or name to issue the exchange code for"
)]
pub user_ref: String,
}
pub(super) async fn execute(args: IssueCodeArgs, ctx: &CommandContext) -> Result<CommandOutput> {
let app = ctx.app_context().await?;
let user_id = super::resolve_user_id(app.db_pool(), &args.user_ref).await?;
let issued = issue_bridge_exchange_code(&app.oauth_repositories().oauth, &user_id).await?;
let output = ExchangeCodeIssuedOutput {
user_id: user_id.clone(),
code: issued.code.clone(),
expires_at: issued.expires_at,
message: format!(
"Exchange code issued for {user_id}; valid until {}",
issued.expires_at
),
};
Ok(CommandOutput::card_value("Bridge Exchange Code", &output))
}