seems to work
This commit is contained in:
parent
ff3c5de0aa
commit
9418d72b8b
@ -26,7 +26,7 @@ impl UserExportSubCommand {
|
|||||||
let export_dir = Path::new(&self.output_dir);
|
let export_dir = Path::new(&self.output_dir);
|
||||||
|
|
||||||
// get all the users from the database (paged)
|
// get all the users from the database (paged)
|
||||||
let mut user_pages = user::Entity::find().into_json().paginate(db_conn, 1000);
|
let mut user_pages = user::Entity::find().paginate(db_conn, 1000);
|
||||||
|
|
||||||
// TODO: for now all user_tier tables match in all databases, but in the future we might need to export/import this
|
// TODO: for now all user_tier tables match in all databases, but in the future we might need to export/import this
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ impl UserExportSubCommand {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// get all the rpc keys from the database (paged)
|
// get all the rpc keys from the database (paged)
|
||||||
let mut rpc_key_pages = rpc_key::Entity::find().into_json().paginate(db_conn, 1000);
|
let mut rpc_key_pages = rpc_key::Entity::find().paginate(db_conn, 1000);
|
||||||
|
|
||||||
let mut rpc_key_file_count = 0;
|
let mut rpc_key_file_count = 0;
|
||||||
while let Some(rpc_keys) = rpc_key_pages.fetch_and_next().await? {
|
while let Some(rpc_keys) = rpc_key_pages.fetch_and_next().await? {
|
||||||
|
@ -1,9 +1,16 @@
|
|||||||
|
use anyhow::Context;
|
||||||
use argh::FromArgs;
|
use argh::FromArgs;
|
||||||
|
use entities::{rpc_key, user};
|
||||||
use glob::glob;
|
use glob::glob;
|
||||||
use hashbrown::HashMap;
|
use hashbrown::HashMap;
|
||||||
use log::{info, warn};
|
use log::{info, warn};
|
||||||
use migration::sea_orm::DatabaseConnection;
|
use migration::sea_orm::ActiveValue::NotSet;
|
||||||
|
use migration::sea_orm::{
|
||||||
|
ActiveModelTrait, ColumnTrait, DatabaseConnection, EntityTrait, IntoActiveModel, QueryFilter,
|
||||||
|
Set,
|
||||||
|
};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
use std::{fs::File, io::BufReader};
|
||||||
|
|
||||||
#[derive(FromArgs, PartialEq, Eq, Debug)]
|
#[derive(FromArgs, PartialEq, Eq, Debug)]
|
||||||
/// Import users from another database.
|
/// Import users from another database.
|
||||||
@ -59,7 +66,7 @@ impl UserImportSubCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
info!(
|
info!(
|
||||||
"Imported {} user(s) from {} file(s). {} users mapped.",
|
"Imported {} user(s) from {} file(s). {} user(s) mapped.",
|
||||||
imported_user_count,
|
imported_user_count,
|
||||||
user_file_count,
|
user_file_count,
|
||||||
user_map.len()
|
user_map.len()
|
||||||
@ -105,16 +112,46 @@ impl UserImportSubCommand {
|
|||||||
path: PathBuf,
|
path: PathBuf,
|
||||||
user_map: &mut UserMap,
|
user_map: &mut UserMap,
|
||||||
) -> anyhow::Result<u64> {
|
) -> anyhow::Result<u64> {
|
||||||
let count = 0;
|
let mut count = 0;
|
||||||
|
|
||||||
// TODO: do this all inside a database transaction?
|
// TODO: do this all inside a database transaction?
|
||||||
// for each file in the path, read as json
|
|
||||||
// -- for each entry in the json
|
// TODO: do this with async things from tokio
|
||||||
// ---- let user_id = if user is in the database
|
let file = File::open(path)?;
|
||||||
// ------ add user to the database
|
let reader = BufReader::new(file);
|
||||||
// ---- else
|
|
||||||
// ------ add user to the database
|
// Read the JSON contents of the file as an instance of `User`
|
||||||
// ---- add user to the map.
|
let us = serde_json::from_reader::<_, Vec<user::Model>>(reader)?;
|
||||||
todo!()
|
|
||||||
|
for import_u in us.into_iter() {
|
||||||
|
// first, check if a user already exists with this address
|
||||||
|
if let Some(existing_u) = user::Entity::find()
|
||||||
|
.filter(user::Column::Address.eq(import_u.address.clone()))
|
||||||
|
.one(db_conn)
|
||||||
|
.await?
|
||||||
|
{
|
||||||
|
user_map.insert(import_u.id, existing_u.id);
|
||||||
|
|
||||||
|
// don't increment count because the user already existed
|
||||||
|
} else {
|
||||||
|
// user address is not known to the local database. no existing_u
|
||||||
|
let import_id = import_u.id;
|
||||||
|
|
||||||
|
let mut new_u = import_u.into_active_model();
|
||||||
|
|
||||||
|
new_u.id = NotSet;
|
||||||
|
|
||||||
|
let new_u = new_u.save(db_conn).await?;
|
||||||
|
|
||||||
|
let new_id = *new_u.id.as_ref();
|
||||||
|
|
||||||
|
user_map.insert(import_id, new_id);
|
||||||
|
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(count)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn import_rpc_key_file(
|
pub async fn import_rpc_key_file(
|
||||||
@ -123,14 +160,45 @@ impl UserImportSubCommand {
|
|||||||
path: PathBuf,
|
path: PathBuf,
|
||||||
user_map: &UserMap,
|
user_map: &UserMap,
|
||||||
) -> anyhow::Result<u64> {
|
) -> anyhow::Result<u64> {
|
||||||
let count = 0;
|
let mut count = 0;
|
||||||
// TODO: do this all inside a database transaction?
|
|
||||||
// for each file in the path, read as json
|
// TODO: do this with async things from tokio
|
||||||
// -- for each entry in the json
|
let file = File::open(path)?;
|
||||||
// ---- let rpc_key_id = if rpc_key is in the database
|
let reader = BufReader::new(file);
|
||||||
// ------ continue
|
|
||||||
// ---- else
|
// Read the JSON contents of the file as an instance of `User`
|
||||||
// ------ add rpc_key to the database
|
let rks = serde_json::from_reader::<_, Vec<rpc_key::Model>>(reader)?;
|
||||||
todo!()
|
|
||||||
|
for import_rk in rks.into_iter() {
|
||||||
|
let mapped_id = *user_map
|
||||||
|
.get(&import_rk.user_id)
|
||||||
|
.context("user mapping required")?;
|
||||||
|
|
||||||
|
if let Some(existing_rk) = rpc_key::Entity::find()
|
||||||
|
.filter(rpc_key::Column::SecretKey.eq(import_rk.secret_key))
|
||||||
|
.one(db_conn)
|
||||||
|
.await?
|
||||||
|
{
|
||||||
|
// make sure it belongs to the mapped user
|
||||||
|
if existing_rk.user_id != mapped_id {
|
||||||
|
// TODO: error or import the rest?
|
||||||
|
return Err(anyhow::anyhow!("unexpected user id"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// the key exists under the expected user. we are good to continue
|
||||||
|
} else {
|
||||||
|
// user address is not known to the local database. no existing_rk
|
||||||
|
let mut new_rk = import_rk.into_active_model();
|
||||||
|
|
||||||
|
new_rk.id = NotSet;
|
||||||
|
new_rk.user_id = Set(mapped_id);
|
||||||
|
|
||||||
|
new_rk.save(db_conn).await?;
|
||||||
|
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(count)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user