fedimovies/src/bin/mitractl.rs

149 lines
4.6 KiB
Rust
Raw Normal View History

use chrono::{Duration, Utc};
2022-04-10 19:51:03 +00:00
use clap::Parser;
2021-04-09 00:22:17 +00:00
use uuid::Uuid;
use mitra::config;
use mitra::database::create_database_client;
2021-04-09 00:22:17 +00:00
use mitra::database::migrate::apply_migrations;
use mitra::ethereum::signatures::generate_ecdsa_key;
use mitra::ethereum::utils::key_to_ethereum_address;
2021-04-09 00:22:17 +00:00
use mitra::logger::configure_logger;
use mitra::models::posts::queries::{delete_post, find_extraneous_posts};
use mitra::models::profiles::queries::delete_profile;
2021-04-09 00:22:17 +00:00
use mitra::models::users::queries::{
create_invite_code,
2021-04-09 00:22:17 +00:00
get_invite_codes,
};
use mitra::utils::crypto::{generate_private_key, serialize_private_key};
2021-04-09 00:22:17 +00:00
/// Admin CLI tool
2022-04-10 19:51:03 +00:00
#[derive(Parser)]
2021-04-09 00:22:17 +00:00
struct Opts {
#[clap(subcommand)]
subcmd: SubCommand,
}
2022-04-10 19:51:03 +00:00
#[derive(Parser)]
2021-04-09 00:22:17 +00:00
enum SubCommand {
GenerateRsaKey(GenerateRsaKey),
GenerateEthereumAddress(GenerateEthereumAddress),
2021-04-09 00:22:17 +00:00
GenerateInviteCode(GenerateInviteCode),
ListInviteCodes(ListInviteCodes),
DeleteProfile(DeleteProfile),
DeletePost(DeletePost),
DeleteExtraneousPosts(DeleteExtraneousPosts),
2021-04-09 00:22:17 +00:00
}
/// Generate RSA private key
2022-04-10 19:51:03 +00:00
#[derive(Parser)]
struct GenerateRsaKey;
impl GenerateRsaKey {
fn execute(&self) -> () {
let private_key = generate_private_key().unwrap();
let private_key_str = serialize_private_key(&private_key).unwrap();
println!("{}", private_key_str);
}
}
/// Generate ethereum address
2022-04-10 19:51:03 +00:00
#[derive(Parser)]
struct GenerateEthereumAddress;
/// Generate invite code
2022-04-10 19:51:03 +00:00
#[derive(Parser)]
struct GenerateInviteCode;
/// List invite codes
2022-04-10 19:51:03 +00:00
#[derive(Parser)]
struct ListInviteCodes;
2021-04-09 00:22:17 +00:00
/// Delete profile
2022-04-10 19:51:03 +00:00
#[derive(Parser)]
2021-04-09 00:22:17 +00:00
struct DeleteProfile {
2021-09-25 20:46:19 +00:00
#[clap(short)]
id: Uuid,
}
/// Delete post
2022-04-10 19:51:03 +00:00
#[derive(Parser)]
2021-09-25 20:46:19 +00:00
struct DeletePost {
2021-04-09 00:22:17 +00:00
#[clap(short)]
id: Uuid,
}
/// Delete old remote posts
2022-04-10 19:51:03 +00:00
#[derive(Parser)]
struct DeleteExtraneousPosts {
#[clap(short)]
days: i64,
#[clap(long)]
dry_run: bool,
}
2021-04-09 00:22:17 +00:00
#[tokio::main]
async fn main() {
let opts: Opts = Opts::parse();
match opts.subcmd {
SubCommand::GenerateRsaKey(cmd) => cmd.execute(),
2021-04-09 00:22:17 +00:00
SubCommand::GenerateEthereumAddress(_) => {
let private_key = generate_ecdsa_key();
let address = key_to_ethereum_address(&private_key);
2021-04-09 00:22:17 +00:00
println!(
"address {:?}; private key {}",
2022-04-20 17:30:30 +00:00
address, private_key.display_secret(),
2021-04-09 00:22:17 +00:00
);
},
subcmd => {
// Other commands require initialized app
let config = config::parse_config();
configure_logger(config.log_level);
let db_config = config.database_url.parse().unwrap();
let db_client = &mut create_database_client(&db_config).await;
apply_migrations(db_client).await;
match subcmd {
SubCommand::GenerateInviteCode(_) => {
let invite_code = create_invite_code(db_client).await.unwrap();
println!("generated invite code: {}", invite_code);
},
SubCommand::ListInviteCodes(_) => {
let invite_codes = get_invite_codes(db_client).await.unwrap();
if invite_codes.is_empty() {
println!("no invite codes found");
return;
};
for code in invite_codes {
println!("{}", code);
};
},
SubCommand::DeleteProfile(subopts) => {
let deletion_queue = delete_profile(db_client, &subopts.id).await.unwrap();
deletion_queue.process(&config).await;
println!("profile deleted");
},
SubCommand::DeletePost(subopts) => {
let deletion_queue = delete_post(db_client, &subopts.id).await.unwrap();
deletion_queue.process(&config).await;
println!("post deleted");
},
SubCommand::DeleteExtraneousPosts(subopts) => {
let created_before = Utc::now() - Duration::days(subopts.days);
let posts = find_extraneous_posts(db_client, &created_before).await.unwrap();
for post_id in posts {
if !subopts.dry_run {
let deletion_queue = delete_post(db_client, &post_id).await.unwrap();
deletion_queue.process(&config).await;
};
println!("post {} deleted", post_id);
};
},
_ => panic!(),
};
},
2021-04-09 00:22:17 +00:00
};
}