Start work on RPC endpoints for dealing with contact requests

Co-authored-by: Nathan Sobo <nathan@zed.dev>
This commit is contained in:
Max Brunsfeld 2022-05-06 15:44:47 -07:00
parent 274c4c244c
commit 8a3425477f
7 changed files with 289 additions and 78 deletions

View file

@ -154,6 +154,8 @@ impl Server {
.add_request_handler(Server::get_channels)
.add_request_handler(Server::get_users)
.add_request_handler(Server::fuzzy_search_users)
.add_request_handler(Server::request_contact)
.add_request_handler(Server::respond_to_contact_request)
.add_request_handler(Server::join_channel)
.add_message_handler(Server::leave_channel)
.add_request_handler(Server::send_channel_message)
@ -914,6 +916,48 @@ impl Server {
Ok(())
}
async fn request_contact(
self: Arc<Server>,
request: TypedEnvelope<proto::RequestContact>,
response: Response<proto::RequestContact>,
) -> Result<()> {
let requester_id = self
.store
.read()
.await
.user_id_for_connection(request.sender_id)?;
let responder_id = UserId::from_proto(request.payload.to_user_id);
self.app_state
.db
.send_contact_request(requester_id, responder_id)
.await?;
response.send(proto::Ack {})?;
Ok(())
}
async fn respond_to_contact_request(
self: Arc<Server>,
request: TypedEnvelope<proto::RespondToContactRequest>,
response: Response<proto::RespondToContactRequest>,
) -> Result<()> {
let responder_id = self
.store
.read()
.await
.user_id_for_connection(request.sender_id)?;
let requester_id = UserId::from_proto(request.payload.requesting_user_id);
self.app_state
.db
.respond_to_contact_request(
responder_id,
requester_id,
request.payload.response == proto::ContactRequestResponse::Accept as i32,
)
.await?;
response.send(proto::Ack {})?;
Ok(())
}
#[instrument(skip(self, state, user_ids))]
fn update_contacts_for_users<'a>(
self: &Arc<Self>,
@ -4911,6 +4955,33 @@ mod tests {
}
}
#[gpui::test(iterations = 10)]
async fn test_contacts_requests(cx_a: &mut TestAppContext, cx_b: &mut TestAppContext) {
cx_a.foreground().forbid_parking();
// Connect to a server as 3 clients.
let mut server = TestServer::start(cx_a.foreground(), cx_a.background()).await;
let client_a = server.create_client(cx_a, "user_a").await;
let client_b = server.create_client(cx_b, "user_b").await;
client_a
.user_store
.read_with(cx_a, |store, _| {
store.request_contact(client_b.user_id().unwrap())
})
.await
.unwrap();
client_a.user_store.read_with(cx_a, |store, _| {
let contacts = store
.contacts()
.iter()
.map(|contact| contact.user.github_login.clone())
.collect::<Vec<_>>();
assert_eq!(contacts, &["user_b"])
});
}
#[gpui::test(iterations = 10)]
async fn test_following(cx_a: &mut TestAppContext, cx_b: &mut TestAppContext) {
cx_a.foreground().forbid_parking();