change user address commands

This commit is contained in:
Bryan Stitt 2022-11-29 21:29:17 +00:00
parent c8d4e1a653
commit 67e4959e34
5 changed files with 139 additions and 2 deletions

View File

@ -288,7 +288,7 @@ mod tests {
public_requests_per_period: Some(1_000_000),
response_cache_max_bytes: 10_usize.pow(7),
redirect_public_url: Some("example.com/".to_string()),
redirect_rpc_key_url: Some("example.com/{rpc_key_id}".to_string()),
redirect_rpc_key_url: Some("example.com/{{rpc_key_id}}".to_string()),
..Default::default()
},
balanced_rpcs: HashMap::from([

View File

@ -0,0 +1,56 @@
use anyhow::Context;
use argh::FromArgs;
use entities::user;
use ethers::types::Address;
use log::{debug, info};
use migration::sea_orm::{
self, ActiveModelTrait, ColumnTrait, DatabaseConnection, EntityTrait, IntoActiveModel,
QueryFilter,
};
/// change a user's address.
#[derive(FromArgs, PartialEq, Eq, Debug)]
#[argh(subcommand, name = "change_user_address")]
pub struct ChangeUserAddressCommand {
/// the address of the user you want to change
#[argh(positional)]
old_address: String,
/// the address of the user you want to change
#[argh(positional)]
new_address: String,
}
impl ChangeUserAddressCommand {
pub async fn main(self, db_conn: &DatabaseConnection) -> anyhow::Result<()> {
let old_address: Address = self.old_address.parse()?;
let new_address: Address = self.new_address.parse()?;
let old_address: Vec<u8> = old_address.to_fixed_bytes().into();
let new_address: Vec<u8> = new_address.to_fixed_bytes().into();
let u = user::Entity::find()
.filter(user::Column::Address.eq(old_address))
.one(db_conn)
.await?
.context("No user found with that address")?;
debug!("initial user: {:#?}", u);
if u.address == new_address {
info!("user already has this address");
} else {
let mut u = u.into_active_model();
u.address = sea_orm::Set(new_address);
let u = u.save(db_conn).await?;
info!("changed user address");
debug!("updated user: {:#?}", u);
}
Ok(())
}
}

View File

@ -0,0 +1,67 @@
use anyhow::Context;
use argh::FromArgs;
use entities::{rpc_key, user};
use ethers::types::Address;
use log::{debug, info};
use migration::sea_orm::{
self, ActiveModelTrait, ColumnTrait, DatabaseConnection, EntityTrait, IntoActiveModel,
QueryFilter,
};
use uuid::Uuid;
use web3_proxy::frontend::authorization::RpcSecretKey;
/// change a user's tier.
#[derive(FromArgs, PartialEq, Eq, Debug)]
#[argh(subcommand, name = "change_user_address_by_key")]
pub struct ChangeUserAddressByKeyCommand {
#[argh(positional)]
/// the RPC key owned by the user you want to change.
rpc_secret_key: RpcSecretKey,
/// the new address for the user.
#[argh(positional)]
new_address: String,
}
impl ChangeUserAddressByKeyCommand {
pub async fn main(self, db_conn: &DatabaseConnection) -> anyhow::Result<()> {
let rpc_secret_key: Uuid = self.rpc_secret_key.into();
let new_address: Address = self.new_address.parse()?;
let new_address: Vec<u8> = new_address.to_fixed_bytes().into();
let uk = rpc_key::Entity::find()
.filter(rpc_key::Column::SecretKey.eq(rpc_secret_key))
.one(db_conn)
.await?
.context("No key found")?;
debug!("user key: {:#?}", uk);
// use the rpc secret key to get the user
// TODO: get this with a join on rpc_key
let u = user::Entity::find_by_id(uk.user_id)
.one(db_conn)
.await?
.context("No user found with that key")?;
debug!("user: {:#?}", u);
if u.address == new_address {
info!("user already has that address");
} else {
let mut u = u.into_active_model();
u.address = sea_orm::Set(new_address);
let u = u.save(db_conn).await?;
debug!("user: {:#?}", u);
info!("user's address changed");
}
Ok(())
}
}

View File

@ -73,7 +73,7 @@ impl CheckConfigSubCommand {
warn!("app.redirect_user_url is None. Registered users will get an error page instead of a redirect")
}
Some(x) => {
if !x.contains("{rpc_key_id}") {
if !x.contains("{{rpc_key_id}}") {
num_errors += 1;
error!("redirect_user_url user url must contain \"{{rpc_key_id}}\"")
}

View File

@ -1,3 +1,5 @@
mod change_user_address;
mod change_user_address_by_key;
mod change_user_tier;
mod change_user_tier_by_key;
mod check_config;
@ -37,6 +39,8 @@ pub struct CliConfig {
#[derive(FromArgs, PartialEq, Debug)]
#[argh(subcommand)]
enum SubCommand {
ChangeUserAddress(change_user_address::ChangeUserAddressCommand),
ChangeUserAddressByKey(change_user_address_by_key::ChangeUserAddressByKeyCommand),
ChangeUserTier(change_user_tier::ChangeUserTierCommand),
ChangeUserTierByKey(change_user_tier_by_key::ChangeUserTierByKeyCommand),
CheckConfig(check_config::CheckConfigSubCommand),
@ -80,6 +84,16 @@ async fn main() -> anyhow::Result<()> {
};
match cli_config.sub_command {
SubCommand::ChangeUserAddress(x) => {
let db_conn = get_db(cli_config.db_url, 1, 1).await?;
x.main(&db_conn).await
}
SubCommand::ChangeUserAddressByKey(x) => {
let db_conn = get_db(cli_config.db_url, 1, 1).await?;
x.main(&db_conn).await
}
SubCommand::ChangeUserTier(x) => {
let db_conn = get_db(cli_config.db_url, 1, 1).await?;