diff --git a/services/identity/src/client_service.rs b/services/identity/src/client_service.rs --- a/services/identity/src/client_service.rs +++ b/services/identity/src/client_service.rs @@ -125,6 +125,10 @@ return Err(tonic::Status::invalid_argument("username reserved")); } + if let Some(fid) = &message.farcaster_id { + self.check_farcaster_id_taken(fid).await?; + } + let registration_state = construct_user_registration_info( &message, None, @@ -539,6 +543,10 @@ )); } + if let Some(fid) = &message.farcaster_id { + self.check_farcaster_id_taken(fid).await?; + } + let flattened_device_key_upload = construct_flattened_device_key_upload(&message)?; @@ -925,6 +933,24 @@ Ok(()) } + async fn check_farcaster_id_taken( + &self, + farcaster_id: &str, + ) -> Result<(), tonic::Status> { + let fid_already_registered = !self + .client + .get_farcaster_users(vec![farcaster_id.to_string()]) + .await + .map_err(handle_db_error)? + .is_empty(); + if fid_already_registered { + return Err(tonic::Status::already_exists( + "farcaster ID already associated with different user", + )); + } + Ok(()) + } + async fn verify_and_remove_nonce( &self, nonce: &str,