Skip to content

GraphQL Schema

schema.gql
enum ApiKeyPermissionEnum {
	READ_ONLY
	WRITE_ONLY
	READ_WRITE
}


type ComponentEventRecord {
	id: UUID!
	name: String!
	parameters: JSON
	version: String
	environment: String
	subcomponentEvents(event: EventFilter, runtime: RuntimeFilter, limit: Int! = 20, offset: Int! = 0): [SubcomponentEventRecord!]!
	runtime: RuntimeRecord!
	inputs: [IORecord!]!
	outputs: [IORecord!]!
	feedback: [IORecord!]!
	metadata: [MetadataRecord!]!
}

type CreateApiKeyResponse {
	apiKey: String!
	id: UUID!
}

type CreateApiKeyResult implements GQLResult {
	success: Boolean!
	apiKey: CreateApiKeyResponse
	error: [ValidationError!]
}

"""
Implement the DateTime<Utc> scalar

The input/output is a string in RFC3339 format.
"""
scalar DateTime

input DateTimeFilter {
	lt: DateTime
	gt: DateTime
	isNull: Boolean
}

type DeletionResult implements GQLResult {
	success: Boolean!
	deleted: Boolean
	error: [ValidationError!]
}

input EventFilter {
	id: UuidFilter
	name: StringFilter
	version: StringFilter
	environment: StringFilter
}


interface GQLResult {
	success: Boolean!
	error: [ValidationError!]
}


type IORecord {
	id: UUID!
	fieldName: String!
	fieldValue: JSON!
}


"""
A scalar that can represent any JSON value.
"""
scalar JSON

type MetadataRecord {
	id: UUID!
	fieldName: String!
	fieldValue: String!
}

type Mutation {
	user: UserMutation!
	workspace: WorkspaceMutation!
}

"""
ISO 8601 combined date and time without timezone.

# Examples

* `2015-07-01T08:59:60.123`,
"""
scalar NaiveDateTime

type Query {
	ping: String!
	user(id: UUID, username: String): [User!]!
	workspace(id: UUID, name: String, archived: Boolean): [Workspace!]!
	me: User!
	systemEvents(workspaceId: UUID, event: EventFilter, runtime: RuntimeFilter, limit: Int! = 20, offset: Int! = 0): [SystemEventRecord!]!
}

input RuntimeFilter {
	startTime: DateTimeFilter
	endTime: DateTimeFilter
	errorType: StringFilter
	errorContent: StringFilter
}

type RuntimeRecord {
	id: UUID!
	startTime: NaiveDateTime!
	endTime: NaiveDateTime!
	errorType: String
	errorContent: String
}

type ServiceApiKey {
	id: UUID!
	workspaceId: UUID!
	name: String!
	keyPreview: String!
	permissions: ApiKeyPermissionEnum!
	expiresAt: DateTime
}

type ServiceApiKeyResult implements GQLResult {
	success: Boolean!
	serviceApiKey: ServiceApiKey
	error: [ValidationError!]
}


input StringFilter {
	eq: String
	ne: String
	in: [String!]
	nin: [String!]
	like: String
	ilike: String
	isNull: Boolean
}

type SubcomponentEventRecord {
	id: UUID!
	name: String!
	parameters: JSON
	version: String
	environment: String
	runtime: RuntimeRecord!
	inputs: [IORecord!]!
	outputs: [IORecord!]!
	feedback: [IORecord!]!
	metadata: [MetadataRecord!]!
}

type SubsystemEventRecord {
	id: UUID!
	name: String!
	parameters: JSON
	version: String
	environment: String
	componentEvents(event: EventFilter, runtime: RuntimeFilter, limit: Int! = 20, offset: Int! = 0): [ComponentEventRecord!]!
	runtime: RuntimeRecord!
	inputs: [IORecord!]!
	outputs: [IORecord!]!
	feedback: [IORecord!]!
	metadata: [MetadataRecord!]!
}

type SystemEventRecord {
	id: UUID!
	name: String!
	parameters: JSON
	version: String
	environment: String
	subsystemEvents(event: EventFilter, runtime: RuntimeFilter, limit: Int! = 20, offset: Int! = 0): [SubsystemEventRecord!]!
	runtime: RuntimeRecord!
	inputs: [IORecord!]!
	outputs: [IORecord!]!
	feedback: [IORecord!]!
	metadata: [MetadataRecord!]!
}

