use crate::{
SignerSummary,
error::{RemoteError, RemoteResult},
};
use signer_core::{SignerKeys, SignerUser};
use signer_crdt::SignerMeta;
type SignerRemoteError = RemoteError;
pub fn generate_new_account() -> RemoteResult<(SignerKeys, SignerUser)> {
let keys = SignerKeys::generate()
.map_err(|e| SignerRemoteError::Internal(format!("生成密钥对失败: {}", e)))?;
let user = SignerUser {
pub_key: keys.pub_key.clone(),
username: "New User".to_string(), update_time: chrono::Utc::now().timestamp(),
..Default::default()
};
Ok((keys, user))
}
pub async fn create_memory_meta(keys: SignerKeys) -> RemoteResult<SignerMeta> {
let meta = SignerMeta::from_mem(keys)
.await
.map_err(|e| SignerRemoteError::Internal(format!("创建内存 Meta 失败: {}", e)))?;
Ok(meta)
}
pub async fn prepare_transfer_data(current_meta: &SignerMeta) -> RemoteResult<SignerSummary> {
let keys = current_meta.keys.clone();
let user = current_meta
.get_current_user()
.await
.map_err(|e| SignerRemoteError::Internal(format!("获取当前用户信息失败: {}", e)))?;
let summary = SignerSummary { keys, user };
Ok(summary)
}
pub async fn receive_and_apply_transfer_data(
received_summary: SignerSummary,
storage_path: &str,
) -> RemoteResult<SignerMeta> {
SignerMeta::save_fs_raw_keys(&received_summary.keys, storage_path).map_err(|e| {
SignerRemoteError::Internal(format!(
"步骤1失败 - 保存密钥到文件系统失败 (路径: {}, 公钥: {}): {}",
storage_path,
&received_summary.keys.pub_key[..8],
e
))
})?;
let new_meta = SignerMeta::from_fs(storage_path).await.map_err(|e| {
SignerRemoteError::Internal(format!(
"步骤2失败 - 从文件系统创建SignerMeta失败 (路径: {}): {}",
storage_path, e
))
})?;
use signer_crdt::UserVO;
let vo = UserVO::from_user_data(&received_summary.keys, &received_summary.user)
.await
.map_err(|e| {
SignerRemoteError::Internal(format!(
"步骤3失败 - 从用户数据创建UserVO失败 (用户名: {}): {}",
received_summary.user.username, e
))
})?;
vo.put(&new_meta).await.map_err(|e| {
SignerRemoteError::Internal(format!(
"步骤3失败 - 保存UserVO到数据库失败 (用户名: {}): {}",
received_summary.user.username, e
))
})?;
Ok(new_meta)
}