Skip to main content

systemprompt_cli/commands/core/content/
delete_source.rs

1//! `core content delete-source` command removing a source's content.
2//!
3//! Copyright (c) systemprompt.io — Business Source License 1.1.
4//! See <https://systemprompt.io> for licensing details.
5
6use 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}