use anyhow::Context;
use clap::Parser;
use dialtone_common::rest::sites::site_data::{PublicSiteInfo, RegistrationMethod, SiteData};
use dialtone_common::utils::version::DT_VERSION;
use dialtone_sqlx::constants::HOST_NAME_RE;
use dialtone_sqlx::db::get_pooled_connection;
use dialtone_sqlx::db::site_info::fetch_site;
use dialtone_sqlx::db::site_info::update::update_site;
use validator::Validate;
#[derive(Parser, Debug, Validate)]
#[clap(name = "set_registration", version = DT_VERSION)]
struct Opts {
#[clap(value_parser, short, long)]
#[validate(regex = "HOST_NAME_RE")]
host_name: String,
#[clap(value_parser, short, long)]
open_registration: bool,
#[clap(value_parser, short, long)]
simple_code_registration: bool,
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
dotenv::dotenv().ok();
let opts: Opts = Opts::parse();
let v = opts.validate();
match v {
Err(_) => {
println!("Host name '{}' is not properly formed.", opts.host_name);
}
_ => {
let mut registration_methods: Vec<RegistrationMethod> = vec![];
if opts.open_registration {
registration_methods.push(RegistrationMethod::OpenRegistration);
}
if opts.simple_code_registration {
registration_methods.push(RegistrationMethod::SimpleCode);
}
let pg_pool = get_pooled_connection().await?;
let site_info = fetch_site(&pg_pool, &opts.host_name)
.await?
.with_context(|| "host_name is not a valid site")?;
if registration_methods.is_empty() {
println!("Setting no auto approvals for any registration methods.")
} else {
println!("Setting auto approvals for {:?}.", registration_methods);
}
let new_site_data = SiteData {
public: PublicSiteInfo {
..site_info.site_data.public
},
auto_approved_registrations: registration_methods.into(),
..site_info.site_data
};
update_site(&pg_pool, &opts.host_name, new_site_data).await?;
println!("Auto approvals set");
}
}
Ok(())
}