feat: add admin work visibility controls

This commit is contained in:
kdletters
2026-05-28 00:49:45 +08:00
parent 8e96c8a67c
commit dbbd48083a
38 changed files with 1807 additions and 89 deletions

View File

@@ -14,9 +14,10 @@ pub use mapper::{
BigFishDraftCompileRecordInput, BigFishGameDraftRecord, BigFishInputSubmitRecordInput,
BigFishLevelBlueprintRecord, BigFishLikeReportRecordInput, BigFishMessageFinalizeRecordInput,
BigFishMessageSubmitRecordInput, BigFishPlayReportRecordInput, BigFishRunStartRecordInput,
BigFishRuntimeEntityRecord, BigFishRuntimeParamsRecord, BigFishRuntimeRunRecord,
BigFishSessionCreateRecordInput, BigFishSessionRecord, BigFishVector2Record,
BigFishWorkRemixRecordInput, BigFishWorkSummaryRecord, CreationEntryConfigRecord,
AdminWorkVisibilityRecord, BigFishRuntimeEntityRecord, BigFishRuntimeParamsRecord,
BigFishRuntimeRunRecord, BigFishSessionCreateRecordInput, BigFishSessionRecord,
BigFishVector2Record, BigFishWorkRemixRecordInput, BigFishWorkSummaryRecord,
CreationEntryConfigRecord,
CustomWorldAgentActionExecuteRecord, CustomWorldAgentActionExecuteRecordInput,
CustomWorldAgentCheckpointRecord, CustomWorldAgentMessageFinalizeRecordInput,
CustomWorldAgentMessageRecord, CustomWorldAgentMessageSubmitRecordInput,

View File

@@ -115,6 +115,7 @@ pub use self::puzzle::{
PuzzleWorkProfileRecord, PuzzleWorkRemixRecordInput, PuzzleWorkUpsertRecordInput,
};
pub use self::runtime::{
AdminWorkVisibilityRecord,
BigFishGameDraftRecord, BigFishRuntimeEntityRecord, BigFishRuntimeParamsRecord,
BigFishRuntimeRunRecord, CreationEntryConfigRecord,
};
@@ -193,7 +194,9 @@ pub(crate) use self::puzzle::{
parse_puzzle_agent_stage_record,
};
pub(crate) use self::runtime::{
build_creation_entry_config_record_from_rows, map_creation_entry_config_procedure_result,
build_admin_work_visibility_list_input, build_admin_work_visibility_update_input,
build_creation_entry_config_record_from_rows, map_admin_work_visibility_list_procedure_result,
map_admin_work_visibility_procedure_result, map_creation_entry_config_procedure_result,
map_runtime_setting_procedure_result, map_runtime_snapshot_delete_procedure_result,
map_runtime_snapshot_procedure_result, map_runtime_snapshot_required_procedure_result,
map_runtime_tracking_event_batch_procedure_result, map_runtime_tracking_event_procedure_result,

View File

@@ -18,6 +18,61 @@ impl From<module_runtime::CreationEntryTypeAdminUpsertInput> for CreationEntryTy
}
}
impl From<module_runtime::AdminWorkVisibilityListInput> for AdminWorkVisibilityListInput {
fn from(input: module_runtime::AdminWorkVisibilityListInput) -> Self {
Self {
admin_user_id: input.admin_user_id,
}
}
}
impl From<module_runtime::AdminWorkVisibilityUpdateInput> for AdminWorkVisibilityUpdateInput {
fn from(input: module_runtime::AdminWorkVisibilityUpdateInput) -> Self {
Self {
admin_user_id: input.admin_user_id,
source_type: input.source_type,
profile_id: input.profile_id,
visible: input.visible,
}
}
}
pub(crate) fn build_admin_work_visibility_list_input(
admin_user_id: String,
) -> Result<module_runtime::AdminWorkVisibilityListInput, String> {
let admin_user_id = admin_user_id.trim().to_string();
if admin_user_id.is_empty() {
return Err("adminUserId 不能为空".to_string());
}
Ok(module_runtime::AdminWorkVisibilityListInput { admin_user_id })
}
pub(crate) fn build_admin_work_visibility_update_input(
admin_user_id: String,
source_type: String,
profile_id: String,
visible: bool,
) -> Result<module_runtime::AdminWorkVisibilityUpdateInput, String> {
let admin_user_id = admin_user_id.trim().to_string();
if admin_user_id.is_empty() {
return Err("adminUserId 不能为空".to_string());
}
let source_type = source_type.trim().to_string();
if source_type.is_empty() {
return Err("sourceType 不能为空".to_string());
}
let profile_id = profile_id.trim().to_string();
if profile_id.is_empty() {
return Err("profileId 不能为空".to_string());
}
Ok(module_runtime::AdminWorkVisibilityUpdateInput {
admin_user_id,
source_type,
profile_id,
visible,
})
}
impl From<module_runtime::RuntimeSettingGetInput> for RuntimeSettingGetInput {
fn from(input: module_runtime::RuntimeSettingGetInput) -> Self {
Self {
@@ -114,6 +169,7 @@ impl From<module_runtime::RuntimeTrackingEventInput> for RuntimeTrackingEventInp
pub type CreationEntryConfigRecord =
shared_contracts::creation_entry_config::CreationEntryConfigResponse;
pub type AdminWorkVisibilityRecord = shared_contracts::admin::AdminWorkVisibilityEntryPayload;
pub(crate) fn map_creation_entry_config_procedure_result(
result: CreationEntryConfigProcedureResult,
@@ -131,6 +187,51 @@ pub(crate) fn map_creation_entry_config_procedure_result(
))
}
pub(crate) fn map_admin_work_visibility_list_procedure_result(
result: AdminWorkVisibilityListProcedureResult,
) -> Result<Vec<AdminWorkVisibilityRecord>, SpacetimeClientError> {
if !result.ok {
return Err(SpacetimeClientError::procedure_failed(result.error_message));
}
Ok(result
.entries
.into_iter()
.map(map_admin_work_visibility_snapshot)
.collect())
}
pub(crate) fn map_admin_work_visibility_procedure_result(
result: AdminWorkVisibilityProcedureResult,
) -> Result<AdminWorkVisibilityRecord, SpacetimeClientError> {
if !result.ok {
return Err(SpacetimeClientError::procedure_failed(result.error_message));
}
result
.record
.map(map_admin_work_visibility_snapshot)
.ok_or_else(|| SpacetimeClientError::missing_snapshot("后台作品可见性快照"))
}
fn map_admin_work_visibility_snapshot(
snapshot: AdminWorkVisibilitySnapshot,
) -> AdminWorkVisibilityRecord {
AdminWorkVisibilityRecord {
source_type: snapshot.source_type,
work_id: snapshot.work_id,
profile_id: snapshot.profile_id,
source_session_id: snapshot.source_session_id,
public_work_code: snapshot.public_work_code,
owner_user_id: snapshot.owner_user_id,
author_display_name: snapshot.author_display_name,
title: snapshot.title,
subtitle: snapshot.subtitle,
cover_image_src: snapshot.cover_image_src,
visible: snapshot.visible,
published_at_micros: snapshot.published_at_micros,
updated_at_micros: snapshot.updated_at_micros,
}
}
pub(crate) fn build_creation_entry_config_record_from_rows(
header: CreationEntryConfig,
mut creation_types: Vec<CreationEntryTypeConfig>,

View File

@@ -14,10 +14,17 @@ pub mod admin_list_profile_invite_codes_procedure;
pub mod admin_list_profile_recharge_products_procedure;
pub mod admin_list_profile_redeem_codes_procedure;
pub mod admin_list_profile_task_configs_procedure;
pub mod admin_list_work_visibility_procedure;
pub mod admin_update_work_visibility_procedure;
pub mod admin_upsert_profile_invite_code_procedure;
pub mod admin_upsert_profile_recharge_product_procedure;
pub mod admin_upsert_profile_redeem_code_procedure;
pub mod admin_upsert_profile_task_config_procedure;
pub mod admin_work_visibility_list_input_type;
pub mod admin_work_visibility_list_procedure_result_type;
pub mod admin_work_visibility_procedure_result_type;
pub mod admin_work_visibility_snapshot_type;
pub mod admin_work_visibility_update_input_type;
pub mod advance_puzzle_next_level_procedure;
pub mod ai_result_reference_input_type;
pub mod ai_result_reference_kind_type;
@@ -1049,10 +1056,17 @@ pub use admin_list_profile_invite_codes_procedure::admin_list_profile_invite_cod
pub use admin_list_profile_recharge_products_procedure::admin_list_profile_recharge_products;
pub use admin_list_profile_redeem_codes_procedure::admin_list_profile_redeem_codes;
pub use admin_list_profile_task_configs_procedure::admin_list_profile_task_configs;
pub use admin_list_work_visibility_procedure::admin_list_work_visibility;
pub use admin_update_work_visibility_procedure::admin_update_work_visibility;
pub use admin_upsert_profile_invite_code_procedure::admin_upsert_profile_invite_code;
pub use admin_upsert_profile_recharge_product_procedure::admin_upsert_profile_recharge_product;
pub use admin_upsert_profile_redeem_code_procedure::admin_upsert_profile_redeem_code;
pub use admin_upsert_profile_task_config_procedure::admin_upsert_profile_task_config;
pub use admin_work_visibility_list_input_type::AdminWorkVisibilityListInput;
pub use admin_work_visibility_list_procedure_result_type::AdminWorkVisibilityListProcedureResult;
pub use admin_work_visibility_procedure_result_type::AdminWorkVisibilityProcedureResult;
pub use admin_work_visibility_snapshot_type::AdminWorkVisibilitySnapshot;
pub use admin_work_visibility_update_input_type::AdminWorkVisibilityUpdateInput;
pub use advance_puzzle_next_level_procedure::advance_puzzle_next_level;
pub use ai_result_reference_input_type::AiResultReferenceInput;
pub use ai_result_reference_kind_type::AiResultReferenceKind;

View File

@@ -0,0 +1,59 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
#![allow(unused, clippy::all)]
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
use super::admin_work_visibility_list_input_type::AdminWorkVisibilityListInput;
use super::admin_work_visibility_list_procedure_result_type::AdminWorkVisibilityListProcedureResult;
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
#[sats(crate = __lib)]
struct AdminListWorkVisibilityArgs {
pub input: AdminWorkVisibilityListInput,
}
impl __sdk::InModule for AdminListWorkVisibilityArgs {
type Module = super::RemoteModule;
}
#[allow(non_camel_case_types)]
/// Extension trait for access to the procedure `admin_list_work_visibility`.
///
/// Implemented for [`super::RemoteProcedures`].
pub trait admin_list_work_visibility {
fn admin_list_work_visibility(&self, input: AdminWorkVisibilityListInput) {
self.admin_list_work_visibility_then(input, |_, _| {});
}
fn admin_list_work_visibility_then(
&self,
input: AdminWorkVisibilityListInput,
__callback: impl FnOnce(
&super::ProcedureEventContext,
Result<AdminWorkVisibilityListProcedureResult, __sdk::InternalError>,
) + Send
+ 'static,
);
}
impl admin_list_work_visibility for super::RemoteProcedures {
fn admin_list_work_visibility_then(
&self,
input: AdminWorkVisibilityListInput,
__callback: impl FnOnce(
&super::ProcedureEventContext,
Result<AdminWorkVisibilityListProcedureResult, __sdk::InternalError>,
) + Send
+ 'static,
) {
self.imp
.invoke_procedure_with_callback::<_, AdminWorkVisibilityListProcedureResult>(
"admin_list_work_visibility",
AdminListWorkVisibilityArgs { input },
__callback,
);
}
}

View File

@@ -0,0 +1,59 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
#![allow(unused, clippy::all)]
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
use super::admin_work_visibility_procedure_result_type::AdminWorkVisibilityProcedureResult;
use super::admin_work_visibility_update_input_type::AdminWorkVisibilityUpdateInput;
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
#[sats(crate = __lib)]
struct AdminUpdateWorkVisibilityArgs {
pub input: AdminWorkVisibilityUpdateInput,
}
impl __sdk::InModule for AdminUpdateWorkVisibilityArgs {
type Module = super::RemoteModule;
}
#[allow(non_camel_case_types)]
/// Extension trait for access to the procedure `admin_update_work_visibility`.
///
/// Implemented for [`super::RemoteProcedures`].
pub trait admin_update_work_visibility {
fn admin_update_work_visibility(&self, input: AdminWorkVisibilityUpdateInput) {
self.admin_update_work_visibility_then(input, |_, _| {});
}
fn admin_update_work_visibility_then(
&self,
input: AdminWorkVisibilityUpdateInput,
__callback: impl FnOnce(
&super::ProcedureEventContext,
Result<AdminWorkVisibilityProcedureResult, __sdk::InternalError>,
) + Send
+ 'static,
);
}
impl admin_update_work_visibility for super::RemoteProcedures {
fn admin_update_work_visibility_then(
&self,
input: AdminWorkVisibilityUpdateInput,
__callback: impl FnOnce(
&super::ProcedureEventContext,
Result<AdminWorkVisibilityProcedureResult, __sdk::InternalError>,
) + Send
+ 'static,
) {
self.imp
.invoke_procedure_with_callback::<_, AdminWorkVisibilityProcedureResult>(
"admin_update_work_visibility",
AdminUpdateWorkVisibilityArgs { input },
__callback,
);
}
}

View File

@@ -0,0 +1,15 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
#![allow(unused, clippy::all)]
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
#[sats(crate = __lib)]
pub struct AdminWorkVisibilityListInput {
pub admin_user_id: String,
}
impl __sdk::InModule for AdminWorkVisibilityListInput {
type Module = super::RemoteModule;
}

View File

@@ -0,0 +1,19 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
#![allow(unused, clippy::all)]
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
use super::admin_work_visibility_snapshot_type::AdminWorkVisibilitySnapshot;
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
#[sats(crate = __lib)]
pub struct AdminWorkVisibilityListProcedureResult {
pub ok: bool,
pub entries: Vec<AdminWorkVisibilitySnapshot>,
pub error_message: Option<String>,
}
impl __sdk::InModule for AdminWorkVisibilityListProcedureResult {
type Module = super::RemoteModule;
}

View File

@@ -0,0 +1,19 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
#![allow(unused, clippy::all)]
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
use super::admin_work_visibility_snapshot_type::AdminWorkVisibilitySnapshot;
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
#[sats(crate = __lib)]
pub struct AdminWorkVisibilityProcedureResult {
pub ok: bool,
pub record: Option<AdminWorkVisibilitySnapshot>,
pub error_message: Option<String>,
}
impl __sdk::InModule for AdminWorkVisibilityProcedureResult {
type Module = super::RemoteModule;
}

View File

@@ -0,0 +1,27 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
#![allow(unused, clippy::all)]
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
#[sats(crate = __lib)]
pub struct AdminWorkVisibilitySnapshot {
pub source_type: String,
pub work_id: String,
pub profile_id: String,
pub source_session_id: Option<String>,
pub public_work_code: String,
pub owner_user_id: String,
pub author_display_name: String,
pub title: String,
pub subtitle: String,
pub cover_image_src: Option<String>,
pub visible: bool,
pub published_at_micros: Option<i64>,
pub updated_at_micros: i64,
}
impl __sdk::InModule for AdminWorkVisibilitySnapshot {
type Module = super::RemoteModule;
}

View File

@@ -0,0 +1,18 @@
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
// WILL NOT BE SAVED. MODIFY TABLES IN YOUR MODULE SOURCE CODE INSTEAD.
#![allow(unused, clippy::all)]
use spacetimedb_sdk::__codegen::{self as __sdk, __lib, __sats, __ws};
#[derive(__lib::ser::Serialize, __lib::de::Deserialize, Clone, PartialEq, Debug)]
#[sats(crate = __lib)]
pub struct AdminWorkVisibilityUpdateInput {
pub admin_user_id: String,
pub source_type: String,
pub profile_id: String,
pub visible: bool,
}
impl __sdk::InModule for AdminWorkVisibilityUpdateInput {
type Module = super::RemoteModule;
}

View File

@@ -87,6 +87,61 @@ impl SpacetimeClient {
Ok(config)
}
pub async fn admin_list_work_visibility(
&self,
admin_user_id: String,
) -> Result<Vec<shared_contracts::admin::AdminWorkVisibilityEntryPayload>, SpacetimeClientError>
{
let procedure_input = build_admin_work_visibility_list_input(admin_user_id)
.map_err(SpacetimeClientError::validation_failed)?
.into();
self.call_after_connect("admin_list_work_visibility", move |connection, sender| {
connection
.procedures()
.admin_list_work_visibility_then(procedure_input, move |_, result| {
let mapped = result
.map_err(SpacetimeClientError::from_sdk_error)
.and_then(map_admin_work_visibility_list_procedure_result);
send_once(&sender, mapped);
});
})
.await
}
pub async fn admin_update_work_visibility(
&self,
admin_user_id: String,
source_type: String,
profile_id: String,
visible: bool,
) -> Result<shared_contracts::admin::AdminWorkVisibilityEntryPayload, SpacetimeClientError>
{
let procedure_input = build_admin_work_visibility_update_input(
admin_user_id,
source_type,
profile_id,
visible,
)
.map_err(SpacetimeClientError::validation_failed)?
.into();
self.call_after_connect(
"admin_update_work_visibility",
move |connection, sender| {
connection
.procedures()
.admin_update_work_visibility_then(procedure_input, move |_, result| {
let mapped = result
.map_err(SpacetimeClientError::from_sdk_error)
.and_then(map_admin_work_visibility_procedure_result);
send_once(&sender, mapped);
});
},
)
.await
}
pub async fn get_runtime_settings(
&self,
user_id: String,