Skip to main content

systemprompt_cli/commands/core/content/
delete_source.rs

1use super::types::DeleteSourceOutput;
2use crate::cli_settings::CliConfig;
3use crate::interactive::require_confirmation;
4use crate::shared::CommandResult;
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(help = "Source ID")]
15    pub source_id: String,
16
17    #[arg(short = 'y', long, help = "Skip confirmation")]
18    pub yes: bool,
19}
20
21pub async fn execute(
22    args: DeleteSourceArgs,
23    config: &CliConfig,
24) -> Result<CommandResult<DeleteSourceOutput>> {
25    if config.is_interactive() && !args.yes {
26        CliService::warning(&format!(
27            "This will permanently delete ALL content from source: {}",
28            args.source_id
29        ));
30    }
31
32    require_confirmation("Are you sure you want to continue?", args.yes, config)?;
33
34    let ctx = AppContext::new().await?;
35    let repo = ContentRepository::new(ctx.db_pool())?;
36
37    let source = SourceId::new(args.source_id.clone());
38    let deleted_count = repo.delete_by_source(&source).await?;
39
40    let output = DeleteSourceOutput {
41        deleted_count,
42        source_id: source,
43    };
44
45    Ok(CommandResult::card(output).with_title("Source Content Deleted"))
46}