Can get sync thread status

This commit is contained in:
2025-11-19 16:34:00 +01:00
parent 1e00d24a8b
commit 7b691962a0
4 changed files with 38 additions and 3 deletions

View File

@@ -37,3 +37,23 @@ pub async fn stop_sync(
}
}
}
#[derive(serde::Serialize)]
struct GetSyncStatusResponse {
started: bool,
}
/// Get sync thread status
pub async fn status(
client: MatrixClientExtractor,
manager: web::Data<ActorRef<MatrixManagerMsg>>,
) -> HttpResult {
let started = ractor::call!(
manager.as_ref(),
MatrixManagerMsg::SyncThreadGetStatus,
client.auth.user.email
)
.expect("RPC to Matrix Manager failed");
Ok(HttpResponse::Ok().json(GetSyncStatusResponse { started }))
}

View File

@@ -39,9 +39,13 @@ impl FromRequest for MatrixClientExtractor {
matrix_manager_actor,
MatrixManagerMsg::GetClient,
auth.user.email.clone()
)
.expect("Failed to query manager actor!")
.expect("Failed to get client!");
);
let client = match client {
Ok(Ok(client)) => client,
Ok(Err(err)) => panic!("Failed to get client! {err:?}"),
Err(err) => panic!("Failed to query manager actor! {err:#?}"),
};
Ok(Self { auth, client })
})

View File

@@ -129,6 +129,10 @@ async fn main() -> std::io::Result<()> {
"/api/matrix_sync/stop",
web::post().to(matrix_sync_thread_controller::stop_sync),
)
.route(
"/api/matrix_sync/status",
web::get().to(matrix_sync_thread_controller::status),
)
})
.workers(4)
.bind(&AppConfig::get().listen_address)?

View File

@@ -16,6 +16,7 @@ pub enum MatrixManagerMsg {
DisconnectClient(UserEmail),
StartSyncThread(UserEmail),
StopSyncThread(UserEmail),
SyncThreadGetStatus(UserEmail, RpcReplyPort<bool>),
SyncThreadTerminated(UserEmail, MatrixSyncTaskID),
}
@@ -127,6 +128,12 @@ impl Actor for MatrixManagerActor {
log::error!("Failed to request sync thread stop: {e}");
}
}
MatrixManagerMsg::SyncThreadGetStatus(email, reply) => {
let started = state.running_sync_threads.contains_key(&email);
if let Err(e) = reply.send(started) {
log::error!("Failed to send sync thread status! {e}");
}
}
MatrixManagerMsg::SyncThreadTerminated(email, task_id) => {
if state.running_sync_threads.get(&email) == Some(&task_id) {
log::info!(