Finalized member migration
This commit is contained in:
@@ -21,14 +21,15 @@ pub async fn migrate_request<'a>(
|
||||
return Err(AuthError::NoPermssions.into());
|
||||
}
|
||||
|
||||
tracing::info!("Migration is requested");
|
||||
|
||||
// Convert the input CSV to a vector of members
|
||||
let members_new: Vec<Member> = Row::from_csv_multiple(&body)?
|
||||
let members_new: Vec<Member> = Row::from_csv_many(&body)?
|
||||
.into_iter()
|
||||
.map(|m| m.into())
|
||||
.collect();
|
||||
|
||||
// TODO: Write function to get members from database
|
||||
let members_old: Vec<Member> = Vec::new();
|
||||
let members_old = convert_vec(DbMember::get_all(&state.pool).await?);
|
||||
|
||||
let members_diff = generate_diff(members_new, members_old);
|
||||
|
||||
@@ -50,6 +51,8 @@ pub async fn migrate_confirm<'a>(
|
||||
return Err(AuthError::NoPermssions.into());
|
||||
}
|
||||
|
||||
tracing::info!("Migration is confirmed");
|
||||
|
||||
// TODO: Implement better error naming
|
||||
let count = match body.trim().parse::<u32>() {
|
||||
Ok(c) => c,
|
||||
@@ -63,16 +66,30 @@ pub async fn migrate_confirm<'a>(
|
||||
None => return Err(crate::Error::NotFound),
|
||||
};
|
||||
|
||||
let inserted_len = members_diff.insert.len();
|
||||
let update_len = members_diff.update.len();
|
||||
let remove_len = members_diff.remove.len();
|
||||
|
||||
migrate_transaction(&state.pool, members_diff).await?;
|
||||
|
||||
tracing::info!(
|
||||
"Migration is successfully executed. Inserted: {}, updated: {}, removed: {}",
|
||||
inserted_len,
|
||||
update_len,
|
||||
remove_len
|
||||
);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn migrate_transaction(pool: &PgPool, members_diff: MembersDiff) -> Result<(), sqlx::Error> {
|
||||
let mut transaction = pool.begin().await?;
|
||||
|
||||
// DbMember::insert_multiple(&mut transaction, convert_vec(members_diff.insert)).await?;
|
||||
DbMember::update_multiple(&mut transaction, convert_vec(members_diff.update)).await?;
|
||||
DbMember::insert_many(&mut transaction, convert_vec(members_diff.insert)).await?;
|
||||
DbMember::update_many(&mut transaction, convert_vec(members_diff.update)).await?;
|
||||
|
||||
let members_remove_ids: Vec<String> = members_diff.remove.into_iter().map(|m| m.id).collect();
|
||||
DbMember::remove_many(&mut transaction, &members_remove_ids).await?;
|
||||
|
||||
transaction.commit().await?;
|
||||
|
||||
@@ -98,7 +115,7 @@ struct Row {
|
||||
diploma: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct MembersDiff {
|
||||
insert: Vec<Member>,
|
||||
update: Vec<Member>,
|
||||
@@ -128,7 +145,7 @@ impl Default for MigrationStore {
|
||||
}
|
||||
|
||||
impl Row {
|
||||
fn from_csv_multiple(input: &str) -> Result<Vec<Self>, csv::Error> {
|
||||
fn from_csv_many(input: &str) -> Result<Vec<Self>, csv::Error> {
|
||||
let mut rdr = csv::ReaderBuilder::new()
|
||||
.delimiter(b';')
|
||||
.from_reader(input.as_bytes());
|
||||
|
Reference in New Issue
Block a user