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>
75 lines
2.5 KiB
Rust
75 lines
2.5 KiB
Rust
use crate::Timestamp;
|
|
|
|
#[spacetimedb::table(accessor = auth_store_projection_meta)]
|
|
pub struct AuthStoreProjectionMeta {
|
|
#[primary_key]
|
|
pub(crate) meta_id: String,
|
|
pub(crate) updated_at: Timestamp,
|
|
#[default(None::<String>)]
|
|
pub(crate) phone_codes_json: Option<String>,
|
|
#[default(None::<String>)]
|
|
pub(crate) wechat_states_json: Option<String>,
|
|
}
|
|
|
|
#[spacetimedb::table(
|
|
accessor = user_account,
|
|
index(accessor = by_user_account_username, btree(columns = [username])),
|
|
index(accessor = by_user_account_public_code, btree(columns = [public_user_code]))
|
|
)]
|
|
pub struct UserAccount {
|
|
#[primary_key]
|
|
pub(crate) user_id: String,
|
|
pub(crate) public_user_code: String,
|
|
pub(crate) username: String,
|
|
pub(crate) display_name: String,
|
|
pub(crate) avatar_url: Option<String>,
|
|
pub(crate) phone_number_masked: Option<String>,
|
|
pub(crate) phone_number_e164: Option<String>,
|
|
pub(crate) login_method: String,
|
|
pub(crate) binding_status: String,
|
|
pub(crate) wechat_bound: bool,
|
|
pub(crate) password_hash: String,
|
|
pub(crate) password_login_enabled: bool,
|
|
pub(crate) token_version: u64,
|
|
#[default(None::<Vec<String>>)]
|
|
pub(crate) user_tags: Option<Vec<String>>,
|
|
#[default(None::<String>)]
|
|
pub(crate) created_at: Option<String>,
|
|
}
|
|
|
|
#[spacetimedb::table(
|
|
accessor = auth_identity,
|
|
index(accessor = by_auth_identity_user_id, btree(columns = [user_id])),
|
|
index(accessor = by_auth_identity_provider_uid, btree(columns = [provider, provider_uid]))
|
|
)]
|
|
pub struct AuthIdentity {
|
|
#[primary_key]
|
|
pub(crate) identity_id: String,
|
|
pub(crate) user_id: String,
|
|
pub(crate) provider: String,
|
|
pub(crate) provider_uid: String,
|
|
pub(crate) provider_union_id: Option<String>,
|
|
pub(crate) phone_e164: Option<String>,
|
|
pub(crate) display_name: Option<String>,
|
|
pub(crate) avatar_url: Option<String>,
|
|
}
|
|
|
|
#[spacetimedb::table(
|
|
accessor = refresh_session,
|
|
index(accessor = by_refresh_session_user_id, btree(columns = [user_id])),
|
|
index(accessor = by_refresh_session_token_hash, btree(columns = [refresh_token_hash]))
|
|
)]
|
|
pub struct RefreshSession {
|
|
#[primary_key]
|
|
pub(crate) session_id: String,
|
|
pub(crate) user_id: String,
|
|
pub(crate) refresh_token_hash: String,
|
|
pub(crate) issued_by_provider: String,
|
|
pub(crate) client_info_json: String,
|
|
pub(crate) expires_at: String,
|
|
pub(crate) revoked_at: Option<String>,
|
|
pub(crate) created_at: String,
|
|
pub(crate) updated_at: String,
|
|
pub(crate) last_seen_at: String,
|
|
}
|