summaryrefslogtreecommitdiff
path: root/crates/env/src/member/manager.rs
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2025-09-21 16:18:51 +0800
committer魏曹先生 <1992414357@qq.com>2025-09-21 16:18:51 +0800
commita1a4c428827fa6d94eb809793076f497d7e2933d (patch)
tree1965b05ef0a8f466bb7143e3e2dbe981cb1260d7 /crates/env/src/member/manager.rs
parent31efcc0c32c04eba8711891cce3a015e00c8955e (diff)
Add MemberManager
Diffstat (limited to 'crates/env/src/member/manager.rs')
-rw-r--r--crates/env/src/member/manager.rs105
1 files changed, 105 insertions, 0 deletions
diff --git a/crates/env/src/member/manager.rs b/crates/env/src/member/manager.rs
new file mode 100644
index 0000000..a6a2b50
--- /dev/null
+++ b/crates/env/src/member/manager.rs
@@ -0,0 +1,105 @@
+use std::{
+ fs,
+ io::{Error, ErrorKind},
+ path::PathBuf,
+};
+
+use cfg_file::config::ConfigFile;
+
+use crate::{
+ constants::{SERVER_FILE_MEMBER_INFO, SERVER_FILE_MEMBER_PUB},
+ current::current_vault_path,
+ member::Member,
+ vault::config::MemberUuid,
+};
+
+pub struct VaultMemberManager;
+
+const UUID_PARAM: &str = "{member_uuid}";
+
+impl VaultMemberManager {
+ /// Read member from configuration file
+ pub async fn member(uuid: MemberUuid) -> Result<Member, std::io::Error> {
+ if let Some(cfg_file) = Self::member_cfg(uuid)? {
+ let member = Member::read_from(cfg_file).await?;
+ return Ok(member);
+ }
+
+ Err(Error::new(ErrorKind::NotFound, "Member not found!"))
+ }
+
+ /// Register a member to vault
+ pub async fn register_member_to_vault(member: Member) -> Result<(), std::io::Error> {
+ // Ensure member not exist
+ if let Some(_) = Self::member_cfg(member.uuid())? {
+ return Err(Error::new(
+ ErrorKind::DirectoryNotEmpty,
+ format!("Member `{}` already registered!", member.id()),
+ ));
+ }
+
+ // Wrtie config file to member dir
+ let member_cfg_path = Self::member_cfg_path(member.uuid())?;
+ Member::write_to(&member, member_cfg_path).await?;
+
+ Ok(())
+ }
+
+ /// Remove member from vault
+ pub fn remove_member_from_vault(uuid: MemberUuid) -> Result<(), std::io::Error> {
+ // Ensure member exist
+ if let Some(member_cfg_path) = Self::member_cfg(uuid)? {
+ fs::remove_file(member_cfg_path)?;
+ }
+
+ Ok(())
+ }
+
+ /// Try to get the member's configuration file to determine if the member exists
+ pub fn member_cfg(uuid: MemberUuid) -> Result<Option<PathBuf>, std::io::Error> {
+ let cfg_file = Self::member_cfg_path(uuid)?;
+ if cfg_file.exists() {
+ Ok(Some(cfg_file))
+ } else {
+ Ok(None)
+ }
+ }
+
+ /// Try to get the member's public key file to determine if the member has login permission
+ pub fn member_key(uuid: MemberUuid) -> Result<Option<PathBuf>, std::io::Error> {
+ let key_file = Self::member_key_path(uuid)?;
+ if key_file.exists() {
+ Ok(Some(key_file))
+ } else {
+ Ok(None)
+ }
+ }
+
+ /// Get the member's configuration file path, but do not check if the file exists
+ pub fn member_cfg_path(uuid: MemberUuid) -> Result<PathBuf, std::io::Error> {
+ // Has vault
+ let Some(vault) = current_vault_path() else {
+ return Err(Error::new(ErrorKind::NotFound, "Vault not found!"));
+ };
+
+ let path =
+ vault.join(SERVER_FILE_MEMBER_INFO.replace(UUID_PARAM, uuid.to_string().as_str()));
+ Ok(path)
+ }
+
+ /// Get the member's public key file path, but do not check if the file exists
+ pub fn member_key_path(uuid: MemberUuid) -> Result<PathBuf, std::io::Error> {
+ // Has vault
+ let Some(vault) = current_vault_path() else {
+ return Err(Error::new(ErrorKind::NotFound, "Vault not found!"));
+ };
+
+ let path =
+ vault.join(SERVER_FILE_MEMBER_PUB.replace(UUID_PARAM, uuid.to_string().as_str()));
+ Ok(path)
+ }
+}
+
+pub struct UserMemberManager;
+
+impl UserMemberManager {}