Use i32 to represent Postgres `INTEGER` types in Rust

Antonio Scandurra created

Change summary

crates/collab/src/api.rs                            | 12 +-
crates/collab/src/db.rs                             | 60 +++++++-------
crates/collab/src/db/project.rs                     |  2 
crates/collab/src/db/project_collaborator.rs        |  2 
crates/collab/src/db/room_participant.rs            |  6 
crates/collab/src/db/tests.rs                       |  2 
crates/collab/src/db/user.rs                        |  4 
crates/collab/src/db/worktree_diagnostic_summary.rs |  4 
crates/collab/src/db/worktree_entry.rs              |  2 
crates/collab/src/integration_tests.rs              |  2 
crates/collab/src/rpc.rs                            |  7 +
11 files changed, 52 insertions(+), 51 deletions(-)

Detailed changes

crates/collab/src/api.rs 🔗

@@ -76,7 +76,7 @@ pub async fn validate_api_token<B>(req: Request<B>, next: Next<B>) -> impl IntoR
 
 #[derive(Debug, Deserialize)]
 struct AuthenticatedUserParams {
-    github_user_id: Option<u32>,
+    github_user_id: Option<i32>,
     github_login: String,
 }
 
@@ -123,14 +123,14 @@ async fn get_users(
 
 #[derive(Deserialize, Debug)]
 struct CreateUserParams {
-    github_user_id: u32,
+    github_user_id: i32,
     github_login: String,
     email_address: String,
     email_confirmation_code: Option<String>,
     #[serde(default)]
     admin: bool,
     #[serde(default)]
-    invite_count: u32,
+    invite_count: i32,
 }
 
 #[derive(Serialize, Debug)]
@@ -204,11 +204,11 @@ async fn create_user(
 #[derive(Deserialize)]
 struct UpdateUserParams {
     admin: Option<bool>,
-    invite_count: Option<u32>,
+    invite_count: Option<i32>,
 }
 
 async fn update_user(
-    Path(user_id): Path<u32>,
+    Path(user_id): Path<i32>,
     Json(params): Json<UpdateUserParams>,
     Extension(app): Extension<Arc<AppState>>,
     Extension(rpc_server): Extension<Arc<rpc::Server>>,
@@ -230,7 +230,7 @@ async fn update_user(
 }
 
 async fn destroy_user(
-    Path(user_id): Path<u32>,
+    Path(user_id): Path<i32>,
     Extension(app): Extension<Arc<AppState>>,
 ) -> Result<()> {
     app.db.destroy_user(UserId(user_id)).await?;

crates/collab/src/db.rs 🔗

@@ -159,7 +159,7 @@ impl Database {
     pub async fn get_user_by_github_account(
         &self,
         github_login: &str,
-        github_user_id: Option<u32>,
+        github_user_id: Option<i32>,
     ) -> Result<Option<User>> {
         self.transact(|tx| async {
             let tx = tx;
@@ -879,7 +879,7 @@ impl Database {
         .await
     }
 
-    pub async fn set_invite_count_for_user(&self, id: UserId, count: u32) -> Result<()> {
+    pub async fn set_invite_count_for_user(&self, id: UserId, count: i32) -> Result<()> {
         self.transact(|tx| async move {
             if count > 0 {
                 user::Entity::update_many()
@@ -910,11 +910,11 @@ impl Database {
         .await
     }
 
-    pub async fn get_invite_code_for_user(&self, id: UserId) -> Result<Option<(String, u32)>> {
+    pub async fn get_invite_code_for_user(&self, id: UserId) -> Result<Option<(String, i32)>> {
         self.transact(|tx| async move {
             match user::Entity::find_by_id(id).one(&tx).await? {
                 Some(user) if user.invite_code.is_some() => {
-                    Ok(Some((user.invite_code.unwrap(), user.invite_count as u32)))
+                    Ok(Some((user.invite_code.unwrap(), user.invite_count)))
                 }
                 _ => Ok(None),
             }
@@ -982,9 +982,9 @@ impl Database {
             room_participant::ActiveModel {
                 room_id: ActiveValue::set(room_id),
                 user_id: ActiveValue::set(user_id),
-                answering_connection_id: ActiveValue::set(Some(connection_id.0)),
+                answering_connection_id: ActiveValue::set(Some(connection_id.0 as i32)),
                 calling_user_id: ActiveValue::set(user_id),
-                calling_connection_id: ActiveValue::set(connection_id.0),
+                calling_connection_id: ActiveValue::set(connection_id.0 as i32),
                 ..Default::default()
             }
             .insert(&tx)
@@ -1009,7 +1009,7 @@ impl Database {
                 room_id: ActiveValue::set(room_id),
                 user_id: ActiveValue::set(called_user_id),
                 calling_user_id: ActiveValue::set(calling_user_id),
-                calling_connection_id: ActiveValue::set(calling_connection_id.0),
+                calling_connection_id: ActiveValue::set(calling_connection_id.0 as i32),
                 initial_project_id: ActiveValue::set(initial_project_id),
                 ..Default::default()
             }
@@ -1126,7 +1126,7 @@ impl Database {
                         .and(room_participant::Column::AnsweringConnectionId.is_null()),
                 )
                 .set(room_participant::ActiveModel {
-                    answering_connection_id: ActiveValue::set(Some(connection_id.0)),
+                    answering_connection_id: ActiveValue::set(Some(connection_id.0 as i32)),
                     ..Default::default()
                 })
                 .exec(&tx)
@@ -1488,7 +1488,7 @@ impl Database {
             let project = project::ActiveModel {
                 room_id: ActiveValue::set(participant.room_id),
                 host_user_id: ActiveValue::set(participant.user_id),
-                host_connection_id: ActiveValue::set(connection_id.0),
+                host_connection_id: ActiveValue::set(connection_id.0 as i32),
                 ..Default::default()
             }
             .insert(&tx)
@@ -1508,7 +1508,7 @@ impl Database {
 
             project_collaborator::ActiveModel {
                 project_id: ActiveValue::set(project.id),
-                connection_id: ActiveValue::set(connection_id.0),
+                connection_id: ActiveValue::set(connection_id.0 as i32),
                 user_id: ActiveValue::set(participant.user_id),
                 replica_id: ActiveValue::set(ReplicaId(0)),
                 is_host: ActiveValue::set(true),
@@ -1536,7 +1536,7 @@ impl Database {
                 .one(&tx)
                 .await?
                 .ok_or_else(|| anyhow!("project not found"))?;
-            if project.host_connection_id == connection_id.0 {
+            if project.host_connection_id == connection_id.0 as i32 {
                 let room_id = project.room_id;
                 project::Entity::delete(project.into_active_model())
                     .exec(&tx)
@@ -1633,7 +1633,7 @@ impl Database {
                     path: ActiveValue::set(entry.path.clone()),
                     inode: ActiveValue::set(entry.inode as i64),
                     mtime_seconds: ActiveValue::set(mtime.seconds as i64),
-                    mtime_nanos: ActiveValue::set(mtime.nanos),
+                    mtime_nanos: ActiveValue::set(mtime.nanos as i32),
                     is_symlink: ActiveValue::set(entry.is_symlink),
                     is_ignored: ActiveValue::set(entry.is_ignored),
                 }
@@ -1696,7 +1696,7 @@ impl Database {
                 .one(&tx)
                 .await?
                 .ok_or_else(|| anyhow!("no such project"))?;
-            if project.host_connection_id != connection_id.0 {
+            if project.host_connection_id != connection_id.0 as i32 {
                 return Err(anyhow!("can't update a project hosted by someone else"))?;
             }
 
@@ -1706,8 +1706,8 @@ impl Database {
                 worktree_id: ActiveValue::set(worktree_id),
                 path: ActiveValue::set(summary.path.clone()),
                 language_server_id: ActiveValue::set(summary.language_server_id as i64),
-                error_count: ActiveValue::set(summary.error_count),
-                warning_count: ActiveValue::set(summary.warning_count),
+                error_count: ActiveValue::set(summary.error_count as i32),
+                warning_count: ActiveValue::set(summary.warning_count as i32),
                 ..Default::default()
             })
             .on_conflict(
@@ -1750,7 +1750,7 @@ impl Database {
                 .one(&tx)
                 .await?
                 .ok_or_else(|| anyhow!("no such project"))?;
-            if project.host_connection_id != connection_id.0 {
+            if project.host_connection_id != connection_id.0 as i32 {
                 return Err(anyhow!("can't update a project hosted by someone else"))?;
             }
 
@@ -1813,7 +1813,7 @@ impl Database {
             }
             let new_collaborator = project_collaborator::ActiveModel {
                 project_id: ActiveValue::set(project_id),
-                connection_id: ActiveValue::set(connection_id.0),
+                connection_id: ActiveValue::set(connection_id.0 as i32),
                 user_id: ActiveValue::set(participant.user_id),
                 replica_id: ActiveValue::set(replica_id),
                 is_host: ActiveValue::set(false),
@@ -1859,7 +1859,7 @@ impl Database {
                             inode: db_entry.inode as u64,
                             mtime: Some(proto::Timestamp {
                                 seconds: db_entry.mtime_seconds as u64,
-                                nanos: db_entry.mtime_nanos,
+                                nanos: db_entry.mtime_nanos as u32,
                             }),
                             is_symlink: db_entry.is_symlink,
                             is_ignored: db_entry.is_ignored,
@@ -1946,7 +1946,7 @@ impl Database {
                 .await?;
             let connection_ids = collaborators
                 .into_iter()
-                .map(|collaborator| ConnectionId(collaborator.connection_id))
+                .map(|collaborator| ConnectionId(collaborator.connection_id as u32))
                 .collect();
 
             self.commit_room_transaction(
@@ -1955,7 +1955,7 @@ impl Database {
                 LeftProject {
                     id: project_id,
                     host_user_id: project.host_user_id,
-                    host_connection_id: ConnectionId(project.host_connection_id),
+                    host_connection_id: ConnectionId(project.host_connection_id as u32),
                     connection_ids,
                 },
             )
@@ -1977,7 +1977,7 @@ impl Database {
 
             if collaborators
                 .iter()
-                .any(|collaborator| collaborator.connection_id == connection_id.0)
+                .any(|collaborator| collaborator.connection_id == connection_id.0 as i32)
             {
                 Ok(collaborators)
             } else {
@@ -2191,8 +2191,8 @@ impl<T> DerefMut for RoomGuard<T> {
 #[derive(Debug, Serialize, Deserialize)]
 pub struct NewUserParams {
     pub github_login: String,
-    pub github_user_id: u32,
-    pub invite_count: u32,
+    pub github_user_id: i32,
+    pub invite_count: i32,
 }
 
 #[derive(Debug)]
@@ -2227,15 +2227,15 @@ macro_rules! id_type {
             Deserialize,
         )]
         #[serde(transparent)]
-        pub struct $name(pub u32);
+        pub struct $name(pub i32);
 
         impl $name {
             #[allow(unused)]
-            pub const MAX: Self = Self(u32::MAX);
+            pub const MAX: Self = Self(i32::MAX);
 
             #[allow(unused)]
             pub fn from_proto(value: u64) -> Self {
-                Self(value as u32)
+                Self(value as i32)
             }
 
             #[allow(unused)]
@@ -2252,7 +2252,7 @@ macro_rules! id_type {
 
         impl From<$name> for sea_query::Value {
             fn from(value: $name) -> Self {
-                sea_query::Value::Unsigned(Some(value.0))
+                sea_query::Value::Int(Some(value.0))
             }
         }
 
@@ -2262,7 +2262,7 @@ macro_rules! id_type {
                 pre: &str,
                 col: &str,
             ) -> Result<Self, sea_orm::TryGetError> {
-                Ok(Self(u32::try_get(res, pre, col)?))
+                Ok(Self(i32::try_get(res, pre, col)?))
             }
         }
 
@@ -2302,11 +2302,11 @@ macro_rules! id_type {
             }
 
             fn array_type() -> sea_query::ArrayType {
-                sea_query::ArrayType::Unsigned
+                sea_query::ArrayType::Int
             }
 
             fn column_type() -> sea_query::ColumnType {
-                sea_query::ColumnType::Unsigned(None)
+                sea_query::ColumnType::Integer(None)
             }
         }
 

crates/collab/src/db/project.rs 🔗

@@ -8,7 +8,7 @@ pub struct Model {
     pub id: ProjectId,
     pub room_id: RoomId,
     pub host_user_id: UserId,
-    pub host_connection_id: u32,
+    pub host_connection_id: i32,
 }
 
 #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]

crates/collab/src/db/project_collaborator.rs 🔗

@@ -7,7 +7,7 @@ pub struct Model {
     #[sea_orm(primary_key)]
     pub id: ProjectCollaboratorId,
     pub project_id: ProjectId,
-    pub connection_id: u32,
+    pub connection_id: i32,
     pub user_id: UserId,
     pub replica_id: ReplicaId,
     pub is_host: bool,

crates/collab/src/db/room_participant.rs 🔗

@@ -8,12 +8,12 @@ pub struct Model {
     pub id: RoomParticipantId,
     pub room_id: RoomId,
     pub user_id: UserId,
-    pub answering_connection_id: Option<u32>,
-    pub location_kind: Option<u32>,
+    pub answering_connection_id: Option<i32>,
+    pub location_kind: Option<i32>,
     pub location_project_id: Option<ProjectId>,
     pub initial_project_id: Option<ProjectId>,
     pub calling_user_id: UserId,
-    pub calling_connection_id: u32,
+    pub calling_connection_id: i32,
 }
 
 #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]

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

@@ -430,7 +430,7 @@ async fn test_fuzzy_search_users() {
             false,
             NewUserParams {
                 github_login: github_login.into(),
-                github_user_id: i as u32,
+                github_user_id: i as i32,
                 invite_count: 0,
             },
         )

crates/collab/src/db/user.rs 🔗

@@ -8,11 +8,11 @@ pub struct Model {
     #[sea_orm(primary_key)]
     pub id: UserId,
     pub github_login: String,
-    pub github_user_id: Option<u32>,
+    pub github_user_id: Option<i32>,
     pub email_address: Option<String>,
     pub admin: bool,
     pub invite_code: Option<String>,
-    pub invite_count: u32,
+    pub invite_count: i32,
     pub inviter_id: Option<UserId>,
     pub connected_once: bool,
     pub metrics_id: Uuid,

crates/collab/src/db/worktree_diagnostic_summary.rs 🔗

@@ -11,8 +11,8 @@ pub struct Model {
     #[sea_orm(primary_key)]
     pub path: String,
     pub language_server_id: i64,
-    pub error_count: u32,
-    pub warning_count: u32,
+    pub error_count: i32,
+    pub warning_count: i32,
 }
 
 #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]

crates/collab/src/db/worktree_entry.rs 🔗

@@ -14,7 +14,7 @@ pub struct Model {
     pub path: String,
     pub inode: i64,
     pub mtime_seconds: i64,
-    pub mtime_nanos: u32,
+    pub mtime_nanos: i32,
     pub is_symlink: bool,
     pub is_ignored: bool,
 }

crates/collab/src/integration_tests.rs 🔗

@@ -5383,7 +5383,7 @@ async fn test_random_collaboration(
                 false,
                 NewUserParams {
                     github_login: username.clone(),
-                    github_user_id: (ix + 1) as u32,
+                    github_user_id: (ix + 1) as i32,
                     invite_count: 0,
                 },
             )

crates/collab/src/rpc.rs 🔗

@@ -381,7 +381,7 @@ impl Server {
                 if let Some((code, count)) = invite_code {
                     this.peer.send(connection_id, proto::UpdateInviteInfo {
                         url: format!("{}{}", this.app_state.config.invite_link_prefix, code),
-                        count,
+                        count: count as u32,
                     })?;
                 }
             }
@@ -1008,7 +1008,7 @@ async fn join_project(
     let collaborators = project
         .collaborators
         .iter()
-        .filter(|collaborator| collaborator.connection_id != session.connection_id.0)
+        .filter(|collaborator| collaborator.connection_id != session.connection_id.0 as i32)
         .map(|collaborator| proto::Collaborator {
             peer_id: collaborator.connection_id as u32,
             replica_id: collaborator.replica_id.0 as u32,
@@ -1313,7 +1313,8 @@ async fn save_buffer(
         .await
         .project_collaborators(project_id, session.connection_id)
         .await?;
-    collaborators.retain(|collaborator| collaborator.connection_id != session.connection_id.0);
+    collaborators
+        .retain(|collaborator| collaborator.connection_id != session.connection_id.0 as i32);
     let project_connection_ids = collaborators
         .into_iter()
         .map(|collaborator| ConnectionId(collaborator.connection_id as u32));