Fix error when deleting rooms containing projects on refresh
A foreign key violation was causing the server to never delete stale rooms during `Database::refresh_room` due to having one or more project records referencing the room.
This commit is contained in:
parent
e74db2d180
commit
bbeb33bc7e
3 changed files with 20 additions and 5 deletions
|
@ -191,6 +191,10 @@ impl Database {
|
||||||
.filter(room_participant::Column::RoomId.eq(room_id))
|
.filter(room_participant::Column::RoomId.eq(room_id))
|
||||||
.exec(&*tx)
|
.exec(&*tx)
|
||||||
.await?;
|
.await?;
|
||||||
|
project::Entity::delete_many()
|
||||||
|
.filter(project::Column::RoomId.eq(room_id))
|
||||||
|
.exec(&*tx)
|
||||||
|
.await?;
|
||||||
room::Entity::delete_by_id(room_id).exec(&*tx).await?;
|
room::Entity::delete_by_id(room_id).exec(&*tx).await?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -270,8 +270,11 @@ impl Server {
|
||||||
let mut live_kit_room = String::new();
|
let mut live_kit_room = String::new();
|
||||||
let mut delete_live_kit_room = false;
|
let mut delete_live_kit_room = false;
|
||||||
|
|
||||||
if let Ok(mut refreshed_room) =
|
if let Some(mut refreshed_room) = app_state
|
||||||
app_state.db.refresh_room(room_id, server_id).await
|
.db
|
||||||
|
.refresh_room(room_id, server_id)
|
||||||
|
.await
|
||||||
|
.trace_err()
|
||||||
{
|
{
|
||||||
tracing::info!(
|
tracing::info!(
|
||||||
room_id = room_id.0,
|
room_id = room_id.0,
|
||||||
|
|
|
@ -733,6 +733,14 @@ async fn test_server_restarts(
|
||||||
deterministic.forbid_parking();
|
deterministic.forbid_parking();
|
||||||
let mut server = TestServer::start(&deterministic).await;
|
let mut server = TestServer::start(&deterministic).await;
|
||||||
let client_a = server.create_client(cx_a, "user_a").await;
|
let client_a = server.create_client(cx_a, "user_a").await;
|
||||||
|
client_a
|
||||||
|
.fs
|
||||||
|
.insert_tree("/a", json!({ "a.txt": "a-contents" }))
|
||||||
|
.await;
|
||||||
|
|
||||||
|
// Invite client B to collaborate on a project
|
||||||
|
let (project_a, _) = client_a.build_local_project("/a", cx_a).await;
|
||||||
|
|
||||||
let client_b = server.create_client(cx_b, "user_b").await;
|
let client_b = server.create_client(cx_b, "user_b").await;
|
||||||
let client_c = server.create_client(cx_c, "user_c").await;
|
let client_c = server.create_client(cx_c, "user_c").await;
|
||||||
let client_d = server.create_client(cx_d, "user_d").await;
|
let client_d = server.create_client(cx_d, "user_d").await;
|
||||||
|
@ -753,19 +761,19 @@ async fn test_server_restarts(
|
||||||
// User A calls users B, C, and D.
|
// User A calls users B, C, and D.
|
||||||
active_call_a
|
active_call_a
|
||||||
.update(cx_a, |call, cx| {
|
.update(cx_a, |call, cx| {
|
||||||
call.invite(client_b.user_id().unwrap(), None, cx)
|
call.invite(client_b.user_id().unwrap(), Some(project_a.clone()), cx)
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
active_call_a
|
active_call_a
|
||||||
.update(cx_a, |call, cx| {
|
.update(cx_a, |call, cx| {
|
||||||
call.invite(client_c.user_id().unwrap(), None, cx)
|
call.invite(client_c.user_id().unwrap(), Some(project_a.clone()), cx)
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
active_call_a
|
active_call_a
|
||||||
.update(cx_a, |call, cx| {
|
.update(cx_a, |call, cx| {
|
||||||
call.invite(client_d.user_id().unwrap(), None, cx)
|
call.invite(client_d.user_id().unwrap(), Some(project_a.clone()), cx)
|
||||||
})
|
})
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue