UpsertContainerTypeInput
Create or update a container type (schema for a kind of entity).
input UpsertContainerTypeInput {
appId: BigInt!
typeName: String!
displayName: String!
description: String
instantiableBy: String
defaultPropertyVisibility: String
metadataJson: String
bindPolicyJson: String
}
Fields
UpsertContainerTypeInput.appId ● BigInt! non-null scalar
The app (tenant) that owns the type.
UpsertContainerTypeInput.typeName ● String! non-null scalar
Stable type name (unique per app). Acts as the upsert key.
UpsertContainerTypeInput.displayName ● String! non-null scalar
Human-friendly display name.
UpsertContainerTypeInput.description ● String scalar
Optional description of the type.
UpsertContainerTypeInput.instantiableBy ● String scalar
admin | member | owner (who may instantiate this type).
UpsertContainerTypeInput.defaultPropertyVisibility ● String scalar
public | owner | hidden default for this type's properties.
UpsertContainerTypeInput.metadataJson ● String scalar
JSON object of metadata.
UpsertContainerTypeInput.bindPolicyJson ● String scalar
Who may CREATE a container of this type under a client-supplied bindingKey (gameModelEnsureContainer). Same JSON shape as a function invokePolicyJson — an AuthorityRule tree — except that owner_of_self, is_current_turn and condition are refused, because a bind creates the container and there is no acting container to resolve them against. Omit it (the default) and binding is governed by the type's instantiableBy alone, which is the behaviour before this field existed. Resolving an EXISTING key is unaffected: it is a read. For a shared world object, {"type":"is_host"} or instantiableBy: admin stops one player from squatting the key and becoming its owner.
Member Of
gameModelUpsertContainerType mutation