From f37448876227af2dfbcddde2d9f60176aebbb307 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sat, 8 Jan 2022 18:49:22 +0100 Subject: [PATCH] Add simple synchronous job API Signed-off-by: trivernis --- mediarepo-api/Cargo.toml | 2 +- mediarepo-api/src/client_api/job.rs | 40 +++++++++++++++++++ mediarepo-api/src/client_api/mod.rs | 5 +++ mediarepo-api/src/client_api/repo.rs | 9 +++-- .../src/tauri_plugin/commands/job.rs | 11 +++++ .../src/tauri_plugin/commands/mod.rs | 2 + mediarepo-api/src/tauri_plugin/mod.rs | 3 +- mediarepo-api/src/types/jobs.rs | 14 +++++++ mediarepo-api/src/types/mod.rs | 1 + mediarepo-api/src/types/repo.rs | 2 +- 10 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 mediarepo-api/src/client_api/job.rs create mode 100644 mediarepo-api/src/tauri_plugin/commands/job.rs create mode 100644 mediarepo-api/src/types/jobs.rs diff --git a/mediarepo-api/Cargo.toml b/mediarepo-api/Cargo.toml index eb88c79..b4551b3 100644 --- a/mediarepo-api/Cargo.toml +++ b/mediarepo-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mediarepo-api" -version = "0.24.1" +version = "0.24.2" edition = "2018" license = "gpl-3" diff --git a/mediarepo-api/src/client_api/job.rs b/mediarepo-api/src/client_api/job.rs new file mode 100644 index 0000000..480c2b3 --- /dev/null +++ b/mediarepo-api/src/client_api/job.rs @@ -0,0 +1,40 @@ +use crate::client_api::error::ApiResult; +use crate::client_api::IPCApi; +use crate::types::jobs::{JobType, RunJobRequest}; +use bromine::context::{Context, PoolGuard, PooledContext}; +use std::time::Duration; + +#[derive(Clone)] +pub struct JobApi { + ctx: PooledContext, +} + +impl IPCApi for JobApi { + fn namespace() -> &'static str { + "jobs" + } + + fn ctx(&self) -> PoolGuard { + self.ctx.acquire() + } +} + +impl JobApi { + pub fn new(ctx: PooledContext) -> Self { + Self { ctx } + } + + /// Runs a job of the given type and returns when it has finished + #[tracing::instrument(level = "debug", skip(self))] + pub async fn run_job(&self, job_type: JobType) -> ApiResult<()> { + self.emit_and_get( + "run_job", + RunJobRequest { + job_type, + sync: true, + }, + Some(Duration::from_secs(300)), + ) + .await + } +} diff --git a/mediarepo-api/src/client_api/mod.rs b/mediarepo-api/src/client_api/mod.rs index 62b8f93..7c52aec 100644 --- a/mediarepo-api/src/client_api/mod.rs +++ b/mediarepo-api/src/client_api/mod.rs @@ -1,11 +1,13 @@ pub mod error; pub mod file; +pub mod job; pub mod protocol; pub mod repo; pub mod tag; use crate::client_api::error::{ApiError, ApiResult}; use crate::client_api::file::FileApi; +use crate::client_api::job::JobApi; use crate::client_api::repo::RepoApi; use crate::client_api::tag::TagApi; use crate::types::misc::{check_apis_compatible, get_api_version, InfoResponse}; @@ -45,6 +47,7 @@ pub struct ApiClient { pub file: FileApi, pub tag: TagApi, pub repo: RepoApi, + pub job: JobApi, } impl Clone for ApiClient { @@ -54,6 +57,7 @@ impl Clone for ApiClient { file: self.file.clone(), tag: self.tag.clone(), repo: self.repo.clone(), + job: self.job.clone(), } } } @@ -65,6 +69,7 @@ impl ApiClient { file: FileApi::new(ctx.clone()), tag: TagApi::new(ctx.clone()), repo: RepoApi::new(ctx.clone()), + job: JobApi::new(ctx.clone()), ctx, } } diff --git a/mediarepo-api/src/client_api/repo.rs b/mediarepo-api/src/client_api/repo.rs index 51e71a8..1236f1d 100644 --- a/mediarepo-api/src/client_api/repo.rs +++ b/mediarepo-api/src/client_api/repo.rs @@ -28,19 +28,22 @@ impl RepoApi { /// Returns metadata about the repository #[tracing::instrument(level = "debug", skip(self))] pub async fn get_repo_metadata(&self) -> ApiResult { - self.emit_and_get("repository_metadata", (), Some(Duration::from_secs(3))).await + self.emit_and_get("repository_metadata", (), Some(Duration::from_secs(3))) + .await } /// Returns the size of a given type #[tracing::instrument(level = "debug", skip(self))] pub async fn get_size(&self, size_type: SizeType) -> ApiResult { - self.emit_and_get("size_metadata", size_type, Some(Duration::from_secs(30))).await + self.emit_and_get("size_metadata", size_type, Some(Duration::from_secs(30))) + .await } /// Returns the state of the frontend that is stored in the repo #[tracing::instrument(level = "debug", skip(self))] pub async fn get_frontend_state(&self) -> ApiResult { - self.emit_and_get("frontend_state", (), Some(Duration::from_secs(5))).await + self.emit_and_get("frontend_state", (), Some(Duration::from_secs(5))) + .await } /// Sets the state of the frontend diff --git a/mediarepo-api/src/tauri_plugin/commands/job.rs b/mediarepo-api/src/tauri_plugin/commands/job.rs new file mode 100644 index 0000000..8866b8b --- /dev/null +++ b/mediarepo-api/src/tauri_plugin/commands/job.rs @@ -0,0 +1,11 @@ +use crate::tauri_plugin::commands::ApiAccess; +use crate::tauri_plugin::error::PluginResult; +use crate::types::jobs::JobType; + +#[tauri::command] +pub async fn run_job(api_state: ApiAccess<'_>, job_type: JobType) -> PluginResult<()> { + let api = api_state.api().await?; + api.job.run_job(job_type).await?; + + Ok(()) +} diff --git a/mediarepo-api/src/tauri_plugin/commands/mod.rs b/mediarepo-api/src/tauri_plugin/commands/mod.rs index d90e9ff..bd6a259 100644 --- a/mediarepo-api/src/tauri_plugin/commands/mod.rs +++ b/mediarepo-api/src/tauri_plugin/commands/mod.rs @@ -2,6 +2,7 @@ use tauri::State; pub use daemon::*; pub use file::*; +pub use job::*; pub use repo::*; pub use tag::*; @@ -9,6 +10,7 @@ use crate::tauri_plugin::state::{ApiState, AppState, BufferState}; pub mod daemon; pub mod file; +pub mod job; pub mod repo; pub mod tag; diff --git a/mediarepo-api/src/tauri_plugin/mod.rs b/mediarepo-api/src/tauri_plugin/mod.rs index 38d84ef..95cb06c 100644 --- a/mediarepo-api/src/tauri_plugin/mod.rs +++ b/mediarepo-api/src/tauri_plugin/mod.rs @@ -66,7 +66,8 @@ impl MediarepoPlugin { get_files, get_repo_metadata, get_size, - get_file_metadata + get_file_metadata, + run_job ]), } } diff --git a/mediarepo-api/src/types/jobs.rs b/mediarepo-api/src/types/jobs.rs new file mode 100644 index 0000000..b6260fd --- /dev/null +++ b/mediarepo-api/src/types/jobs.rs @@ -0,0 +1,14 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub struct RunJobRequest { + pub job_type: JobType, + pub sync: bool, +} + +#[derive(Serialize, Deserialize, Clone, Debug)] +pub enum JobType { + MigrateContentDescriptors, + CalculateSizes, + CheckIntegrity, +} diff --git a/mediarepo-api/src/types/mod.rs b/mediarepo-api/src/types/mod.rs index 11a3de9..0c05de4 100644 --- a/mediarepo-api/src/types/mod.rs +++ b/mediarepo-api/src/types/mod.rs @@ -1,5 +1,6 @@ pub mod files; pub mod identifier; +pub mod jobs; pub mod misc; pub mod repo; pub mod tags; diff --git a/mediarepo-api/src/types/repo.rs b/mediarepo-api/src/types/repo.rs index 6fad584..3bfcd6a 100644 --- a/mediarepo-api/src/types/repo.rs +++ b/mediarepo-api/src/types/repo.rs @@ -27,4 +27,4 @@ pub enum SizeType { FileFolder, ThumbFolder, DatabaseFile, -} \ No newline at end of file +}