Skip to content

Commit

Permalink
feat: [torrust#56] transfer tracker keys from v1.0.0 to v2.0.0
Browse files Browse the repository at this point in the history
  • Loading branch information
josecelano committed Nov 30, 2022
1 parent d9b4e87 commit dd949fa
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 10 deletions.
22 changes: 17 additions & 5 deletions src/upgrades/from_v1_0_0_to_v2_0_0/databases/sqlite_v1_0_0.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,14 @@ pub struct User {
pub administrator: bool,
}

#[derive(Debug, Serialize, Deserialize, sqlx::FromRow)]
pub struct TrackerKey {
pub key_id: i64,
pub user_id: i64,
pub key: String,
pub valid_until: i64,
}

pub struct SqliteDatabaseV1_0_0 {
pub pool: SqlitePool,
}
Expand All @@ -43,10 +51,14 @@ impl SqliteDatabaseV1_0_0 {
}

pub async fn get_users(&self) -> Result<Vec<User>, sqlx::Error> {
query_as::<_, User>(
"SELECT * FROM torrust_users ORDER BY user_id ASC",
)
.fetch_all(&self.pool)
.await
query_as::<_, User>("SELECT * FROM torrust_users ORDER BY user_id ASC")
.fetch_all(&self.pool)
.await
}

pub async fn get_tracker_keys(&self) -> Result<Vec<TrackerKey>, sqlx::Error> {
query_as::<_, TrackerKey>("SELECT * FROM torrust_tracker_keys ORDER BY key_id ASC")
.fetch_all(&self.pool)
.await
}
}
17 changes: 17 additions & 0 deletions src/upgrades/from_v1_0_0_to_v2_0_0/databases/sqlite_v2_0_0.rs
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,23 @@ impl SqliteDatabaseV2_0_0 {
.map(|v| v.last_insert_rowid())
}

pub async fn insert_tracker_key(
&self,
tracker_key_id: i64,
user_id: i64,
tracker_key: &str,
date_expiry: i64,
) -> Result<i64, sqlx::Error> {
query("INSERT INTO torrust_tracker_keys (tracker_key_id, user_id, tracker_key, date_expiry) VALUES (?, ?, ?, ?)")
.bind(tracker_key_id)
.bind(user_id)
.bind(tracker_key)
.bind(date_expiry)
.execute(&self.pool)
.await
.map(|v| v.last_insert_rowid())
}

pub async fn delete_all_database_rows(&self) -> Result<(), DatabaseError> {
query("DELETE FROM torrust_categories;")
.execute(&self.pool)
Expand Down
55 changes: 50 additions & 5 deletions src/upgrades/from_v1_0_0_to_v2_0_0/upgrader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,8 @@
//! - In v2, the table `torrust_user_profiles` contains two new fields: `bio` and `avatar`.
//! Empty string is used as default value.

use crate::upgrades::from_v1_0_0_to_v2_0_0::databases::sqlite_v1_0_0::SqliteDatabaseV1_0_0;
use crate::upgrades::from_v1_0_0_to_v2_0_0::databases::sqlite_v2_0_0::SqliteDatabaseV2_0_0;
use crate::{
upgrades::from_v1_0_0_to_v2_0_0::databases::sqlite_v1_0_0::SqliteDatabaseV1_0_0,
};
use chrono::prelude::{DateTime, Utc};
use std::{sync::Arc, time::SystemTime};

Expand Down Expand Up @@ -41,7 +39,7 @@ async fn new_db(db_filename: String) -> Arc<SqliteDatabaseV2_0_0> {
}

async fn migrate_destiny_database(dest_database: Arc<SqliteDatabaseV2_0_0>) {
println!("Running migrations ...");
println!("Running migrations in destiny database...");
dest_database.migrate().await;
}

Expand All @@ -57,6 +55,8 @@ async fn transfer_categories(
source_database: Arc<SqliteDatabaseV1_0_0>,
dest_database: Arc<SqliteDatabaseV2_0_0>,
) {
println!("Transferring categories ...");

let source_categories = source_database.get_categories_order_by_id().await.unwrap();
println!("[v1] categories: {:?}", &source_categories);

Expand Down Expand Up @@ -91,7 +91,9 @@ async fn transfer_user_data(
source_database: Arc<SqliteDatabaseV1_0_0>,
dest_database: Arc<SqliteDatabaseV2_0_0>,
) {
// Transfer `torrust_users`
println!("Transferring users ...");

// Transfer table `torrust_users`

let users = source_database.get_users().await.unwrap();

Expand Down Expand Up @@ -168,6 +170,48 @@ async fn transfer_user_data(
}
}

async fn transfer_tracker_keys(
source_database: Arc<SqliteDatabaseV1_0_0>,
dest_database: Arc<SqliteDatabaseV2_0_0>,
) {
println!("Transferring tracker keys ...");

// Transfer table `torrust_tracker_keys`

let tracker_keys = source_database.get_tracker_keys().await.unwrap();

for tracker_key in &tracker_keys {
// [v2] table torrust_tracker_keys

println!(
"[v2][torrust_users] adding the tracker key: {:?} ...",
&tracker_key.key_id
);

let id = dest_database
.insert_tracker_key(
tracker_key.key_id,
tracker_key.user_id,
&tracker_key.key,
tracker_key.valid_until,
)
.await
.unwrap();

if id != tracker_key.key_id {
panic!(
"Error copying tracker key {:?} from source DB to destiny DB",
&tracker_key.key_id
);
}

println!(
"[v2][torrust_tracker_keys] tracker key: {:?} added.",
&tracker_key.key_id
);
}
}

pub async fn upgrade() {
// Get connections to source adn destiny databases
let source_database = current_db().await;
Expand All @@ -179,6 +223,7 @@ pub async fn upgrade() {
reset_destiny_database(dest_database.clone()).await;
transfer_categories(source_database.clone(), dest_database.clone()).await;
transfer_user_data(source_database.clone(), dest_database.clone()).await;
transfer_tracker_keys(source_database.clone(), dest_database.clone()).await;

// TODO: WIP. We have to transfer data from the 5 tables in V1 and the torrent files in folder `uploads`.
}

0 comments on commit dd949fa

Please sign in to comment.