Add api to manage sorting presets

Signed-off-by: trivernis <trivernis@protonmail.com>
pull/12/head
trivernis 3 years ago
parent 78a5780ff1
commit d22c7499f7
Signed by: Trivernis
GPG Key ID: DFFFCC2C7A02DB45

@ -1,50 +1,50 @@
[package] [package]
name = "mediarepo-api" name = "mediarepo-api"
version = "0.28.0" version = "0.28.1"
edition = "2018" edition = "2018"
license = "gpl-3" license = "gpl-3"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
tracing = "^0.1.29" tracing = "0.1.30"
thiserror = "^1.0.30" thiserror = "1.0.30"
async-trait = {version = "^0.1.52", optional=true} async-trait = { version = "0.1.52", optional = true }
parking_lot = {version="^0.11.2", optional=true} parking_lot = { version = "0.12.0", optional = true }
serde_json = {version="^1.0.73", optional=true} serde_json = { version = "1.0.78", optional = true }
directories = {version="^4.0.1", optional=true} directories = { version = "4.0.1", optional = true }
mime_guess = {version = "^2.0.3", optional=true} mime_guess = { version = "2.0.3", optional = true }
serde_piecewise_default = "^0.2.0" serde_piecewise_default = "0.2.0"
futures = {version = "^0.3.19", optional=true} futures = { version = "0.3.19", optional = true }
url = {version = "^2.2.2", optional=true } url = { version = "2.2.2", optional = true }
pathsearch = {version="^0.2.0", optional=true} pathsearch = { version = "0.2.0", optional = true }
[dependencies.bromine] [dependencies.bromine]
version = "^0.17.1" version = "0.17.1"
optional = true optional = true
features = ["serialize_bincode"] features = ["serialize_bincode"]
[dependencies.serde] [dependencies.serde]
version = "^1.0.132" version = "1.0.136"
features = ["serde_derive"] features = ["serde_derive"]
[dependencies.chrono] [dependencies.chrono]
version = "^0.4.19" version = "0.4.19"
features = ["serde"] features = ["serde"]
[dependencies.tauri] [dependencies.tauri]
version = "^1.0.0-beta.8" version = "1.0.0-beta.8"
optional=true optional=true
default-features = false default-features = false
features = [] features = []
[dependencies.tokio] [dependencies.tokio]
version = "^1.15.0" version = "1.16.1"
optional = true optional = true
features = ["sync", "fs", "net", "io-util", "io-std", "time", "rt", "process"] features = ["sync", "fs", "net", "io-util", "io-std", "time", "rt", "process"]
[dependencies.toml] [dependencies.toml]
version = "^0.5.8" version = "0.5.8"
optional = true optional = true
[features] [features]

@ -4,6 +4,7 @@ pub mod job;
pub mod protocol; pub mod protocol;
pub mod repo; pub mod repo;
pub mod tag; pub mod tag;
pub mod preset;
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;
@ -15,6 +16,7 @@ use async_trait::async_trait;
use bromine::ipc::stream_emitter::EmitMetadata; use bromine::ipc::stream_emitter::EmitMetadata;
use bromine::prelude::*; use bromine::prelude::*;
use tokio::time::Duration; use tokio::time::Duration;
use crate::client_api::preset::PresetApi;
#[async_trait] #[async_trait]
pub trait IPCApi { pub trait IPCApi {
@ -48,6 +50,7 @@ pub struct ApiClient {
pub tag: TagApi, pub tag: TagApi,
pub repo: RepoApi, pub repo: RepoApi,
pub job: JobApi, pub job: JobApi,
pub preset: PresetApi,
} }
impl Clone for ApiClient { impl Clone for ApiClient {
@ -58,6 +61,7 @@ impl Clone for ApiClient {
tag: self.tag.clone(), tag: self.tag.clone(),
repo: self.repo.clone(), repo: self.repo.clone(),
job: self.job.clone(), job: self.job.clone(),
preset: self.preset.clone(),
} }
} }
} }
@ -70,6 +74,7 @@ impl ApiClient {
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()), job: JobApi::new(ctx.clone()),
preset: PresetApi::new(ctx.clone()),
ctx, ctx,
} }
} }

