diff --git a/src/main.rs b/src/main.rs index 2228c79..1027d6c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,11 +15,19 @@ struct Cli{ #[derive(Subcommand)] enum Commands{ + RepairDuplicates(RepairDuplicatesCommand), RepairPolicies(RepairPoliciesCommand), Review(ReviewCommand), UploadScripts(UploadScriptsCommand), } +#[derive(Args)] +struct RepairDuplicatesCommand{ + #[arg(long)] + session_id_file:PathBuf, + #[arg(long)] + api_url:String, +} #[derive(Args)] struct RepairPoliciesCommand{ #[arg(long)] @@ -46,7 +54,11 @@ struct UploadScriptsCommand{ async fn main(){ let cli=Cli::parse(); match cli.command{ - Commands::RepairPolicies(command)=>repair(RepairPoliciesConfig{ + Commands::RepairDuplicates(command)=>repair_duplicates(RepairDuplicatesConfig{ + session_id:std::fs::read_to_string(command.session_id_file).unwrap(), + api_url:command.api_url, + }).await.unwrap(), + Commands::RepairPolicies(command)=>repair_policies(RepairPoliciesConfig{ session_id:std::fs::read_to_string(command.session_id_file).unwrap(), api_url:command.api_url, }).await.unwrap(), @@ -460,7 +472,7 @@ struct RepairPoliciesConfig{ session_id:String, api_url:String, } -async fn repair(config:RepairPoliciesConfig)->Result<(),RepairPoliciesError>{ +async fn repair_policies(config:RepairPoliciesConfig)->Result<(),RepairPoliciesError>{ let cookie=submissions_api::Cookie::new(&config.session_id).map_err(RepairPoliciesError::Cookie)?; let api=&submissions_api::external::Context::new(config.api_url,cookie).map_err(RepairPoliciesError::Reqwest)?; @@ -509,3 +521,59 @@ async fn repair(config:RepairPoliciesConfig)->Result<(),RepairPoliciesError>{ Ok(()) } + +#[allow(dead_code)] +#[derive(Debug)] +enum RepairDuplicatesError{ + Cookie(submissions_api::CookieError), + Reqwest(submissions_api::ReqwestError), + GetScripts(submissions_api::Error), + DeleteScript(submissions_api::Error), +} + +struct RepairDuplicatesConfig{ + session_id:String, + api_url:String, +} +async fn repair_duplicates(config:RepairDuplicatesConfig)->Result<(),RepairDuplicatesError>{ + let cookie=submissions_api::Cookie::new(&config.session_id).map_err(RepairDuplicatesError::Cookie)?; + let api=&submissions_api::external::Context::new(config.api_url,cookie).map_err(RepairDuplicatesError::Reqwest)?; + + let mut sources=std::collections::HashSet::new(); + + const LIMIT:u32=100; + let mut page=1; + loop{ + println!("Downloading page {page}..."); + let scripts=api.get_scripts(submissions_api::types::GetScriptsRequest{ + Page:page, + Limit:LIMIT, + Name:None, + Hash:None, + Source:None, + ResourceType:None, + ResourceID:None, + }).await.map_err(RepairDuplicatesError::GetScripts)?; + + let done=scripts.len()<LIMIT as usize; + + for script in scripts{ + if !sources.insert(script.Source){ + println!("Deleting duplicate script {:?}",script.ID); + api.delete_script(submissions_api::types::GetScriptRequest{ + ScriptID:script.ID, + }).await.map_err(RepairDuplicatesError::DeleteScript)?; + } + } + + if done{ + // We scanned all policies + println!("Done!"); + break; + }else{ + page+=1; + } + } + + Ok(()) +}