Add simple synchronous job API

Signed-off-by: trivernis <trivernis@protonmail.com>
pull/4/head
trivernis 3 years ago
parent f74bac100b
commit f374488762

@ -1,6 +1,6 @@
[package] [package]
name = "mediarepo-api" name = "mediarepo-api"
version = "0.24.1" version = "0.24.2"
edition = "2018" edition = "2018"
license = "gpl-3" license = "gpl-3"

@ -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<Context> {
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
}
}

@ -1,11 +1,13 @@
pub mod error; pub mod error;
pub mod file; pub mod file;
pub mod job;
pub mod protocol; pub mod protocol;
pub mod repo; pub mod repo;
pub mod tag; pub mod tag;
use crate::client_api::error::{ApiError, ApiResult}; use crate::client_api::error::{ApiError, ApiResult};
use crate::client_api::file::FileApi; use crate::client_api::file::FileApi;
use crate::client_api::job::JobApi;
use crate::client_api::repo::RepoApi; use crate::client_api::repo::RepoApi;
use crate::client_api::tag::TagApi; use crate::client_api::tag::TagApi;
use crate::types::misc::{check_apis_compatible, get_api_version, InfoResponse}; use crate::types::misc::{check_apis_compatible, get_api_version, InfoResponse};
@ -45,6 +47,7 @@ pub struct ApiClient {
pub file: FileApi, pub file: FileApi,
pub tag: TagApi, pub tag: TagApi,
pub repo: RepoApi, pub repo: RepoApi,
pub job: JobApi,
} }
impl Clone for ApiClient { impl Clone for ApiClient {
@ -54,6 +57,7 @@ impl Clone for ApiClient {
file: self.file.clone(), file: self.file.clone(),
tag: self.tag.clone(), tag: self.tag.clone(),
repo: self.repo.clone(), repo: self.repo.clone(),
job: self.job.clone(),
} }
} }
} }
@ -65,6 +69,7 @@ impl ApiClient {
file: FileApi::new(ctx.clone()), file: FileApi::new(ctx.clone()),
tag: TagApi::new(ctx.clone()), tag: TagApi::new(ctx.clone()),
repo: RepoApi::new(ctx.clone()), repo: RepoApi::new(ctx.clone()),
job: JobApi::new(ctx.clone()),
ctx, ctx,
} }
} }

@ -28,19 +28,22 @@ impl RepoApi {
/// Returns metadata about the repository /// Returns metadata about the repository
#[tracing::instrument(level = "debug", skip(self))] #[tracing::instrument(level = "debug", skip(self))]
pub async fn get_repo_metadata(&self) -> ApiResult<RepositoryMetadata> { pub async fn get_repo_metadata(&self) -> ApiResult<RepositoryMetadata> {
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 /// Returns the size of a given type
#[tracing::instrument(level = "debug", skip(self))] #[tracing::instrument(level = "debug", skip(self))]
pub async fn get_size(&self, size_type: SizeType) -> ApiResult<SizeMetadata> { pub async fn get_size(&self, size_type: SizeType) -> ApiResult<SizeMetadata> {
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 /// Returns the state of the frontend that is stored in the repo
#[tracing::instrument(level = "debug", skip(self))] #[tracing::instrument(level = "debug", skip(self))]
pub async fn get_frontend_state(&self) -> ApiResult<FrontendState> { pub async fn get_frontend_state(&self) -> ApiResult<FrontendState> {
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 /// Sets the state of the frontend

@ -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(())
}

@ -2,6 +2,7 @@ use tauri::State;
pub use daemon::*; pub use daemon::*;
pub use file::*; pub use file::*;
pub use job::*;
pub use repo::*; pub use repo::*;
pub use tag::*; pub use tag::*;
@ -9,6 +10,7 @@ use crate::tauri_plugin::state::{ApiState, AppState, BufferState};
pub mod daemon; pub mod daemon;
pub mod file; pub mod file;
pub mod job;
pub mod repo; pub mod repo;
pub mod tag; pub mod tag;

@ -66,7 +66,8 @@ impl<R: Runtime> MediarepoPlugin<R> {
get_files, get_files,
get_repo_metadata, get_repo_metadata,
get_size, get_size,
get_file_metadata get_file_metadata,
run_job
]), ]),
} }
} }

@ -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,
}

@ -1,5 +1,6 @@
pub mod files; pub mod files;
pub mod identifier; pub mod identifier;
pub mod jobs;
pub mod misc; pub mod misc;
pub mod repo; pub mod repo;
pub mod tags; pub mod tags;

@ -27,4 +27,4 @@ pub enum SizeType {
FileFolder, FileFolder,
ThumbFolder, ThumbFolder,
DatabaseFile, DatabaseFile,
} }

Loading…
Cancel
Save