From 3f667b8d72da6428cafe16208de743a5f72ca74f Mon Sep 17 00:00:00 2001 From: trivernis Date: Tue, 9 Nov 2021 20:00:49 +0100 Subject: [PATCH] Add api to add files Signed-off-by: trivernis --- mediarepo-api/Cargo.toml | 4 +- mediarepo-api/src/client_api/file.rs | 22 +++++++++-- mediarepo-api/src/client_api/mod.rs | 5 +-- .../src/tauri_plugin/commands/file.rs | 37 +++++++++++++++++++ mediarepo-api/src/tauri_plugin/mod.rs | 3 +- mediarepo-api/src/types/files.rs | 11 +++--- 6 files changed, 68 insertions(+), 14 deletions(-) diff --git a/mediarepo-api/Cargo.toml b/mediarepo-api/Cargo.toml index 38db871..adbb3fc 100644 --- a/mediarepo-api/Cargo.toml +++ b/mediarepo-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mediarepo-api" -version = "0.5.3" +version = "0.6.0" edition = "2018" license = "gpl-3" @@ -10,7 +10,7 @@ license = "gpl-3" tracing = "0.1.29" thiserror = "1.0.30" async-trait = {version = "0.1.51", optional=true} -rmp-ipc = {version = "0.9.0", optional=true} +rmp-ipc = {version = "0.9.2", optional=true} parking_lot = {version="0.11.2", optional=true} serde_json = {version="1.0.68", optional=true} directories = {version="4.0.1", optional=true} diff --git a/mediarepo-api/src/client_api/file.rs b/mediarepo-api/src/client_api/file.rs index d75b887..52a044b 100644 --- a/mediarepo-api/src/client_api/file.rs +++ b/mediarepo-api/src/client_api/file.rs @@ -1,9 +1,9 @@ use crate::client_api::error::ApiResult; use crate::client_api::IPCApi; use crate::types::files::{ - FileMetadataResponse, FindFilesByTagsRequest, GetFileThumbnailOfSizeRequest, - GetFileThumbnailsRequest, ReadFileRequest, SortKey, TagQuery, ThumbnailMetadataResponse, - UpdateFileNameRequest, + AddFileRequestHeader, FileMetadataResponse, FileOSMetadata, FindFilesByTagsRequest, + GetFileThumbnailOfSizeRequest, GetFileThumbnailsRequest, ReadFileRequest, SortKey, TagQuery, + ThumbnailMetadataResponse, UpdateFileNameRequest, }; use crate::types::identifier::FileIdentifier; use async_trait::async_trait; @@ -132,4 +132,20 @@ where self.emit_and_get("update_file_name", UpdateFileNameRequest { file_id, name }) .await } + + /// Adds a file with predefined tags + #[tracing::instrument(level = "debug", skip(self, bytes))] + pub async fn add_file( + &self, + metadata: FileOSMetadata, + tags: Vec, + bytes: Vec, + ) -> ApiResult { + let payload = TandemPayload::new( + AddFileRequestHeader { metadata, tags }, + BytePayload::new(bytes), + ); + + self.emit_and_get("add_file", payload).await + } } diff --git a/mediarepo-api/src/client_api/mod.rs b/mediarepo-api/src/client_api/mod.rs index 36e4f66..3360313 100644 --- a/mediarepo-api/src/client_api/mod.rs +++ b/mediarepo-api/src/client_api/mod.rs @@ -14,14 +14,13 @@ use rmp_ipc::ipc::stream_emitter::EmitMetadata; use rmp_ipc::payload::{EventReceivePayload, EventSendPayload}; use rmp_ipc::prelude::{AsyncProtocolStream, AsyncStreamProtocolListener}; use rmp_ipc::IPCBuilder; -use std::fmt::Debug; #[async_trait] pub trait IPCApi { fn namespace() -> &'static str; fn ctx(&self) -> PoolGuard>; - async fn emit( + async fn emit( &self, event_name: &str, data: T, @@ -35,7 +34,7 @@ pub trait IPCApi { Ok(meta) } - async fn emit_and_get( + async fn emit_and_get( &self, event_name: &str, data: T, diff --git a/mediarepo-api/src/tauri_plugin/commands/file.rs b/mediarepo-api/src/tauri_plugin/commands/file.rs index b46f295..a075c96 100644 --- a/mediarepo-api/src/tauri_plugin/commands/file.rs +++ b/mediarepo-api/src/tauri_plugin/commands/file.rs @@ -5,10 +5,17 @@ use crate::types::files::{ FileMetadataResponse, FileOSMetadata, SortKey, TagQuery, ThumbnailMetadataResponse, }; use crate::types::identifier::FileIdentifier; +use serde::{Deserialize, Serialize}; use std::path::PathBuf; use tokio::fs; use tokio::fs::DirEntry; +#[derive(Serialize, Deserialize, Debug)] +pub struct AddFileOptions { + pub read_tags_from_txt: bool, + pub delete_after_import: bool, +} + #[tauri::command] pub async fn get_all_files(api_state: ApiAccess<'_>) -> PluginResult> { let api = api_state.api().await?; @@ -17,6 +24,36 @@ pub async fn get_all_files(api_state: ApiAccess<'_>) -> PluginResult, + metadata: FileOSMetadata, + options: AddFileOptions, +) -> PluginResult { + let api = api_state.api().await?; + let path = PathBuf::from(&metadata.path); + let mut tags = Vec::new(); + + if options.read_tags_from_txt { + let txt_path = PathBuf::from(format!("{}.txt", path.to_string_lossy())); + + if txt_path.exists() { + let content = fs::read_to_string(txt_path).await?; + tags.append( + &mut content + .split('\n') + .map(|line| line.to_owned()) + .collect::>(), + ); + } + } + + let file_content = fs::read(path).await?; + let file = api.file.add_file(metadata, tags, file_content).await?; + + Ok(file) +} + #[tauri::command] pub async fn find_files( tags: Vec, diff --git a/mediarepo-api/src/tauri_plugin/mod.rs b/mediarepo-api/src/tauri_plugin/mod.rs index 004d6f4..50e88d1 100644 --- a/mediarepo-api/src/tauri_plugin/mod.rs +++ b/mediarepo-api/src/tauri_plugin/mod.rs @@ -54,7 +54,8 @@ impl MediarepoPlugin { change_file_tags, create_tags, update_file_name, - resolve_paths_to_files + resolve_paths_to_files, + add_local_file ]), } } diff --git a/mediarepo-api/src/types/files.rs b/mediarepo-api/src/types/files.rs index 6b89079..5bccab0 100644 --- a/mediarepo-api/src/types/files.rs +++ b/mediarepo-api/src/types/files.rs @@ -2,11 +2,6 @@ use crate::types::identifier::FileIdentifier; use chrono::NaiveDateTime; use serde::{Deserialize, Serialize}; -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct AddFileRequest { - pub path: String, -} - #[derive(Clone, Debug, Serialize, Deserialize)] pub struct ReadFileRequest { pub id: FileIdentifier, @@ -109,3 +104,9 @@ pub struct UpdateFileNameRequest { pub file_id: FileIdentifier, pub name: String, } + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct AddFileRequestHeader { + pub metadata: FileOSMetadata, + pub tags: Vec, +}