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