systemprompt_cli/commands/core/content/
delete_source.rs1use super::types::DeleteSourceOutput;
2use crate::cli_settings::CliConfig;
3use crate::interactive::{Prompter, require_confirmation};
4use crate::shared::CommandOutput;
5use anyhow::Result;
6use clap::Args;
7use systemprompt_content::ContentRepository;
8use systemprompt_identifiers::SourceId;
9use systemprompt_logging::CliService;
10use systemprompt_runtime::AppContext;
11
12#[derive(Debug, Args)]
13pub struct DeleteSourceArgs {
14 #[arg(value_name = "SOURCE_ID", help = "Source ID")]
15 pub source: String,
16
17 #[arg(short = 'y', long, help = "Skip confirmation")]
18 pub yes: bool,
19}
20
21pub async fn execute(
22 args: DeleteSourceArgs,
23 prompter: &dyn Prompter,
24 config: &CliConfig,
25) -> Result<CommandOutput> {
26 if config.is_interactive() && !args.yes {
27 CliService::warning(&format!(
28 "This will permanently delete ALL content from source: {}",
29 args.source
30 ));
31 }
32
33 require_confirmation(
34 prompter,
35 "Are you sure you want to continue?",
36 args.yes,
37 config,
38 )?;
39
40 let ctx = AppContext::new().await?;
41 let repo = ContentRepository::new(ctx.db_pool())?;
42
43 let source = SourceId::new(args.source.clone());
44 let deleted_count = repo.delete_by_source(&source).await?;
45
46 let output = DeleteSourceOutput {
47 deleted_count,
48 source_id: source,
49 };
50
51 Ok(CommandOutput::card_value("Source Content Deleted", &output))
52}