diff --git a/crates/server/src/rpc.rs b/crates/server/src/rpc.rs index d83142d0d93eb13b77f965dec98cc1755604b102..e5ca51a6e832e8a516c003e5d15ae849fc626d1a 100644 --- a/crates/server/src/rpc.rs +++ b/crates/server/src/rpc.rs @@ -233,8 +233,12 @@ impl Server { mut self: Arc, request: TypedEnvelope, ) -> tide::Result<()> { - self.state_mut() - .unregister_project(request.payload.project_id, request.sender_id); + let project = self + .state_mut() + .unregister_project(request.payload.project_id, request.sender_id) + .ok_or_else(|| anyhow!("no such project"))?; + self.update_contacts_for_users(project.authorized_user_ids().iter()) + .await?; Ok(()) } diff --git a/crates/server/src/rpc/store.rs b/crates/server/src/rpc/store.rs index 4ed6454afd1b50ff50b1f030abe4ef6e38343b9f..e4d740629fbb4816f892c6cfa589596036116795 100644 --- a/crates/server/src/rpc/store.rs +++ b/crates/server/src/rpc/store.rs @@ -115,10 +115,8 @@ impl Store { let mut result = RemovedConnectionState::default(); for project_id in connection.projects.clone() { - if let Some((project, authorized_user_ids)) = - self.unregister_project(project_id, connection_id) - { - result.contact_ids.extend(authorized_user_ids); + if let Some(project) = self.unregister_project(project_id, connection_id) { + result.contact_ids.extend(project.authorized_user_ids()); result.hosted_projects.insert(project_id, project); } else if let Some(project) = self.leave_project(connection_id, project_id) { result @@ -274,17 +272,25 @@ impl Store { &mut self, project_id: u64, connection_id: ConnectionId, - ) -> Option<(Project, Vec)> { + ) -> Option { match self.projects.entry(project_id) { hash_map::Entry::Occupied(e) => { - if e.get().host_connection_id != connection_id { - return None; + if e.get().host_connection_id == connection_id { + for user_id in e.get().authorized_user_ids() { + if let hash_map::Entry::Occupied(mut projects) = + self.visible_projects_by_user_id.entry(user_id) + { + projects.get_mut().remove(&project_id); + } + } + + Some(e.remove()) + } else { + None } } - hash_map::Entry::Vacant(_) => return None, + hash_map::Entry::Vacant(_) => None, } - - todo!() } pub fn unregister_worktree(