Skip to content

Commit dd949fa

Browse files
committed
feat: [#56] transfer tracker keys from v1.0.0 to v2.0.0
1 parent d9b4e87 commit dd949fa

File tree

3 files changed

+84
-10
lines changed

3 files changed

+84
-10
lines changed

src/upgrades/from_v1_0_0_to_v2_0_0/databases/sqlite_v1_0_0.rs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@ pub struct User {
2020
pub administrator: bool,
2121
}
2222

23+
#[derive(Debug, Serialize, Deserialize, sqlx::FromRow)]
24+
pub struct TrackerKey {
25+
pub key_id: i64,
26+
pub user_id: i64,
27+
pub key: String,
28+
pub valid_until: i64,
29+
}
30+
2331
pub struct SqliteDatabaseV1_0_0 {
2432
pub pool: SqlitePool,
2533
}
@@ -43,10 +51,14 @@ impl SqliteDatabaseV1_0_0 {
4351
}
4452

4553
pub async fn get_users(&self) -> Result<Vec<User>, sqlx::Error> {
46-
query_as::<_, User>(
47-
"SELECT * FROM torrust_users ORDER BY user_id ASC",
48-
)
49-
.fetch_all(&self.pool)
50-
.await
54+
query_as::<_, User>("SELECT * FROM torrust_users ORDER BY user_id ASC")
55+
.fetch_all(&self.pool)
56+
.await
57+
}
58+
59+
pub async fn get_tracker_keys(&self) -> Result<Vec<TrackerKey>, sqlx::Error> {
60+
query_as::<_, TrackerKey>("SELECT * FROM torrust_tracker_keys ORDER BY key_id ASC")
61+
.fetch_all(&self.pool)
62+
.await
5163
}
5264
}

src/upgrades/from_v1_0_0_to_v2_0_0/databases/sqlite_v2_0_0.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,23 @@ impl SqliteDatabaseV2_0_0 {
115115
.map(|v| v.last_insert_rowid())
116116
}
117117

118+
pub async fn insert_tracker_key(
119+
&self,
120+
tracker_key_id: i64,
121+
user_id: i64,
122+
tracker_key: &str,
123+
date_expiry: i64,
124+
) -> Result<i64, sqlx::Error> {
125+
query("INSERT INTO torrust_tracker_keys (tracker_key_id, user_id, tracker_key, date_expiry) VALUES (?, ?, ?, ?)")
126+
.bind(tracker_key_id)
127+
.bind(user_id)
128+
.bind(tracker_key)
129+
.bind(date_expiry)
130+
.execute(&self.pool)
131+
.await
132+
.map(|v| v.last_insert_rowid())
133+
}
134+
118135
pub async fn delete_all_database_rows(&self) -> Result<(), DatabaseError> {
119136
query("DELETE FROM torrust_categories;")
120137
.execute(&self.pool)

src/upgrades/from_v1_0_0_to_v2_0_0/upgrader.rs

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,8 @@
77
//! - In v2, the table `torrust_user_profiles` contains two new fields: `bio` and `avatar`.
88
//! Empty string is used as default value.
99
10+
use crate::upgrades::from_v1_0_0_to_v2_0_0::databases::sqlite_v1_0_0::SqliteDatabaseV1_0_0;
1011
use crate::upgrades::from_v1_0_0_to_v2_0_0::databases::sqlite_v2_0_0::SqliteDatabaseV2_0_0;
11-
use crate::{
12-
upgrades::from_v1_0_0_to_v2_0_0::databases::sqlite_v1_0_0::SqliteDatabaseV1_0_0,
13-
};
1412
use chrono::prelude::{DateTime, Utc};
1513
use std::{sync::Arc, time::SystemTime};
1614

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

4341
async fn migrate_destiny_database(dest_database: Arc<SqliteDatabaseV2_0_0>) {
44-
println!("Running migrations ...");
42+
println!("Running migrations in destiny database...");
4543
dest_database.migrate().await;
4644
}
4745

@@ -57,6 +55,8 @@ async fn transfer_categories(
5755
source_database: Arc<SqliteDatabaseV1_0_0>,
5856
dest_database: Arc<SqliteDatabaseV2_0_0>,
5957
) {
58+
println!("Transferring categories ...");
59+
6060
let source_categories = source_database.get_categories_order_by_id().await.unwrap();
6161
println!("[v1] categories: {:?}", &source_categories);
6262

@@ -91,7 +91,9 @@ async fn transfer_user_data(
9191
source_database: Arc<SqliteDatabaseV1_0_0>,
9292
dest_database: Arc<SqliteDatabaseV2_0_0>,
9393
) {
94-
// Transfer `torrust_users`
94+
println!("Transferring users ...");
95+
96+
// Transfer table `torrust_users`
9597

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

@@ -168,6 +170,48 @@ async fn transfer_user_data(
168170
}
169171
}
170172

173+
async fn transfer_tracker_keys(
174+
source_database: Arc<SqliteDatabaseV1_0_0>,
175+
dest_database: Arc<SqliteDatabaseV2_0_0>,
176+
) {
177+
println!("Transferring tracker keys ...");
178+
179+
// Transfer table `torrust_tracker_keys`
180+
181+
let tracker_keys = source_database.get_tracker_keys().await.unwrap();
182+
183+
for tracker_key in &tracker_keys {
184+
// [v2] table torrust_tracker_keys
185+
186+
println!(
187+
"[v2][torrust_users] adding the tracker key: {:?} ...",
188+
&tracker_key.key_id
189+
);
190+
191+
let id = dest_database
192+
.insert_tracker_key(
193+
tracker_key.key_id,
194+
tracker_key.user_id,
195+
&tracker_key.key,
196+
tracker_key.valid_until,
197+
)
198+
.await
199+
.unwrap();
200+
201+
if id != tracker_key.key_id {
202+
panic!(
203+
"Error copying tracker key {:?} from source DB to destiny DB",
204+
&tracker_key.key_id
205+
);
206+
}
207+
208+
println!(
209+
"[v2][torrust_tracker_keys] tracker key: {:?} added.",
210+
&tracker_key.key_id
211+
);
212+
}
213+
}
214+
171215
pub async fn upgrade() {
172216
// Get connections to source adn destiny databases
173217
let source_database = current_db().await;
@@ -179,6 +223,7 @@ pub async fn upgrade() {
179223
reset_destiny_database(dest_database.clone()).await;
180224
transfer_categories(source_database.clone(), dest_database.clone()).await;
181225
transfer_user_data(source_database.clone(), dest_database.clone()).await;
226+
transfer_tracker_keys(source_database.clone(), dest_database.clone()).await;
182227

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

0 commit comments

Comments
 (0)