Documentation
¶
Overview ¶
Package graph implements the admin GraphQL API. The schema lives in schema.graphqls; generated.go and models_gen.go are generated by gqlgen.
Index ¶
- Variables
- func NewExecutableSchema(cfg Config) graphql.ExecutableSchema
- type Action
- type ActionVisibility
- type AdminAccount
- type AdminAccountInput
- type AdminAccountUpdate
- type ColumnComment
- type ComplexityRoot
- type Config
- type Configuration
- type Datasource
- type DatasourceConnection
- type DatasourceRouting
- type DirectiveRoot
- type DraftInput
- type Entity
- type EntityCapability
- type EntityInput
- type EntityMCPInput
- type EntityMcp
- type EntityVisibility
- type Field
- type FieldInput
- type Grant
- type GrantInput
- type ImportColumn
- type ImportForeignKey
- type ImportKey
- type ImportStatus
- type ImportTable
- type Introspection
- type Mutation
- type MutationResolver
- type PendingRevision
- type Privilege
- type PublishInput
- type Query
- type QueryResolver
- type Relationship
- type RelationshipInput
- type Resolver
- type ResolverRoot
- type Revision
- type RevisionResolver
- type RevisionState
- type Role
- type RoleInput
- type RollbackInput
- type RuntimeState
- type SchemaImport
- type ServerStatus
- type SetAdminPasswordInput
- type Simulation
- type SimulationInput
- type TableComments
- type TableRef
- type User
- type UserInput
- type UserToken
- type Validation
- type VisibilityInput
Constants ¶
This section is empty.
Variables ¶
var AllAction = []Action{ ActionRead, ActionCreate, ActionUpdate, ActionDelete, ActionExecute, ActionAggregate, }
var AllImportStatus = []ImportStatus{ ImportStatusNew, ImportStatusConfigured, }
var AllPrivilege = []Privilege{ PrivilegeGranted, PrivilegeDenied, PrivilegeUnknown, }
var AllRevisionState = []RevisionState{ RevisionStateDraft, RevisionStatePublished, RevisionStateSuperseded, RevisionStateRolledBack, }
Functions ¶
func NewExecutableSchema ¶
func NewExecutableSchema(cfg Config) graphql.ExecutableSchema
NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.
Types ¶
type Action ¶
type Action string
func (Action) MarshalGQL ¶
func (Action) MarshalJSON ¶
func (*Action) UnmarshalGQL ¶
func (*Action) UnmarshalJSON ¶
type ActionVisibility ¶
type ActionVisibility struct {
Action Action `json:"action"`
Result *Simulation `json:"result"`
}
type AdminAccount ¶
type AdminAccountInput ¶
type AdminAccountUpdate ¶
type ColumnComment ¶
type ComplexityRoot ¶
type ComplexityRoot struct {
ActionVisibility struct {
Action func(childComplexity int) int
Result func(childComplexity int) int
}
AdminAccount struct {
CreatedAt func(childComplexity int) int
Disabled func(childComplexity int) int
Permissions func(childComplexity int) int
UpdatedAt func(childComplexity int) int
Username func(childComplexity int) int
}
ColumnComment struct {
Description func(childComplexity int) int
Name func(childComplexity int) int
}
Configuration struct {
Datasources func(childComplexity int) int
Entities func(childComplexity int) int
Roles func(childComplexity int) int
Settings func(childComplexity int) int
Users func(childComplexity int) int
}
Datasource struct {
Connections func(childComplexity int) int
Driver func(childComplexity int) int
Dsn func(childComplexity int) int
Name func(childComplexity int) int
ReadAfterWrite func(childComplexity int) int
Routing func(childComplexity int) int
}
DatasourceConnection struct {
Dsn func(childComplexity int) int
Name func(childComplexity int) int
Pooler func(childComplexity int) int
Role func(childComplexity int) int
}
DatasourceRouting struct {
Execute func(childComplexity int) int
Read func(childComplexity int) int
Write func(childComplexity int) int
}
Entity struct {
Affects func(childComplexity int) int
AllowCascade func(childComplexity int) int
Datasource func(childComplexity int) int
Description func(childComplexity int) int
Fields func(childComplexity int) int
Kind func(childComplexity int) int
LegacyAccess func(childComplexity int) int
Mcp func(childComplexity int) int
Name func(childComplexity int) int
Params func(childComplexity int) int
PrimaryKey func(childComplexity int) int
Relationships func(childComplexity int) int
Schema func(childComplexity int) int
Source func(childComplexity int) int
TenantPolicy func(childComplexity int) int
UniqueKeys func(childComplexity int) int
}
EntityCapability struct {
Action func(childComplexity int) int
Columns func(childComplexity int) int
Connection func(childComplexity int) int
Entity func(childComplexity int) int
Privilege func(childComplexity int) int
Reason func(childComplexity int) int
}
EntityMCP struct {
CustomTool func(childComplexity int) int
DmlTools func(childComplexity int) int
TrustedProcedure func(childComplexity int) int
}
EntityVisibility struct {
Actions func(childComplexity int) int
Entity func(childComplexity int) int
}
Field struct {
Alias func(childComplexity int) int
Description func(childComplexity int) int
Exclude func(childComplexity int) int
Mask func(childComplexity int) int
Name func(childComplexity int) int
}
Grant struct {
Actions func(childComplexity int) int
Entity func(childComplexity int) int
FieldsRestricted func(childComplexity int) int
ReadFields func(childComplexity int) int
Rows func(childComplexity int) int
WriteFields func(childComplexity int) int
}
ImportColumn struct {
Description func(childComplexity int) int
Name func(childComplexity int) int
Nullable func(childComplexity int) int
PrimaryKey func(childComplexity int) int
Type func(childComplexity int) int
}
ImportForeignKey struct {
Columns func(childComplexity int) int
Name func(childComplexity int) int
OnDelete func(childComplexity int) int
OnUpdate func(childComplexity int) int
RefColumns func(childComplexity int) int
RefSchema func(childComplexity int) int
RefTable func(childComplexity int) int
}
ImportKey struct {
Columns func(childComplexity int) int
Name func(childComplexity int) int
Primary func(childComplexity int) int
Reason func(childComplexity int) int
}
ImportTable struct {
Candidate func(childComplexity int) int
Columns func(childComplexity int) int
ConfiguredAs func(childComplexity int) int
Description func(childComplexity int) int
ForeignKeys func(childComplexity int) int
Keys func(childComplexity int) int
Schema func(childComplexity int) int
SideEffects func(childComplexity int) int
Status func(childComplexity int) int
Table func(childComplexity int) int
}
Mutation struct {
CreateAdminAccount func(childComplexity int, input AdminAccountInput) int
CreateDraft func(childComplexity int, draft DraftInput, comment *string) int
GenerateUserToken func(childComplexity int) int
Publish func(childComplexity int, input PublishInput) int
Rollback func(childComplexity int, input RollbackInput) int
SetAdminPassword func(childComplexity int, input SetAdminPasswordInput) int
UpdateAdminAccount func(childComplexity int, input AdminAccountUpdate) int
}
PendingRevision struct {
Error func(childComplexity int) int
ID func(childComplexity int) int
RestartRequired func(childComplexity int) int
}
Query struct {
AdminAccounts func(childComplexity int) int
Capabilities func(childComplexity int) int
ConfigSchema func(childComplexity int) int
Diff func(childComplexity int, from string, to *string, draft *DraftInput) int
Me func(childComplexity int) int
Published func(childComplexity int) int
Revision func(childComplexity int, id string) int
Revisions func(childComplexity int, limit *int) int
SchemaImport func(childComplexity int, datasource string, schemas []string) int
ServerStatus func(childComplexity int) int
Simulate func(childComplexity int, input SimulationInput) int
TableComments func(childComplexity int, tables []TableRef) int
Validate func(childComplexity int, draft DraftInput) int
Visibility func(childComplexity int, input VisibilityInput) int
}
Relationship struct {
Cardinality func(childComplexity int) int
JoinOn func(childComplexity int) int
Name func(childComplexity int) int
Target func(childComplexity int) int
}
Revision struct {
Author func(childComplexity int) int
Comment func(childComplexity int) int
Config func(childComplexity int) int
ContentHash func(childComplexity int) int
CreatedAt func(childComplexity int) int
ID func(childComplexity int) int
Parent func(childComplexity int) int
PublishedAt func(childComplexity int) int
State func(childComplexity int) int
Yaml func(childComplexity int) int
}
Role struct {
Description func(childComplexity int) int
Grants func(childComplexity int) int
Members func(childComplexity int) int
Name func(childComplexity int) int
}
SchemaImport struct {
Datasource func(childComplexity int) int
DefaultSchema func(childComplexity int) int
Tables func(childComplexity int) int
}
ServerStatus struct {
AppliedRevision func(childComplexity int) int
Pending func(childComplexity int) int
Watching func(childComplexity int) int
}
Simulation struct {
Allowed func(childComplexity int) int
FieldScopes func(childComplexity int) int
Fields func(childComplexity int) int
Grants func(childComplexity int) int
Reason func(childComplexity int) int
RowFilter func(childComplexity int) int
}
TableComments struct {
Columns func(childComplexity int) int
Description func(childComplexity int) int
}
User struct {
Description func(childComplexity int) int
Disabled func(childComplexity int) int
Grants func(childComplexity int) int
HasToken func(childComplexity int) int
Name func(childComplexity int) int
Roles func(childComplexity int) int
Subject func(childComplexity int) int
}
UserToken struct {
Token func(childComplexity int) int
TokenHash func(childComplexity int) int
}
Validation struct {
ContentHash func(childComplexity int) int
Error func(childComplexity int) int
Ok func(childComplexity int) int
RestartRequired func(childComplexity int) int
Warnings func(childComplexity int) int
}
}
type Config ¶
type Config = graphql.Config[ResolverRoot, DirectiveRoot, ComplexityRoot]
type Configuration ¶
type Configuration struct {
Datasources []Datasource `json:"datasources"`
Entities []Entity `json:"entities"`
Roles []Role `json:"roles"`
Users []User `json:"users"`
// Every other top-level section (server, tools, cost, budget, cache, ...) as YAML-shaped JSON.
Settings any `json:"settings"`
}
type Datasource ¶
type Datasource struct {
Name string `json:"name"`
Driver string `json:"driver"`
// The read connection's DSN with passwords redacted.
Dsn string `json:"dsn"`
Connections []DatasourceConnection `json:"connections"`
// The connection reads, writes and procedure calls use.
Routing *DatasourceRouting `json:"routing"`
// How long a session reads from the write connection after writing (a Go duration); empty when off.
ReadAfterWrite *string `json:"readAfterWrite,omitempty"`
}
type DatasourceConnection ¶
type DatasourceRouting ¶
type DirectiveRoot ¶
type DirectiveRoot struct {
}
type DraftInput ¶
type DraftInput struct {
Base string `json:"base"`
// Replaces the entities section when provided.
Entities []EntityInput `json:"entities,omitempty"`
// Replaces the roles section when provided.
Roles []RoleInput `json:"roles,omitempty"`
// Replaces the users section when provided; a missing tokenHash keeps the base user's hash.
Users []UserInput `json:"users,omitempty"`
// Replaces the given top-level sections; datasources, entities, roles and users are not allowed here.
Settings any `json:"settings,omitempty"`
}
type Entity ¶
type Entity struct {
Name string `json:"name"`
// The table, view or procedure; null means the entity name.
Source *string `json:"source,omitempty"`
// null means the datasource named default.
Datasource *string `json:"datasource,omitempty"`
Schema *string `json:"schema,omitempty"`
// table, view or procedure; null means table.
Kind *string `json:"kind,omitempty"`
Description *string `json:"description,omitempty"`
PrimaryKey []string `json:"primaryKey"`
// Unique keys, each a field list, that identify one row like the primary key.
UniqueKeys [][]string `json:"uniqueKeys"`
Fields []Field `json:"fields"`
Relationships []Relationship `json:"relationships"`
TenantPolicy any `json:"tenantPolicy,omitempty"`
// Entity-level roles, fieldACL and rowPolicies, kept for compatibility.
LegacyAccess any `json:"legacyAccess,omitempty"`
Mcp *EntityMcp `json:"mcp"`
Params []string `json:"params"`
// Entities a procedure writes; empty invalidates its datasource's cached reads.
Affects []string `json:"affects"`
// Admit deletes and key updates that foreign keys cascade to other tables without checking permissions there.
AllowCascade bool `json:"allowCascade"`
}
type EntityCapability ¶
type EntityCapability struct {
Entity string `json:"entity"`
Action Action `json:"action"`
Privilege Privilege `json:"privilege"`
// The connection the action routes to.
Connection string `json:"connection"`
// Columns granted at column level when the table-level privilege is not.
Columns []string `json:"columns,omitempty"`
Reason *string `json:"reason,omitempty"`
}
type EntityInput ¶
type EntityInput struct {
Name string `json:"name"`
Source *string `json:"source,omitempty"`
Datasource *string `json:"datasource,omitempty"`
Schema *string `json:"schema,omitempty"`
Kind *string `json:"kind,omitempty"`
Description *string `json:"description,omitempty"`
PrimaryKey []string `json:"primaryKey,omitempty"`
UniqueKeys [][]string `json:"uniqueKeys,omitempty"`
Fields []FieldInput `json:"fields,omitempty"`
Relationships []RelationshipInput `json:"relationships,omitempty"`
TenantPolicy any `json:"tenantPolicy,omitempty"`
LegacyAccess any `json:"legacyAccess,omitempty"`
Mcp *EntityMCPInput `json:"mcp,omitempty"`
Params []string `json:"params,omitempty"`
Affects []string `json:"affects,omitempty"`
AllowCascade *bool `json:"allowCascade,omitempty"`
}
type EntityMCPInput ¶
type EntityVisibility ¶
type EntityVisibility struct {
Entity string `json:"entity"`
// One result per action that applies to the entity kind.
Actions []ActionVisibility `json:"actions"`
}
type FieldInput ¶
type Grant ¶
type Grant struct {
Entity string `json:"entity"`
Actions []Action `json:"actions"`
// False grants every visible field; true limits to readFields/writeFields.
FieldsRestricted bool `json:"fieldsRestricted"`
ReadFields []string `json:"readFields"`
WriteFields []string `json:"writeFields"`
Rows any `json:"rows,omitempty"`
}
type GrantInput ¶
type ImportColumn ¶
type ImportForeignKey ¶
type ImportForeignKey struct {
Name string `json:"name"`
Columns []string `json:"columns"`
RefSchema string `json:"refSchema"`
RefTable string `json:"refTable"`
RefColumns []string `json:"refColumns"`
// Referential action that writes referencing rows (cascade, set_null, set_default); null when it only checks.
OnDelete *string `json:"onDelete,omitempty"`
OnUpdate *string `json:"onUpdate,omitempty"`
}
type ImportStatus ¶
type ImportStatus string
const ( // No configured entity reads this table. ImportStatusNew ImportStatus = "NEW" // An entity of the same datasource already reads this table. ImportStatusConfigured ImportStatus = "CONFIGURED" )
func (ImportStatus) IsValid ¶
func (e ImportStatus) IsValid() bool
func (ImportStatus) MarshalGQL ¶
func (e ImportStatus) MarshalGQL(w io.Writer)
func (ImportStatus) MarshalJSON ¶
func (e ImportStatus) MarshalJSON() ([]byte, error)
func (ImportStatus) String ¶
func (e ImportStatus) String() string
func (*ImportStatus) UnmarshalGQL ¶
func (e *ImportStatus) UnmarshalGQL(v any) error
func (*ImportStatus) UnmarshalJSON ¶
func (e *ImportStatus) UnmarshalJSON(b []byte) error
type ImportTable ¶
type ImportTable struct {
Schema string `json:"schema"`
Table string `json:"table"`
Description string `json:"description"`
Status ImportStatus `json:"status"`
// The configured entity name when status is CONFIGURED.
ConfiguredAs *string `json:"configuredAs,omitempty"`
Columns []ImportColumn `json:"columns"`
// The primary key and unique keys, including those that cannot identify a row.
Keys []ImportKey `json:"keys"`
ForeignKeys []ImportForeignKey `json:"foreignKeys"`
// Triggers or rules: a write may change other tables.
SideEffects bool `json:"sideEffects"`
// A zero-permission entity proposal; add it to a draft to configure it.
Candidate *Entity `json:"candidate"`
}
type Introspection ¶
type Introspection func(ctx context.Context, datasource string, fn func(introspect.Introspector) error) error
Introspection runs fn with the introspector of a connected datasource.
type MutationResolver ¶
type MutationResolver interface {
CreateDraft(ctx context.Context, draft DraftInput, comment *string) (*Revision, error)
Publish(ctx context.Context, input PublishInput) (*Revision, error)
Rollback(ctx context.Context, input RollbackInput) (*Revision, error)
GenerateUserToken(ctx context.Context) (*UserToken, error)
CreateAdminAccount(ctx context.Context, input AdminAccountInput) (*AdminAccount, error)
UpdateAdminAccount(ctx context.Context, input AdminAccountUpdate) (*AdminAccount, error)
SetAdminPassword(ctx context.Context, input SetAdminPasswordInput) (*AdminAccount, error)
}
type PendingRevision ¶
type Privilege ¶
type Privilege string
func (Privilege) MarshalGQL ¶
func (Privilege) MarshalJSON ¶
func (*Privilege) UnmarshalGQL ¶
func (*Privilege) UnmarshalJSON ¶
type PublishInput ¶
type PublishInput struct {
// The draft to publish.
ID string `json:"id"`
RestartRequired *bool `json:"restartRequired,omitempty"`
// The published revision the caller based its work on; when another revision
// was published since, publish fails with extensions.code CONFLICT.
ExpectedPublished *string `json:"expectedPublished,omitempty"`
}
type QueryResolver ¶
type QueryResolver interface {
Me(ctx context.Context) (*AdminAccount, error)
ServerStatus(ctx context.Context) (*ServerStatus, error)
ConfigSchema(ctx context.Context) (any, error)
Published(ctx context.Context) (*Revision, error)
Revision(ctx context.Context, id string) (*Revision, error)
Revisions(ctx context.Context, limit *int) ([]Revision, error)
SchemaImport(ctx context.Context, datasource string, schemas []string) (*SchemaImport, error)
TableComments(ctx context.Context, tables []TableRef) ([]*TableComments, error)
Validate(ctx context.Context, draft DraftInput) (*Validation, error)
Capabilities(ctx context.Context) ([]EntityCapability, error)
Diff(ctx context.Context, from string, to *string, draft *DraftInput) (string, error)
Simulate(ctx context.Context, input SimulationInput) (*Simulation, error)
Visibility(ctx context.Context, input VisibilityInput) ([]EntityVisibility, error)
AdminAccounts(ctx context.Context) ([]AdminAccount, error)
}
type Relationship ¶
type RelationshipInput ¶
type Resolver ¶
type Resolver struct {
Store revision.Store
Accounts accounts.Service
Introspect Introspection
// Status reports the serving process; nil reports nothing applied.
Status func() RuntimeState
// Capabilities reports the serving snapshot's capabilities; nil reports
// none.
Capabilities func() bootstrap.EntityCapabilities
}
Resolver is the root resolver. It holds no per-request state.
func (*Resolver) Mutation ¶
func (r *Resolver) Mutation() MutationResolver
Mutation returns MutationResolver implementation.
func (*Resolver) Query ¶
func (r *Resolver) Query() QueryResolver
Query returns QueryResolver implementation.
func (*Resolver) Revision ¶
func (r *Resolver) Revision() RevisionResolver
Revision returns RevisionResolver implementation.
type ResolverRoot ¶
type ResolverRoot interface {
Mutation() MutationResolver
Query() QueryResolver
Revision() RevisionResolver
}
type Revision ¶
type Revision struct {
ID string
Parent *string
State RevisionState
ContentHash string
Author string
Comment string
CreatedAt time.Time
PublishedAt *time.Time
// contains filtered or unexported fields
}
Revision is the GraphQL Revision. The payload stays private: config and yaml are resolved from it only when a query selects them.
type RevisionResolver ¶
type RevisionState ¶
type RevisionState string
const ( RevisionStateDraft RevisionState = "DRAFT" RevisionStatePublished RevisionState = "PUBLISHED" RevisionStateSuperseded RevisionState = "SUPERSEDED" RevisionStateRolledBack RevisionState = "ROLLED_BACK" )
func (RevisionState) IsValid ¶
func (e RevisionState) IsValid() bool
func (RevisionState) MarshalGQL ¶
func (e RevisionState) MarshalGQL(w io.Writer)
func (RevisionState) MarshalJSON ¶
func (e RevisionState) MarshalJSON() ([]byte, error)
func (RevisionState) String ¶
func (e RevisionState) String() string
func (*RevisionState) UnmarshalGQL ¶
func (e *RevisionState) UnmarshalGQL(v any) error
func (*RevisionState) UnmarshalJSON ¶
func (e *RevisionState) UnmarshalJSON(b []byte) error
type RoleInput ¶
type RoleInput struct {
Name string `json:"name"`
Description *string `json:"description,omitempty"`
Grants []GrantInput `json:"grants,omitempty"`
}
type RollbackInput ¶
type RuntimeState ¶
type RuntimeState struct {
// Applied is the store revision being served; 0 when unknown.
Applied int64
Watching bool
// Pending is a published revision not applied; nil when none.
Pending *bootstrap.StaleState
}
RuntimeState is what the serving process reports about itself.
type SchemaImport ¶
type SchemaImport struct {
Datasource string `json:"datasource"`
// The schema where entities without a schema read (unqualified names
// resolve); null when the database cannot report it.
DefaultSchema *string `json:"defaultSchema,omitempty"`
Tables []ImportTable `json:"tables"`
}
type ServerStatus ¶
type ServerStatus struct {
// Revision this process serves; null when it does not track the store.
AppliedRevision *string `json:"appliedRevision,omitempty"`
// Whether the process applies newly published revisions (--watch).
Watching bool `json:"watching"`
// A published revision this process has not applied.
Pending *PendingRevision `json:"pending,omitempty"`
}
type SetAdminPasswordInput ¶
type Simulation ¶
type Simulation struct {
Allowed bool `json:"allowed"`
Reason string `json:"reason"`
Fields []string `json:"fields"`
// Effective row filter in rowPolicies JSON form; null means every row.
RowFilter any `json:"rowFilter,omitempty"`
Grants []string `json:"grants"`
// Set when no single grant covers the requested fields.
FieldScopes [][]string `json:"fieldScopes,omitempty"`
}
type SimulationInput ¶
type SimulationInput struct {
// Simulate against this unsaved draft...
Draft *DraftInput `json:"draft,omitempty"`
// ...or this revision; default: the published revision.
Revision *string `json:"revision,omitempty"`
// A configured user name, or role:<name> to evaluate a role.
User string `json:"user"`
Entity string `json:"entity"`
Action Action `json:"action"`
// Requested fields; empty means the default projection.
Fields []string `json:"fields,omitempty"`
// Extra subject attributes; configured user attributes win.
Subject any `json:"subject,omitempty"`
}
type TableComments ¶
type TableComments struct {
Description string `json:"description"`
Columns []ColumnComment `json:"columns"`
}
type UserInput ¶
type UserInput struct {
Name string `json:"name"`
Description *string `json:"description,omitempty"`
Roles []string `json:"roles,omitempty"`
Grants []GrantInput `json:"grants,omitempty"`
Subject any `json:"subject,omitempty"`
Disabled *bool `json:"disabled,omitempty"`
TokenHash *string `json:"tokenHash,omitempty"`
}
type Validation ¶
type Validation struct {
Ok bool `json:"ok"`
Error *string `json:"error,omitempty"`
ContentHash *string `json:"contentHash,omitempty"`
// Changes against the published revision that need a restart.
RestartRequired []string `json:"restartRequired"`
// Grants the routed datasource connections cannot run (they do not block publishing).
Warnings []string `json:"warnings"`
}
type VisibilityInput ¶
type VisibilityInput struct {
Draft *DraftInput `json:"draft,omitempty"`
Revision *string `json:"revision,omitempty"`
// A configured user name, or role:<name> to evaluate a role.
User string `json:"user"`
Subject any `json:"subject,omitempty"`
}