From c201e3f3d6b6c0f083b64306a23288f55d260b2f Mon Sep 17 00:00:00 2001 From: trivernis Date: Sun, 12 Dec 2021 14:38:59 +0100 Subject: [PATCH] Implement api to store the state of the frontend Signed-off-by: trivernis --- mediarepo-daemon/Cargo.lock | 4 +- mediarepo-daemon/mediarepo-core/Cargo.lock | 4 +- mediarepo-daemon/mediarepo-core/Cargo.toml | 2 +- .../mediarepo-core/src/type_keys.rs | 7 ++ mediarepo-daemon/mediarepo-model/Cargo.lock | 4 +- mediarepo-daemon/mediarepo-socket/Cargo.lock | 4 +- mediarepo-daemon/mediarepo-socket/src/lib.rs | 7 +- .../mediarepo-socket/src/namespaces/mod.rs | 2 + .../mediarepo-socket/src/namespaces/repo.rs | 66 +++++++++++++++++++ mediarepo-daemon/src/main.rs | 9 ++- 10 files changed, 97 insertions(+), 12 deletions(-) diff --git a/mediarepo-daemon/Cargo.lock b/mediarepo-daemon/Cargo.lock index 5a8f45f..e6f0e9e 100644 --- a/mediarepo-daemon/Cargo.lock +++ b/mediarepo-daemon/Cargo.lock @@ -963,8 +963,8 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "mediarepo-api" -version = "0.14.0" -source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=14f2675f5fe1a11ea3302a623d040e77dcc78080#14f2675f5fe1a11ea3302a623d040e77dcc78080" +version = "0.16.0" +source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=9599020726eb9db47b9be7a6c41c2942a477ba09#9599020726eb9db47b9be7a6c41c2942a477ba09" dependencies = [ "bromine", "chrono", diff --git a/mediarepo-daemon/mediarepo-core/Cargo.lock b/mediarepo-daemon/mediarepo-core/Cargo.lock index 8f1e68d..ced4c88 100644 --- a/mediarepo-daemon/mediarepo-core/Cargo.lock +++ b/mediarepo-daemon/mediarepo-core/Cargo.lock @@ -832,8 +832,8 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "mediarepo-api" -version = "0.14.0" -source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=14f2675f5fe1a11ea3302a623d040e77dcc78080#14f2675f5fe1a11ea3302a623d040e77dcc78080" +version = "0.16.0" +source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=9599020726eb9db47b9be7a6c41c2942a477ba09#9599020726eb9db47b9be7a6c41c2942a477ba09" dependencies = [ "bromine", "chrono", diff --git a/mediarepo-daemon/mediarepo-core/Cargo.toml b/mediarepo-daemon/mediarepo-core/Cargo.toml index ff56ace..46187c6 100644 --- a/mediarepo-daemon/mediarepo-core/Cargo.toml +++ b/mediarepo-daemon/mediarepo-core/Cargo.toml @@ -36,7 +36,7 @@ features = ["fs", "io-util", "io-std"] [dependencies.mediarepo-api] git = "https://github.com/Trivernis/mediarepo-api.git" -rev = "14f2675f5fe1a11ea3302a623d040e77dcc78080" +rev = "9599020726eb9db47b9be7a6c41c2942a477ba09" features = ["bromine"] [features] diff --git a/mediarepo-daemon/mediarepo-core/src/type_keys.rs b/mediarepo-daemon/mediarepo-core/src/type_keys.rs index 8e97c2e..9c0515d 100644 --- a/mediarepo-daemon/mediarepo-core/src/type_keys.rs +++ b/mediarepo-daemon/mediarepo-core/src/type_keys.rs @@ -1,4 +1,5 @@ use crate::settings::Settings; +use std::path::PathBuf; use typemap_rev::TypeMapKey; pub struct SettingsKey; @@ -6,3 +7,9 @@ pub struct SettingsKey; impl TypeMapKey for SettingsKey { type Value = Settings; } + +pub struct RepoPathKey; + +impl TypeMapKey for RepoPathKey { + type Value = PathBuf; +} diff --git a/mediarepo-daemon/mediarepo-model/Cargo.lock b/mediarepo-daemon/mediarepo-model/Cargo.lock index 6a7d574..8f48df2 100644 --- a/mediarepo-daemon/mediarepo-model/Cargo.lock +++ b/mediarepo-daemon/mediarepo-model/Cargo.lock @@ -887,8 +887,8 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "mediarepo-api" -version = "0.14.0" -source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=14f2675f5fe1a11ea3302a623d040e77dcc78080#14f2675f5fe1a11ea3302a623d040e77dcc78080" +version = "0.16.0" +source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=9599020726eb9db47b9be7a6c41c2942a477ba09#9599020726eb9db47b9be7a6c41c2942a477ba09" dependencies = [ "bromine", "chrono", diff --git a/mediarepo-daemon/mediarepo-socket/Cargo.lock b/mediarepo-daemon/mediarepo-socket/Cargo.lock index df4f32f..7cc0339 100644 --- a/mediarepo-daemon/mediarepo-socket/Cargo.lock +++ b/mediarepo-daemon/mediarepo-socket/Cargo.lock @@ -829,8 +829,8 @@ checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" [[package]] name = "mediarepo-api" -version = "0.14.0" -source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=14f2675f5fe1a11ea3302a623d040e77dcc78080#14f2675f5fe1a11ea3302a623d040e77dcc78080" +version = "0.16.0" +source = "git+https://github.com/Trivernis/mediarepo-api.git?rev=9599020726eb9db47b9be7a6c41c2942a477ba09#9599020726eb9db47b9be7a6c41c2942a477ba09" dependencies = [ "bromine", "chrono", diff --git a/mediarepo-daemon/mediarepo-socket/src/lib.rs b/mediarepo-daemon/mediarepo-socket/src/lib.rs index 4de2264..6ead748 100644 --- a/mediarepo-daemon/mediarepo-socket/src/lib.rs +++ b/mediarepo-daemon/mediarepo-socket/src/lib.rs @@ -2,10 +2,11 @@ use mediarepo_core::bromine::prelude::*; use mediarepo_core::error::{RepoError, RepoResult}; use mediarepo_core::mediarepo_api::types::misc::InfoResponse; use mediarepo_core::settings::Settings; -use mediarepo_core::type_keys::SettingsKey; +use mediarepo_core::type_keys::{RepoPathKey, SettingsKey}; use mediarepo_model::repo::Repo; use mediarepo_model::type_keys::RepoKey; use std::net::{IpAddr, SocketAddr}; +use std::path::PathBuf; use std::sync::Arc; use tokio::net::TcpListener; use tokio::task::JoinHandle; @@ -18,6 +19,7 @@ mod utils; pub fn start_tcp_server( ip: IpAddr, port_range: (u16, u16), + repo_path: PathBuf, settings: Settings, repo: Repo, ) -> RepoResult<(String, JoinHandle<()>)> { @@ -30,6 +32,7 @@ pub fn start_tcp_server( get_builder::(address) .insert::(Arc::new(repo)) .insert::(settings) + .insert::(repo_path) .build_server() .await .expect("Failed to start tcp server") @@ -42,6 +45,7 @@ pub fn start_tcp_server( #[tracing::instrument(skip(settings, repo))] pub fn create_unix_socket( path: std::path::PathBuf, + repo_path: PathBuf, settings: Settings, repo: Repo, ) -> RepoResult> { @@ -55,6 +59,7 @@ pub fn create_unix_socket( get_builder::(path) .insert::(Arc::new(repo)) .insert::(settings) + .insert::(repo_path) .build_server() .await .expect("Failed to create unix domain socket"); diff --git a/mediarepo-daemon/mediarepo-socket/src/namespaces/mod.rs b/mediarepo-daemon/mediarepo-socket/src/namespaces/mod.rs index 32512fb..51179e0 100644 --- a/mediarepo-daemon/mediarepo-socket/src/namespaces/mod.rs +++ b/mediarepo-daemon/mediarepo-socket/src/namespaces/mod.rs @@ -2,10 +2,12 @@ use mediarepo_core::bromine::prelude::AsyncStreamProtocolListener; use mediarepo_core::bromine::{namespace, namespace::Namespace, IPCBuilder}; pub mod files; +pub mod repo; pub mod tags; pub fn build_namespaces(builder: IPCBuilder) -> IPCBuilder { builder .add_namespace(namespace!(files::FilesNamespace)) .add_namespace(namespace!(tags::TagsNamespace)) + .add_namespace(namespace!(repo::RepoNamespace)) } diff --git a/mediarepo-daemon/mediarepo-socket/src/namespaces/repo.rs b/mediarepo-daemon/mediarepo-socket/src/namespaces/repo.rs index e69de29..a784598 100644 --- a/mediarepo-daemon/mediarepo-socket/src/namespaces/repo.rs +++ b/mediarepo-daemon/mediarepo-socket/src/namespaces/repo.rs @@ -0,0 +1,66 @@ +use mediarepo_core::bromine::prelude::*; +use mediarepo_core::mediarepo_api::types::repo::FrontendState; +use mediarepo_core::type_keys::{RepoPathKey, SettingsKey}; +use std::path::PathBuf; +use tokio::fs; + +pub struct RepoNamespace; + +impl NamespaceProvider for RepoNamespace { + fn name() -> &'static str { + "repo" + } + + fn register(handler: &mut EventHandler) { + events!(handler, + "frontend_state" => Self::frontend_state, + "set_frontend_state" => Self::set_frontend_state + ); + } +} + +impl RepoNamespace { + #[tracing::instrument(skip_all)] + async fn frontend_state(ctx: &Context, _: Event) -> IPCResult<()> { + let path = get_frontend_state_path(ctx).await?; + let state_string = if path.exists() { + Some(fs::read_to_string(path).await?) + } else { + None + }; + ctx.emit_to( + Self::name(), + "frontend_state", + FrontendState { + state: state_string, + }, + ) + .await?; + + Ok(()) + } + + #[tracing::instrument(skip_all)] + async fn set_frontend_state(ctx: &Context, event: Event) -> IPCResult<()> { + let path = get_frontend_state_path(ctx).await?; + let state = event.payload::()?.state; + if let Some(state_string) = state { + fs::write(path, state_string.into_bytes()).await?; + } else { + fs::remove_file(path).await?; + } + + Ok(()) + } +} + +async fn get_frontend_state_path(ctx: &Context) -> IPCResult { + let data = ctx.data.read().await; + let settings = data.get::().unwrap(); + let repo_path = data.get::().unwrap(); + let state_path = repo_path + .join(PathBuf::from(&settings.database_path).parent().unwrap()) + .join("frontend-state.json"); + + Ok(state_path) +} diff --git a/mediarepo-daemon/src/main.rs b/mediarepo-daemon/src/main.rs index 8d6e942..b0f9b99 100644 --- a/mediarepo-daemon/src/main.rs +++ b/mediarepo-daemon/src/main.rs @@ -127,14 +127,19 @@ async fn start_server(opt: Opt) -> RepoResult<()> { #[cfg(unix)] { let socket_path = opt.repo.join("repo.sock"); - let handle = - mediarepo_socket::create_unix_socket(socket_path, settings.clone(), repo.clone())?; + let handle = mediarepo_socket::create_unix_socket( + socket_path, + opt.repo.clone(), + settings.clone(), + repo.clone(), + )?; handles.push(handle); } let (address, tcp_handle) = start_tcp_server( settings.listen_address.clone(), settings.port_range, + opt.repo.clone(), settings, repo, )?;