@ -0,0 +1,54 @@
use std::time::Duration;
use bromine::prelude::*;
use crate::client_api::error::ApiResult;
use crate::types::filtering::{SortingPreset, SortKey};
use super::IPCApi;
#[derive(Clone)]
pub struct PresetApi {
ctx: PooledContext,
}
impl IPCApi for PresetApi {
fn namespace() -> &'static str {
"presets"
}
fn ctx(&self) -> PoolGuard<Context> {
self.ctx.acquire()
}
}
impl PresetApi {
pub fn new(ctx: PooledContext) -> Self {
Self { ctx }
}
/// Returns all sorting presets of the repository
#[tracing::instrument(level = "debug", skip(self))]
pub async fn all_sorting_presets(&self) -> ApiResult<Vec<SortingPreset>> {
self.emit_and_get(
"sorting_presets",
(),
Some(Duration::from_secs(1))
)
.await
}
/// Adds a new sorting preset with the given keys
#[tracing::instrument(level = "debug", skip(self))]
pub async fn add_sorting_preset(&self, keys: Vec<SortKey>) -> ApiResult<SortingPreset> {
self.emit_and_get(
"add_sorting_preset",
keys,
Some(Duration::from_secs(1))
)
.await
}
/// Deletes a given sorting preset by id
#[tracing::instrument(level = "debug", skip(self))]
pub async fn delete_sorting_preset(&self, id: i32) -> ApiResult<()> {
self.emit_and_get("delete_sorting_preset", id, Some(Duration::from_secs(1))).await
}
}

@ -5,6 +5,7 @@ pub use file::*;
pub use job::*; pub use job::*;
pub use repo::*; pub use repo::*;
pub use tag::*; pub use tag::*;
pub use preset::*;
use crate::tauri_plugin::state::{ApiState, AppState, BufferState}; use crate::tauri_plugin::state::{ApiState, AppState, BufferState};
@ -13,6 +14,7 @@ pub mod file;
pub mod job; pub mod job;
pub mod repo; pub mod repo;
pub mod tag; pub mod tag;
pub mod preset;
pub type ApiAccess<'a> = State<'a, ApiState>; pub type ApiAccess<'a> = State<'a, ApiState>;
pub type AppAccess<'a> = State<'a, AppState>; pub type AppAccess<'a> = State<'a, AppState>;

@ -0,0 +1,27 @@
use crate::tauri_plugin::commands::ApiAccess;
use crate::tauri_plugin::error::PluginResult;
use crate::types::filtering::{SortingPreset, SortKey};
#[tauri::command]
pub async fn all_sorting_presets(api_state: ApiAccess<'_>) -> PluginResult<Vec<SortingPreset>> {
let api = api_state.api().await?;
let presets = api.preset.all_sorting_presets().await?;
Ok(presets)
}
#[tauri::command]
pub async fn add_sorting_preset(api_state: ApiAccess<'_>, sort_keys: Vec<SortKey>) -> PluginResult<SortingPreset> {
let api = api_state.api().await?;
let preset = api.preset.add_sorting_preset(sort_keys).await?;
Ok(preset)
}
#[tauri::command]
pub async fn delete_sorting_preset(api_state: ApiAccess<'_>, id: i32) -> PluginResult<()> {
let api = api_state.api().await?;
api.preset.delete_sorting_preset(id).await?;
Ok(())
}

@ -70,7 +70,10 @@ impl<R: Runtime> MediarepoPlugin<R> {
run_job, run_job,
update_file_status, update_file_status,
delete_file, delete_file,
get_file_tag_map get_file_tag_map,
all_sorting_presets,
add_sorting_preset,
delete_sorting_preset
]), ]),
} }
} }

@ -71,3 +71,9 @@ pub enum SortDirection {
} }
impl Eq for SortDirection {} impl Eq for SortDirection {}
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct SortingPreset {
pub id: i32,
pub keys: Vec<SortKey>,
}
Loading…
Cancel
Save