"""
A UUID is a unique 128-bit number, stored as 16 octets. UUIDs are parsed as
Strings within GraphQL. UUIDs are used to assign unique identifiers to
entities without requiring a central allocating authority.

# References

* [Wikipedia: Universally Unique Identifier](http://en.wikipedia.org/wiki/Universally_unique_identifier)
* [RFC4122: A Universally Unique IDentifier (UUID) URN Namespace](http://tools.ietf.org/html/rfc4122)
"""
scalar UUID

type User {
	id: UUID!
	username: String!
	displayName: String
	status: UserStatusEnum!
	isSysadmin: Boolean!
	isAdmin: Boolean!
	workspaces(workspaceId: UUID, workspaceName: String): [Workspace!]!
	userApiKeys: [UserApiKey!]!
}

type UserApiKey {
	id: UUID!
	userId: UUID!
	name: String!
	keyPreview: String!
	expiresAt: DateTime
}

input UserChangePasswordInput {
	currentPassword: String!
	newPassword: String!
}

input UserInput {
	username: String!
	password: String!
	displayName: String
	isSysadmin: Boolean!
	isAdmin: Boolean!
}

type UserMutation {
	create(userData: UserInput!): UserResult!
	update(userId: UUID!, data: UserUpdate!): UserResult!
	changePassword(userId: UUID!, data: UserChangePasswordInput!): UserResult!
	delete(id: UUID!): DeletionResult!
	createUserApiKey(name: String!, durationDays: Int): CreateApiKeyResult!
	deleteUserApiKey(apiKeyId: UUID!): DeletionResult!
}

type UserResult implements GQLResult {
	success: Boolean!
	user: User
	error: [ValidationError!]
}

enum UserStatusEnum {
	ACTIVE
	SUSPENDED
}

input UserUpdate {
	displayName: String
	status: UserStatusEnum
	isAdmin: Boolean
}

input UuidFilter {
	eq: UUID
	ne: UUID
	in: [UUID!]
	nin: [UUID!]
	isNull: Boolean
}

type ValidationError {
	field: String!
	message: String!
}

type Workspace {
	id: UUID!
	name: String!
	description: String
	archived: Boolean!
	createdAt: DateTime!
	updatedAt: DateTime!
	users(id: UUID, username: String): [WorkspaceUser!]!
	serviceApiKeys: [ServiceApiKey!]!
}

input WorkspaceCreate {
	name: String!
	description: String
}

type WorkspaceMutation {
	create(adminUserId: UUID, workspaceData: WorkspaceCreate!): WorkspaceResult!
	delete(workspaceId: UUID!): DeletionResult!
	addUser(workspaceUser: WorkspaceUserCreateInput!): WorkspaceUserResult!
	removeUser(workspaceId: UUID!, userId: UUID!): DeletionResult!
	changeWorkspaceUserRole(workspaceId: UUID!, userId: UUID!, newRole: WorkspaceRoleEnum!): WorkspaceUserResult!
	createServiceApiKey(workspaceId: UUID!, name: String!, permission: ApiKeyPermissionEnum!, durationDays: Int): CreateApiKeyResult!
	deleteServiceApiKey(workspaceId: UUID!, apiKeyId: UUID!): DeletionResult!
}

type WorkspaceResult implements GQLResult {
	success: Boolean!
	workspace: Workspace
	error: [ValidationError!]
}

enum WorkspaceRoleEnum {
	USER
	MANAGER
	ADMIN
}

type WorkspaceUser {
	id: UUID!
	userId: UUID!
	workspaceId: UUID!
	role: WorkspaceRoleEnum!
	user: User!
	workspace: Workspace!
}

input WorkspaceUserCreateInput {
	workspaceId: UUID!
	userId: UUID!
	role: WorkspaceRoleEnum!
}

type WorkspaceUserResult implements GQLResult {
	success: Boolean!
	workspaceUser: WorkspaceUser
	error: [ValidationError!]
}

directive @include(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
directive @specifiedBy(url: String!) on SCALAR
schema {
	query: Query
	mutation: Mutation
}