Implement `db2::Database::get_user_metrics_id`

Antonio Scandurra created

Change summary

crates/collab/src/db2.rs       | 19 ++++++++
crates/collab/src/db2/tests.rs | 80 ++++++++++++++++++------------------
2 files changed, 59 insertions(+), 40 deletions(-)

Detailed changes

crates/collab/src/db2.rs 🔗

@@ -178,6 +178,25 @@ impl Database {
         .await
     }
 
+    pub async fn get_user_metrics_id(&self, id: UserId) -> Result<String> {
+        #[derive(Copy, Clone, Debug, EnumIter, DeriveColumn)]
+        enum QueryAs {
+            MetricsId,
+        }
+
+        self.transact(|tx| async move {
+            let metrics_id: Uuid = user::Entity::find_by_id(id)
+                .select_only()
+                .column(user::Column::MetricsId)
+                .into_values::<_, QueryAs>()
+                .one(&tx)
+                .await?
+                .ok_or_else(|| anyhow!("could not find user"))?;
+            Ok(metrics_id.to_string())
+        })
+        .await
+    }
+
     pub async fn share_project(
         &self,
         room_id: RoomId,

crates/collab/src/db2/tests.rs 🔗

@@ -361,46 +361,46 @@ test_both_dbs!(
 //     );
 // });
 
-// test_both_dbs!(test_metrics_id_postgres, test_metrics_id_sqlite, db, {
-//     let NewUserResult {
-//         user_id: user1,
-//         metrics_id: metrics_id1,
-//         ..
-//     } = db
-//         .create_user(
-//             "person1@example.com",
-//             false,
-//             NewUserParams {
-//                 github_login: "person1".into(),
-//                 github_user_id: 101,
-//                 invite_count: 5,
-//             },
-//         )
-//         .await
-//         .unwrap();
-//     let NewUserResult {
-//         user_id: user2,
-//         metrics_id: metrics_id2,
-//         ..
-//     } = db
-//         .create_user(
-//             "person2@example.com",
-//             false,
-//             NewUserParams {
-//                 github_login: "person2".into(),
-//                 github_user_id: 102,
-//                 invite_count: 5,
-//             },
-//         )
-//         .await
-//         .unwrap();
-
-//     assert_eq!(db.get_user_metrics_id(user1).await.unwrap(), metrics_id1);
-//     assert_eq!(db.get_user_metrics_id(user2).await.unwrap(), metrics_id2);
-//     assert_eq!(metrics_id1.len(), 36);
-//     assert_eq!(metrics_id2.len(), 36);
-//     assert_ne!(metrics_id1, metrics_id2);
-// });
+test_both_dbs!(test_metrics_id_postgres, test_metrics_id_sqlite, db, {
+    let NewUserResult {
+        user_id: user1,
+        metrics_id: metrics_id1,
+        ..
+    } = db
+        .create_user(
+            "person1@example.com",
+            false,
+            NewUserParams {
+                github_login: "person1".into(),
+                github_user_id: 101,
+                invite_count: 5,
+            },
+        )
+        .await
+        .unwrap();
+    let NewUserResult {
+        user_id: user2,
+        metrics_id: metrics_id2,
+        ..
+    } = db
+        .create_user(
+            "person2@example.com",
+            false,
+            NewUserParams {
+                github_login: "person2".into(),
+                github_user_id: 102,
+                invite_count: 5,
+            },
+        )
+        .await
+        .unwrap();
+
+    assert_eq!(db.get_user_metrics_id(user1).await.unwrap(), metrics_id1);
+    assert_eq!(db.get_user_metrics_id(user2).await.unwrap(), metrics_id2);
+    assert_eq!(metrics_id1.len(), 36);
+    assert_eq!(metrics_id2.len(), 36);
+    assert_ne!(metrics_id1, metrics_id2);
+});
 
 // #[test]
 // fn test_fuzzy_like_string() {