Fix errors from assuming all room_participant rows had a non-null participant_index

Rows representing pending participants have a null participant_index.

Co-authored-by: Conrad <conrad@zed.dev>
This commit is contained in:
Max Brunsfeld 2023-09-28 12:03:53 -07:00
parent a8b35eb8f5
commit ce940da8e9
3 changed files with 27 additions and 14 deletions

View file

@ -128,6 +128,7 @@ impl Database {
calling_connection_server_id: ActiveValue::set(Some(ServerId( calling_connection_server_id: ActiveValue::set(Some(ServerId(
connection.owner_id as i32, connection.owner_id as i32,
))), ))),
participant_index: ActiveValue::set(Some(0)),
..Default::default() ..Default::default()
} }
.insert(&*tx) .insert(&*tx)
@ -289,7 +290,11 @@ impl Database {
ParticipantIndex, ParticipantIndex,
} }
let existing_participant_indices: Vec<i32> = room_participant::Entity::find() let existing_participant_indices: Vec<i32> = room_participant::Entity::find()
.filter(room_participant::Column::RoomId.eq(room_id)) .filter(
room_participant::Column::RoomId
.eq(room_id)
.and(room_participant::Column::ParticipantIndex.is_not_null()),
)
.select_only() .select_only()
.column(room_participant::Column::ParticipantIndex) .column(room_participant::Column::ParticipantIndex)
.into_values::<_, QueryParticipantIndices>() .into_values::<_, QueryParticipantIndices>()
@ -317,7 +322,7 @@ impl Database {
calling_connection_server_id: ActiveValue::set(Some(ServerId( calling_connection_server_id: ActiveValue::set(Some(ServerId(
connection.owner_id as i32, connection.owner_id as i32,
))), ))),
participant_index: ActiveValue::Set(participant_index), participant_index: ActiveValue::Set(Some(participant_index)),
..Default::default() ..Default::default()
}]) }])
.on_conflict( .on_conflict(
@ -326,6 +331,7 @@ impl Database {
room_participant::Column::AnsweringConnectionId, room_participant::Column::AnsweringConnectionId,
room_participant::Column::AnsweringConnectionServerId, room_participant::Column::AnsweringConnectionServerId,
room_participant::Column::AnsweringConnectionLost, room_participant::Column::AnsweringConnectionLost,
room_participant::Column::ParticipantIndex,
]) ])
.to_owned(), .to_owned(),
) )
@ -340,7 +346,7 @@ impl Database {
.add(room_participant::Column::AnsweringConnectionId.is_null()), .add(room_participant::Column::AnsweringConnectionId.is_null()),
) )
.set(room_participant::ActiveModel { .set(room_participant::ActiveModel {
participant_index: ActiveValue::Set(participant_index), participant_index: ActiveValue::Set(Some(participant_index)),
answering_connection_id: ActiveValue::set(Some(connection.id as i32)), answering_connection_id: ActiveValue::set(Some(connection.id as i32)),
answering_connection_server_id: ActiveValue::set(Some(ServerId( answering_connection_server_id: ActiveValue::set(Some(ServerId(
connection.owner_id as i32, connection.owner_id as i32,
@ -1056,10 +1062,15 @@ impl Database {
let mut pending_participants = Vec::new(); let mut pending_participants = Vec::new();
while let Some(db_participant) = db_participants.next().await { while let Some(db_participant) = db_participants.next().await {
let db_participant = db_participant?; let db_participant = db_participant?;
if let Some((answering_connection_id, answering_connection_server_id)) = db_participant if let (
.answering_connection_id Some(answering_connection_id),
.zip(db_participant.answering_connection_server_id) Some(answering_connection_server_id),
{ Some(participant_index),
) = (
db_participant.answering_connection_id,
db_participant.answering_connection_server_id,
db_participant.participant_index,
) {
let location = match ( let location = match (
db_participant.location_kind, db_participant.location_kind,
db_participant.location_project_id, db_participant.location_project_id,
@ -1090,7 +1101,7 @@ impl Database {
peer_id: Some(answering_connection.into()), peer_id: Some(answering_connection.into()),
projects: Default::default(), projects: Default::default(),
location: Some(proto::ParticipantLocation { variant: location }), location: Some(proto::ParticipantLocation { variant: location }),
participant_index: db_participant.participant_index as u32, participant_index: participant_index as u32,
}, },
); );
} else { } else {

View file

@ -18,7 +18,7 @@ pub struct Model {
pub calling_user_id: UserId, pub calling_user_id: UserId,
pub calling_connection_id: i32, pub calling_connection_id: i32,
pub calling_connection_server_id: Option<ServerId>, pub calling_connection_server_id: Option<ServerId>,
pub participant_index: i32, pub participant_index: Option<i32>,
} }
impl Model { impl Model {

View file

@ -102,7 +102,7 @@ async fn test_core_channel_buffers(
channel_buffer_b.read_with(cx_b, |buffer, _| { channel_buffer_b.read_with(cx_b, |buffer, _| {
assert_collaborators( assert_collaborators(
&buffer.collaborators(), &buffer.collaborators(),
&[client_b.user_id(), client_a.user_id()], &[client_a.user_id(), client_b.user_id()],
); );
}); });
@ -759,11 +759,13 @@ async fn test_following_to_channel_notes_without_a_shared_project(
#[track_caller] #[track_caller]
fn assert_collaborators(collaborators: &HashMap<PeerId, Collaborator>, ids: &[Option<UserId>]) { fn assert_collaborators(collaborators: &HashMap<PeerId, Collaborator>, ids: &[Option<UserId>]) {
let mut user_ids = collaborators
.values()
.map(|collaborator| collaborator.user_id)
.collect::<Vec<_>>();
user_ids.sort();
assert_eq!( assert_eq!(
collaborators user_ids,
.values()
.map(|collaborator| collaborator.user_id)
.collect::<Vec<_>>(),
ids.into_iter().map(|id| id.unwrap()).collect::<Vec<_>>() ids.into_iter().map(|id| id.unwrap()).collect::<Vec<_>>()
); );
} }