458371a73d
## 变更内容 - 新增 `profile_wallet_refund_outbox` 表与 enqueue/process procedure,退款主路径进入 SpacetimeDB。 - 外部生成失败事务、inline 资产失败和跨节点 worker 统一使用库内 outbox,按 ledger 幂等并在事务内完成退款与删除。 - SpacetimeDB 完全不可达时才写本机 emergency spool,恢复时重新入库;兼容旧 spool 文件并保留 attempt 追踪。 - 更新 SpacetimeDB migration、生成 bindings、架构文档、运维恢复说明和项目决策记录。 ## 验证 - `cargo check -p spacetime-module -p spacetime-client -p api-server --manifest-path server-rs/Cargo.toml` - api-server / spacetime-client / spacetime-module / module-runtime 定向测试 - `npm run check:spacetime-schema` - `npm run check:spacetime-runtime-access` - `npm run check:server-rs-ddd` - `npm run check:encoding` - `git diff --check` Reviewed-on: http://192.168.35.82/git/GenarrativeAI/Genarrative/pulls/204 Co-authored-by: kdletters <kdletters@qq.com> Co-committed-by: kdletters <kdletters@qq.com>
105 lines
3.7 KiB
Rust
105 lines
3.7 KiB
Rust
use axum::{
|
|
Json,
|
|
extract::{Extension, Path, State},
|
|
http::StatusCode,
|
|
};
|
|
use shared_contracts::auth::PublicUserSearchResponse;
|
|
|
|
use crate::{
|
|
api_response::json_success_body, auth_payload::map_public_user_summary_payload,
|
|
http_error::AppError, request_context::RequestContext, state::AppState,
|
|
};
|
|
|
|
pub async fn get_public_user_by_code(
|
|
State(state): State<AppState>,
|
|
Extension(request_context): Extension<RequestContext>,
|
|
Path(code): Path<String>,
|
|
) -> Result<Json<serde_json::Value>, AppError> {
|
|
state
|
|
.refresh_auth_store_from_spacetime()
|
|
.await
|
|
.map_err(|error| {
|
|
AppError::from_status(StatusCode::INTERNAL_SERVER_ERROR)
|
|
.with_message(format!("刷新认证状态失败:{error}"))
|
|
})?;
|
|
let user = state
|
|
.password_entry_service()
|
|
.get_user_by_public_user_code(&code)
|
|
.map_err(map_public_user_search_error)?
|
|
.ok_or_else(|| {
|
|
AppError::from_status(StatusCode::NOT_FOUND).with_message("未找到对应陶泥号用户")
|
|
})?;
|
|
|
|
Ok(json_success_body(
|
|
Some(&request_context),
|
|
PublicUserSearchResponse {
|
|
user: map_public_user_summary_payload(user.user),
|
|
},
|
|
))
|
|
}
|
|
|
|
pub async fn get_public_user_by_id(
|
|
State(state): State<AppState>,
|
|
Extension(request_context): Extension<RequestContext>,
|
|
Path(user_id): Path<String>,
|
|
) -> Result<Json<serde_json::Value>, AppError> {
|
|
let user_id = user_id.trim();
|
|
if user_id.is_empty() {
|
|
return Err(AppError::from_status(StatusCode::BAD_REQUEST).with_message("用户 ID 不能为空"));
|
|
}
|
|
|
|
state
|
|
.refresh_auth_store_from_spacetime()
|
|
.await
|
|
.map_err(|error| {
|
|
AppError::from_status(StatusCode::INTERNAL_SERVER_ERROR)
|
|
.with_message(format!("刷新认证状态失败:{error}"))
|
|
})?;
|
|
|
|
let user = state
|
|
.auth_user_service()
|
|
.get_user_by_id(user_id)
|
|
.map_err(map_public_user_id_search_error)?
|
|
.ok_or_else(|| {
|
|
AppError::from_status(StatusCode::NOT_FOUND).with_message("未找到对应用户")
|
|
})?;
|
|
|
|
Ok(json_success_body(
|
|
Some(&request_context),
|
|
PublicUserSearchResponse {
|
|
user: map_public_user_summary_payload(user),
|
|
},
|
|
))
|
|
}
|
|
|
|
fn map_public_user_search_error(error: module_auth::PasswordEntryError) -> AppError {
|
|
match error {
|
|
module_auth::PasswordEntryError::InvalidPublicUserCode => {
|
|
AppError::from_status(StatusCode::BAD_REQUEST).with_message("陶泥号格式不正确")
|
|
}
|
|
module_auth::PasswordEntryError::Store(_)
|
|
| module_auth::PasswordEntryError::PasswordHash(_)
|
|
| module_auth::PasswordEntryError::InvalidPhoneNumber
|
|
| module_auth::PasswordEntryError::UnsupportedPhoneCountryCode
|
|
| module_auth::PasswordEntryError::InvalidPasswordLength
|
|
| module_auth::PasswordEntryError::InvalidDisplayName
|
|
| module_auth::PasswordEntryError::InvalidAvatarDataUrl
|
|
| module_auth::PasswordEntryError::EmptyProfileUpdate
|
|
| module_auth::PasswordEntryError::InvalidCredentials
|
|
| module_auth::PasswordEntryError::UserNotFound => {
|
|
AppError::from_status(StatusCode::INTERNAL_SERVER_ERROR).with_message(error.to_string())
|
|
}
|
|
}
|
|
}
|
|
|
|
fn map_public_user_id_search_error(error: module_auth::LogoutError) -> AppError {
|
|
match error {
|
|
module_auth::LogoutError::UserNotFound => {
|
|
AppError::from_status(StatusCode::NOT_FOUND).with_message("未找到对应用户")
|
|
}
|
|
module_auth::LogoutError::Store(_) => {
|
|
AppError::from_status(StatusCode::INTERNAL_SERVER_ERROR).with_message(error.to_string())
|
|
}
|
|
}
|
|
}
|