You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mediarepo/mediarepo-api/src/client_api/tag.rs

76 lines
2.3 KiB
Rust

use crate::client_api::error::ApiResult;
use crate::client_api::IPCApi;
use crate::types::files::{GetFileTagsRequest, GetFilesTagsRequest};
use crate::types::identifier::FileIdentifier;
use crate::types::tags::{ChangeFileTagsRequest, TagResponse};
use async_trait::async_trait;
use rmp_ipc::context::{PoolGuard, PooledContext};
use rmp_ipc::ipc::context::Context;
#[derive(Clone)]
pub struct TagApi {
ctx: PooledContext,
}
#[async_trait]
impl IPCApi for TagApi {
fn namespace() -> &'static str {
"tags"
}
fn ctx(&self) -> PoolGuard<Context> {
self.ctx.acquire()
}
}
impl TagApi {
pub fn new(ctx: PooledContext) -> Self {
Self { ctx }
}
/// Returns a list of all tags stored in the repo
#[tracing::instrument(level = "debug", skip(self))]
pub async fn get_all_tags(&self) -> ApiResult<Vec<TagResponse>> {
self.emit_and_get("all_tags", ()).await
}
/// Returns a list of all tags for a file
#[tracing::instrument(level = "debug", skip(self))]
pub async fn get_tags_for_file(&self, id: FileIdentifier) -> ApiResult<Vec<TagResponse>> {
self.emit_and_get("tags_for_file", GetFileTagsRequest { id })
.await
}
/// Returns a list of all tags that are assigned to the list of files
#[tracing::instrument(level = "debug", skip_all)]
pub async fn get_tags_for_files(&self, hashes: Vec<String>) -> ApiResult<Vec<TagResponse>> {
self.emit_and_get("tags_for_files", GetFilesTagsRequest { hashes })
.await
}
/// Creates a new tag and returns the created tag object
#[tracing::instrument(level = "debug", skip(self))]
pub async fn create_tags(&self, tags: Vec<String>) -> ApiResult<Vec<TagResponse>> {
self.emit_and_get("create_tags", tags).await
}
/// Changes the tags of a file
#[tracing::instrument(level = "debug", skip(self))]
pub async fn change_file_tags(
&self,
file_id: FileIdentifier,
added_tags: Vec<i64>,
removed_tags: Vec<i64>,
) -> ApiResult<Vec<TagResponse>> {
self.emit_and_get(
"change_file_tags",
ChangeFileTagsRequest {
file_id,
added_tags,
removed_tags,
},
)
.await
}
}