Schema

Please find below the full graphql Schema. You can download it directly using this link: schema.graphql

scalar JSONObject
scalar JSON
scalar GraphQLDateTime

# Directives
directive @deprecated(
  reason: String = "No longer supported"
) on FIELD_DEFINITION | ENUM_VALUE | INPUT_FIELD_DEFINITION | ARGUMENT_DEFINITION

#PAGINATION

type PageInfo {
  endCursor: String
}

#COMMON

input IdPathRef {
  id: String
  "Deprecated use path instead"
  name: String @deprecated(reason: "use path")
  path: String
}

input BaseRef {
  idPath: IdPathRef
}

input ResourceGroupRef {
  idPath: IdPathRef
}

"Deprecated use DataPortRef instead"
input DataOfferStateRef {
  idPath: IdPathRef
  properties: StateMatchingProperties
}

input DataPortRef {
  idPath: IdPathRef
  properties: StateMatchingProperties
}

input DataItemRef {
  idPath: IdPathRef
  properties: StateMatchingProperties
}

# Union for different kinds of refs. Unions are not supported by GQL, therefore it goes by priority: 1st id, 2nd name, 3rd state ref.
input DataOfferRef {
  idPath: IdPathRef
  state: DataOfferStateRef @deprecated(reason: "use port")
  port: DataPortRef
}

# Union for different kinds of refs. Unions are not supported by GQL, therefore it goes by priority: 1st id, 2nd name
input DataSubscriptionStateRef {
  idPath: IdPathRef
  properties: StateMatchingProperties
}

input StateMatchingProperties {
  transportRef: BaseRef
  properties: [KeyValuePairInput!]!
}

type PrivilegeInformation {
  privileges: [PrivilegeType!]!
  path: String!
}

#RESOURCE_GROUP

type ResourceGroup {
  id: ID!
  name: String!
  path: String!
  parentId: ID
  parent: ResourceGroup
  privileges: [PrivilegeType!]
  privilegeInformation: PrivilegeInformation
  dataOffersCount(
    filterText: String
    filterOwnerRef: String
    onlyFollowed: Boolean
  ): Int!
}

type ResourceGroupConnection {
  pageInfo: PageInfo
  nodes: [ResourceGroup]
}

input ResourceGroupInput {
  name: String!
  label: String @deprecated(reason: "use name")
  parentRef: ResourceGroupRef
}

input ResourceGroupUpdate {
  self: ResourceGroupRef
  label: String @deprecated(reason: "use name")
  parentRef: ResourceGroupRef
  name: String
}

# TRANSPORT TYPE
enum TransportDataType {
  UNKNOWN
  STREAM
  DATA_SET
}
type TransportType {
  id: ID!
  name: String!
  label: String
  dataType: TransportDataType
  configTemplateDockerCompose: String
}
type TransportTypeConnection {
  pageInfo: PageInfo
  nodes: [TransportType]
}
input TransportTypeRef {
  idPath: IdPathRef
}

# TRANSPORT

type Transport {
  id: ID!
  name: String!
  label: String @deprecated(reason: "use name")
  path: String!
  resourceGroup: ResourceGroup @deprecated(reason: "use path")
  resourceGroupId: String @deprecated(reason: "use path")
  transportType: TransportType
  privilegeInformation: PrivilegeInformation
  properties: [KeyValuePair!]
}

type TransportConnection {
  pageInfo: PageInfo
  nodes: [Transport]
}

input TransportInput {
  name: String!
  label: String @deprecated(reason: "use name")
  path: String
  resourceGroupRef: ResourceGroupRef @deprecated(reason: "use path")
  transportTypeRef: TransportTypeRef
  properties: [KeyValuePairInput]
}

# AGENTS
type AgentMetrics {
  agentUptimeMs: Metrics
  loopTimeMs: Metrics
  loopPercent: Metrics
  memoryUsageBytes: Metrics
  cpuUsagePercent: Metrics
  loopsCounter: Metrics
}

type Agent {
  id: ID!
  label: String @deprecated(reason: "use name")
  name: String!
  path: String!
  resourceGroup: ResourceGroup @deprecated(reason: "use path")
  resourceGroupId: String @deprecated(reason: "use path")
  privilegeInformation: PrivilegeInformation
  username: ID!
  technicalUserId: String
  lastSeen: GraphQLDateTime
  metrics(from: GraphQLDateTime, to: GraphQLDateTime): AgentMetrics
}

input AgentRef {
  idPath: IdPathRef
  username: String
}

type SaveAgentResponse {
  agent: Agent
  technicalUser: SaveTechnicalUserResponse
}

type AgentConnection {
  pageInfo: PageInfo
  nodes: [Agent]
}

input AgentInput {
  label: String @deprecated(reason: "use name")
  name: String!
  path: String!
  resourceGroupRef: ResourceGroupRef @deprecated(reason: "use path")
  organization: String!
}

# Topology

union TopologyNode = ContainerNode | DataSourceNode | DataSinkNode

type DataSourceNode {
  id: ID!
  label: String
  containerNodeId: ID
  containerNode: ContainerNode
  resourceId: ID
  resource: DataPort
  dataSinkNodes: DataSinkNodeConnection
}

input DataSourceNodeInput {
  label: String
  containerNodeId: ID
  resourceId: ID
}

type DataSinkNode {
  id: ID!
  label: String
  containerNodeId: ID
  containerNode: ContainerNode
  resourceId: ID
  resource: DataSubscriptionState
  dataSourceNodeId: ID
  dataSourceNode: DataSourceNode
}

input DataSinkNodeInput {
  label: String
  containerNodeId: ID
  resourceId: ID
  dataSourceNodeId: ID
}

type ContainerNode {
  id: ID!
  label: String
  containerNodeId: ID
  containerNode: ContainerNode
  topologyNodes: TopologyNodeConnection
}

input ContainerNodeInput {
  label: String
  containerNodeId: ID
}

type DataSinkNodeConnection {
  pageInfo: PageInfo!
  nodes: [DataSinkNode]!
}

type TopologyNodeConnection {
  pageInfo: PageInfo!
  nodes: [TopologyNode]!
}

#DATA_PORT
type DataPortMetrics {
  messagesPerSecond: Metrics
  bytesPerSecond: Metrics
}

type DataPort implements Resource {
  id: ID!
  name: String!
  deleted: Boolean!
  label: String
  metrics(
    step: String = "1h"
      @deprecated(reason: "not used anymore, value is set to 1h")
    from: GraphQLDateTime
    to: GraphQLDateTime
  ): DataPortMetrics
  dataProfile: DataProfile
  transportUrl: String
  transportId: ID
  transport: Transport
  tags: [String!]
  _properties: [KeyValuePair!]
  properties(typeFilter: [PropertyDataType]): [ResourceProperty!]
  dataOfferId: ID
  dataOffer: DataOffer
  path: String!
  resourceGroupId: ID @deprecated(reason: "use path")
  resourceGroup: ResourceGroup @deprecated(reason: "use path")
  metaInfo: MetaInfo
  currentSchemas: [DataSchema!]
  dataSourceNodeId: ID
  dataSourceNode: DataSourceNode
  privilegeInformation: PrivilegeInformation
  dataItems: [DataItem!]
  agent: Agent
}

type DataPortConnection {
  pageInfo: PageInfo
  nodes: [DataPort]
}

input DataPortSave {
  self: DataPortRef
  name: String
  label: String
  path: String
  transportUrl: String
  transportRef: BaseRef
  tags: [String!]
  resourceGroupRef: ResourceGroupRef @deprecated(reason: "use path")
  properties: [KeyValuePairInput]
}

# DataItem
type DataItem implements Resource {
  id: ID!
  name: String!
  label: String
  deleted: Boolean!
  metrics(
    step: String = "1h"
      @deprecated(reason: "not used anymore, value is set to 1h")
    from: GraphQLDateTime
    to: GraphQLDateTime
  ): DataPortMetrics
  dataProfile: DataProfile
  dataPortId: String
  dataPort: DataPort
  transportUrl: String
  tags: [String!]
  _properties: [KeyValuePair!]
  properties(typeFilter: [PropertyDataType]): [ResourceProperty!]
  metaInfo: MetaInfo
  currentSchemas: [DataSchema!]
}

type DataItemConnection {
  pageInfo: PageInfo
  nodes: [DataItem]
}
input DataItemSave {
  self: DataItemRef
  name: String
  label: String
  dataPortRef: DataPortRef
  transportUrl: String
  tags: [String!]
  path: String
  pathRef: ResourceGroupRef @deprecated(reason: "use path")
  properties: [KeyValuePairInput]
}

# SCHEMA

enum SchemaSource {
  UNKNOWN
  REGISTRY
  INFERRED
  USER_DEFINED
}

enum SchemaEncoding {
  UNKNOWN
  JSON
  AVRO
  JSON_ASYNCAPI
}

union EntityWithSchema = DataPort | DataItem

type DataSchema {
  id: ID!
  source: SchemaSource
  encoding: SchemaEncoding
  content: String
  createdAt: String
  lastSeen: String
  entityRef: ResourceEntityRef
  entity: EntityWithSchema
  path: String!
}

input SchemaInput {
  dataPortId: String!
  source: SchemaSource!
  encoding: SchemaEncoding!
  content: String!
}

#DATA OFFER

type DataOffer implements Resource {
  id: ID!
  name: String!
  label: String
  description: String
  shortDescription: String
  owner: Subject
  ownerId: String
  ownerEmail: String
  metaInfo: MetaInfo
  _properties: [KeyValuePair!]
  properties(typeFilter: [PropertyDataType]): [ResourceProperty!]
  dataPortId: ID
  dataPort: DataPort
  tags: [String!]
  path: String!
  resourceGroupId: ID @deprecated(reason: "use path")
  resourceGroup: ResourceGroup @deprecated(reason: "use path")
  privilegeInformation: PrivilegeInformation
  isFollowing: Boolean
  followEntityUsersCount: Int
}

type DataOffersConnection {
  pageInfo: PageInfo
  nodes: [DataOffer]
}

# TODO: rename to DataOfferCreate (or to something more clear for which mutation it's used)
# TODO: why is DataOfferInput different than DataOffer?
input DataOfferInput {
  name: String
  label: String
  shortDescription: String
  description: String
  "Deprecated, use ownerRef instead"
  ownerId: String @deprecated(reason: "use ownerRef")
  "Deprecated, use ownerRef instead"
  ownerEmail: String @deprecated(reason: "use ownerRef")
  ownerRef: String
  dataPortRef: DataPortRef
  path: String
  resourceGroupRef: ResourceGroupRef @deprecated(reason: "use path")
  "Deprecated, use resourceGroupRef instead"
  resourceGroupId: String @deprecated(reason: "use resourceGroupRef instead")
  tags: [String!]
  properties: [KeyValuePairInput]
}

# TODO: same as in DataOfferUpdate
input DataOfferUpdate {
  id: String!
  name: String
  label: String
  shortDescription: String
  description: String
  "Deprecated, use ownerRef instead"
  ownerId: String @deprecated(reason: "use ownerRef")
  "Deprecated, use ownerRef instead"
  ownerEmail: String @deprecated(reason: "use ownerRef")
  ownerRef: String
  tags: [String!]
  properties: [KeyValuePairInput]
  path: String
  resourceGroupRef: ResourceGroupRef @deprecated(reason: "use path instead")
  "Deprecated, use reseourceGroupRef instead"
  resourceGroupId: String @deprecated(reason: "use resourceGroupRef instead")
}

input DataOfferChange {
  self: DataOfferRef!
  name: String
  label: String
  shortDescription: String
  description: String
  "Deprecated, use ownerRef instead"
  ownerId: String @deprecated(reason: "use ownerRef")
  "Deprecated, use ownerRef instead"
  ownerEmail: String @deprecated(reason: "use ownerRef")
  ownerRef: String
  dataPort: DataPortRef
  path: String
  resourceGroupRef: ResourceGroupRef @deprecated(reason: "use path instead")
  tags: [String!]
  properties: [KeyValuePairInput]
}

input FollowEntityInput {
  entityType: ResourceEntityType!
  entityId: ID!
}

type ResourceEntityRef {
  type: ResourceEntityType!
  id: ID!
}

#DATA_SUBSCRIPTION_STATE

type DataSubscriptionState implements Resource {
  id: ID!
  name: String!
  label: String
  _properties: [KeyValuePair!]
  properties(typeFilter: [PropertyDataType]): [ResourceProperty!]
  transportUrl: String
  transportId: ID
  transport: Transport
  dataPortId: ID
  dataPort: DataPort
  metrics(
    step: String = "1h"
      @deprecated(reason: "not used anymore, value is set to 1h")
    from: GraphQLDateTime
    to: GraphQLDateTime
  ): DataSubscriptionStateMetrics
  deleted: Boolean
  metaInfo: MetaInfo
  path: String
  resourceGroupId: ID @deprecated(reason: "use path")
  resourceGroup: ResourceGroup @deprecated(reason: "use path")
  tags: [String!]
  dataSinkNodeId: ID
  dataSinkNode: DataSinkNode
  privilegeInformation: PrivilegeInformation
}

type DataSubscriptionStatesConnection {
  pageInfo: PageInfo
  nodes: [DataSubscriptionState]
}

input DataSubscriptionStateSave {
  self: DataSubscriptionStateRef
  name: String
  label: String
  transportUrl: String
  dataPortRef: DataPortRef
  tags: [String!]
  path: String
  resourceGroupRef: ResourceGroupRef @deprecated(reason: "use path")
  properties: [KeyValuePairInput]
}

#PROFILE

type DataProfile {
  id: ID!
  jsonSchema: JSONObject
  htmlBlobId: String
  reportingTimestamp: GraphQLDateTime
  samplesCount: Int
  error: DataProfilingError
  privilegeInformation: PrivilegeInformation
}

enum DataProfilingErrorType {
  OPERATIONAL_ERROR
  NO_DATA
  UNKNOWN_ENCODING
  TRANSPORT_UNAVAILABLE
}

type DataProfilingError {
  type: DataProfilingErrorType
  message: String
}

#Metrics

type Metrics {
  values: [DataPoint]
  avg: Float
  max: Float
  min: Float
  sum: Float
}

type DataPoint {
  dateTime: GraphQLDateTime!
  avg: Float!
  #max: Float
  #min: Float
}

type DataSubscriptionStateMetrics {
  messagesPerSecond: Metrics

  """
  Message lag between producer (DataPort) and consumer (DataSubscriptionState).
  The aggregation parameter is related to the grouping per partition (if any).
  """
  messagesLag: Metrics
  bytesPerSecond: Metrics
}

#PROPERTIES

type KeyValuePair {
  key: String!
  value: String
}

input KeyValuePairInput {
  key: String!
  value: String
}

type ResourceProperty {
  key: String!
  value: String
  label: String
  shortDescription: String
  icon: String
  type: PropertyDataType!
  editable: Boolean!
  transportMatching: Boolean!
}

type ResourcePropertyValueDefinition {
  resourceEntityType: ResourceEntityType!
  key: String!
  label: String!
  shortDescription: String
  icon: String
  type: PropertyDataType!
  # categories: [String!]
  editable: Boolean!
}

# META
type MetaInfo {
  created: ActionMetaInfo
  lastModification: ActionMetaInfo
}

type ActionMetaInfo {
  username: String
  timestamp: GraphQLDateTime
}

#Collaboration

type Organization {
  id: ID!
  name: String
  properties: [KeyValuePair!]
  privilegeInformation: PrivilegeInformation
}

type OrganizationsConnection {
  pageInfo: PageInfo
  nodes: [Organization]
}

input OrganizationChangeInput {
  id: String
  name: String
  properties: [KeyValuePairInput]
}

union Subject = User | UserGroup | TechnicalUser

enum SubjectType {
  USER
  USER_GROUP
}

type PermissionsOverview {
  canWriteDataOffer: Boolean
}

type User {
  id: ID!
  firstName: String
  lastName: String
  email: String
  username: String
  organizations: [String!]
  groups: [UserGroup!]
  avatarUrl: String
  properties: [KeyValuePair!]
  permissionsOverview: PermissionsOverview
  permissions: [Permission!]
}

input UserChangeInput {
  id: ID
  email: String
  firstName: String
  lastName: String
  organizations: [String!]
  groups: [ID!]
  properties: [KeyValuePairInput]
}

type UsersConnection {
  pageInfo: PageInfo
  nodes: [User]
}

type UserGroup {
  id: ID!
  name: String
  label: String
  email: String
  organization: String
  avatarUrl: String
  properties: [KeyValuePair!]
  privilegeInformation: PrivilegeInformation
  users: [User!]
}

type TechnicalUser {
  id: ID!
  label: String
  username: String
  organization: String
  privilegeInformation: PrivilegeInformation
}

type TechnicalUserCredentials {
  secret: String
}

type SaveTechnicalUserResponse {
  technicalUser: TechnicalUser
  credentials: TechnicalUserCredentials
}

type ResetPasswordTechnicalUserResponse {
  technicalUser: TechnicalUser
  credentials: TechnicalUserCredentials
}

type TechnicalUsersConnection {
  pageInfo: PageInfo
  nodes: [TechnicalUser]
}

input UserGroupChangeInput {
  id: ID
  name: String
  label: String
  email: String
  organization: String
  properties: [KeyValuePairInput]
  users: [ID!]
}

input TechnicalUserChangeInput {
  id: ID
  label: String
  organization: String!
}

input InviteUserToOrganizationInput {
  organizationName: String!
  email: String!
  privilege: PrivilegeType
}

input RemoveUserFromOrganizationInput {
  organizationName: String!
  email: String!
}

type UserGroupsConnection {
  pageInfo: PageInfo
  nodes: [UserGroup]
}

type SubjectsConnection {
  pageInfo: PageInfo
  nodes: [Subject]
}

type FollowEntity {
  id: String
  entityRef: ResourceEntityRef
}

type FollowEntityConnection {
  pageInfo: PageInfo
  nodes: [FollowEntity]
}

#HISTORY

type HistoryEntity {
  id: String
  entityType: ResourceEntityType
}

type History {
  source: HistoryEntity
  eventType: HistoryEventType
  timestamp: GraphQLDateTime
  username: String
}

type HistoryConnection {
  pageInfo: PageInfo
  nodes: [History]
}

enum HistoryEventType {
  UNKNOWN
  CREATED
  MODIFIED
  DELETED
  LINKED
  UNLINKED
}

#PERMISSIONS

enum PrivilegeType {
  UNKNOWN
  READ
  WRITE
  ADMIN
  LINK
  READ_INFO
  NONE
}

type SubjectRef {
  id: String
  name: String!
}

input SubjectRefInput {
  name: String!
}

type Permission {
  subjectRef: SubjectRef!
  path: String!
  privileges: [PrivilegeType!]!
  metaInfo: MetaInfo
  privilegeInformation: PrivilegeInformation
}

type PermissionConnection {
  pageInfo: PageInfo!
  nodes: [Permission!]!
}

input PermissionInput {
  path: String!
  subjectRef: SubjectRefInput!
  privileges: [PrivilegeType!]!
}

input PermissionUnsetInput {
  path: String!
  subjectRef: SubjectRefInput!
}

enum ResourceEntityType {
  UNKNOWN
  DATA_OFFER
  DATA_PORT
  DATA_ITEM
  DATA_SUBSCRIPTION_STATE
  TRANSPORT
  RESOURCE_GROUP
  PERMISSION
  USER
  USER_GROUP
  DATA_PROFILE
  SCHEMA
  DATA_PROFILING_JOB
  ORGANIZATION
  DATA_SAMPLE
  TECHNICAL_USER
  AGENT
}

interface Resource {
  id: ID!
  name: String
  metaInfo: MetaInfo
}

#CONFIGURATION

type ComponentVersion {
  name: String
  version: String
}

type ApplicationInfo {
  components: [ComponentVersion]
}

enum PropertyDataType {
  UNKNOWN
  TEXT
  UNIX_TIMESTAMP
  LINK
  MAIL
}

type PropertyDefinition {
  key: String
  label: String
  type: PropertyDataType
  showAlways: Boolean
  editable: Boolean
  blacklisted: Boolean
}

type SectionDefinition {
  id: ID
  title: String
  properties: [PropertyDefinition]
}

type UiConfiguration {
  #view: ViewConfiguration
  entityConfiguration: EntityConfiguration
}

type EntityConfiguration {
  dataOffer: ResourceEntityConfiguration
  dataPort: ResourceEntityConfiguration
  dataSubscriptionState: ResourceEntityConfiguration
}

type ResourceEntityConfiguration {
  propertyDefinitions: [ResourcePropertyValueDefinition!]
}

input IssueInput {
  summary: String!
  description: String!
  reporter: String!
  labels: [String]
}

type Issue {
  id: String
  key: String
  self: String
}

# SEARCH
input SearchInput {
  first: Int
  after: String
  query: String!
  entityType: ResourceEntityType
  path: String
}

union SearchableEntity =
    RemovedSearchItem
  | DataOffer
  | DataPort
  | DataItem
  | DataSubscriptionState
  | ResourceGroup
  | Transport
  | DataSchema

type RemovedSearchItem {
  ref: ResourceEntityRef
}

type SearchItem {
  ref: ResourceEntityRef
  entity: SearchableEntity
}

type SearchItemsConnection {
  pageInfo: PageInfo
  nodes: [SearchItem]
}

# Activities
type ActivitiesConnection {
  pageInfo: PageInfo
  nodes: [Activity]
}

union AffectedEntity =
    DataOffer
  | DataPort
  | DataSubscriptionState
  | ResourceGroup
  | Transport
  | DataSchema

enum ActivityType {
  UNKNOWN
  FIRST_APPEARANCE
  OWNER_CHANGE
  OWNERSHIP_SELF_ASSIGNED
  OWNERSHIP_ASSIGNED
  OWNERSHIP_UNASSIGNED
  RESOURCE_GROUP_CHANGE
  GENERIC_TEXT_FIELD_CHANGE
  TAGS_CHANGE
  PROPERTIES_CHANGE
  CONSUMER_GROUP_CHANGE
  DATA_ITEM_CHANGE
  SCHEMA_CHANGE
}

union ChangeInfo =
    OwnerChangeInfo
  | ResourceGroupChangeInfo
  | GenericTextChangeInfo

type OwnerChangeInfo {
  previousOwnerId: String
  previousOwner: Subject
  newOwnerId: String
  newOwner: Subject
}

type ResourceGroupChangeInfo {
  previousResourceGroupId: String
  previousResourceGroup: ResourceGroup
  newResourceGroupId: String
  newResourceGroup: ResourceGroup
}

type GenericTextChangeInfo {
  previousValue: String
  newValue: String
  fieldName: String
}

type Activity {
  id: String!
  activityType: ActivityType!
  triggeredBy: Subject
  affectedEntityRef: ResourceEntityRef!
  affectedEntity: AffectedEntity
  message: String
  changeInfo: ChangeInfo
  timestamp: GraphQLDateTime!
}

input ActivitiesInput {
  first: Int
  after: String
  resourceEntityRefIdList: [String]
}

#notifications

union Configuration = WebhookConfiguration | EmailConfiguration

type NotificationConfiguration {
  id: String!
  label: String!
  activityFilters: [ActivityFilter]!
  configuration: Configuration!
}

type ActivityFilter {
  activityType: ActivityType
  path: String
  entityType: ResourceEntityType
}

type WebhookConfiguration {
  webhookUrl: String
  webhookHeaders: [KeyValuePair]
}

type EmailConfiguration {
  email: String
}

input UpdateNotificationChannelConfigurationInput {
  configuration: NotificationConfigurationInput!
}

input NotificationConfigurationInput {
  id: String
  label: String!
  activityFilters: [ActivityFilterInput]
  webhookConfiguration: WebhookConfigurationInput
  emailConfiguration: EmailConfigurationInput
}

input ActivityFilterInput {
  activityType: ActivityType
  path: String
  entityType: ResourceEntityType
}

input WebhookConfigurationInput {
  webhookUrl: String!
  webhookHeaders: [KeyValuePairInput]!
}

input EmailConfigurationInput {
  email: String!
}

type Query {
  "List of ResourceGroups."
  resourceGroups(
    "Returns up to the first n elements from the list."
    first: Int
    "Returns the elements that come after the specified cursor."
    after: String
    "EXPERIMENTAL: filter by parent ResourceGroup."
    parentId: String
    "EXPERIMENTAL: filter by predicates."
    filterText: String
    "EXPERIMENTAL: filter for privilege."
    privilege: PrivilegeType
    "EXPERIMENTAL: filter for resource entity type (for permission)."
    resourceEntity: ResourceEntityType
  ): ResourceGroupConnection

  "Query for ResourceGroup by ID."
  resourceGroupById(self: ResourceGroupRef): ResourceGroup

  "List of Transport Types."
  transportTypes(
    "Returns up to the first n elements from the list."
    first: Int
    "Returns the elements that come after the specified cursor."
    after: String
  ): TransportTypeConnection

  "List of Transports."
  transports(
    "Returns up to the first n elements from the list."
    first: Int
    "Returns the elements that come after the specified cursor."
    after: String
    "filter by path"
    path: String
    "EXPERIMENTAL: filter by predicates."
    filterText: String
    "EXPERIMENTAL: filter for privilege."
    privilege: PrivilegeType
  ): TransportConnection

  "Query for Transport by ID."
  transportById(self: BaseRef): Transport

  "List of Agents."
  agents(
    "Returns up to the first n elements from the list."
    first: Int
    "Returns the elements that come after the specified cursor."
    after: String
    "filter by path"
    path: String
    "EXPERIMENTAL: filter by predicates."
    filterText: String
    "EXPERIMENTAL: filter for privilege."
    privilege: PrivilegeType
  ): AgentConnection

  "One Agent"
  agentById(self: AgentRef): Agent

  "List of DataPort."
  dataPorts(
    "Returns up to the first n elements from the list."
    first: Int
    "Returns the elements that come after the specified cursor."
    after: String
    "filter by path"
    path: String
    "EXPERIMENTAL: filter by Transport ID."
    transportId: String
    "EXPERIMENTAL: filter by predicates"
    filterText: String
    "EXPERIMENTAL: filter for privilege."
    privilege: PrivilegeType
  ): DataPortConnection!

  "Query for DataPort by ID."
  dataPortById(self: DataPortRef): DataPort

  "EXPERIMENTAL: List of DataItem."
  dataItems(
    "Returns up to the first n elements from the list."
    first: Int
    "Returns the elements that come after the specified cursor."
    after: String
    "filter by data port"
    dataPortRef: DataPortRef
  ): DataItemConnection!

  "Query for DataItem by ID."
  dataItemById(self: DataItemRef): DataItem

  "List of DataOffers."
  dataOffers(
    "Returns up to the first n elements from the list."
    first: Int
    "Returns the elements that come after the specified cursor."
    after: String
    "filter by path"
    path: String
    "EXPERIMENTAL: filter by predicates."
    filterText: String
    "EXPERIMENTAL: filter by Path."
    filterPath: String
    "EXPERIMENTAL: filter for privilege."
    privilege: PrivilegeType
    "EXPERIMENTAL: filter by owner."
    filterOwnerRef: String
    onlyFollowed: Boolean
  ): DataOffersConnection

  "Query for DataOffer by ID."
  dataOfferById(
    self: DataOfferRef
    "Deprecated, use ref instead"
    offerId: String @deprecated(reason: "use ref instead")
  ): DataOffer

  "List of DataSubscriptionStates."
  dataSubscriptionStates(
    "Returns up to the first n elements from the list."
    first: Int
    "Returns the elements that come after the specified cursor."
    after: String
    "filter by path"
    path: String
    "EXPERIMENTAL: filter by Transport ID."
    transportId: String
    dataPortRef: DataPortRef
    "EXPERIMENTAL: filter for DataSubscriptionStates with a claimed DataPort ()"
    withDataOfferOnly: Boolean
    "EXPERIMENTAL: filter by predicates"
    filterText: String
    "EXPERIMENTAL: filter for privilege."
    privilege: PrivilegeType
  ): DataSubscriptionStatesConnection

  "Query for DataSubscriptionState by ID."
  dataSubscriptionStateById(
    self: DataSubscriptionStateRef
  ): DataSubscriptionState

  history(
    first: Int
    after: String
    entityIdList: [String]
    ownerIdList: [String]
  ): HistoryConnection

  organizations(first: Int, after: String): OrganizationsConnection
  organizationByIdOrName(id: String, name: String): Organization

  subjects(
    organization: String
    filterText: String
    filterSubjectType: SubjectType
    first: Int
    after: String
  ): SubjectsConnection

  users(first: Int, after: String, organization: String!): UsersConnection
  userById(id: String!): User

  userGroups(
    first: Int
    after: String
    organization: String!
  ): UserGroupsConnection
  userGroupById(id: String!): UserGroup

  technicalUsers(
    first: Int
    after: String
    organization: String!
  ): TechnicalUsersConnection

  "Query for current User."
  currentUser: User

  "List of Permissions."
  permissions(
    "Returns up to the first n elements from the list."
    first: Int
    "Returns the elements that come after the specified cursor."
    after: String
    path: String
    subjectRef: SubjectRefInput
  ): PermissionConnection

  "topology"
  dataSourceNodeById(id: String!): DataSourceNode!
  dataSourceNodeByDataPortId(id: String!): DataSourceNode!
  dataSinkNodeById(id: String!): DataSinkNode!
  dataSinkNodeByDataSubscriptionStateId(id: String!): DataSinkNode!

  applicationInfo: ApplicationInfo
  uiConfiguration(organizationName: String!): UiConfiguration

  getFollowEntityByUser: FollowEntityConnection
  isUserFollowingEntity(entityRef: FollowEntityInput): Boolean

  search(search: SearchInput): SearchItemsConnection

  activities(input: ActivitiesInput): ActivitiesConnection

  getNotificationChannelsConfiguration: [NotificationConfiguration!]!
}

type Mutation {
  createResourceGroup(input: ResourceGroupInput!): ResourceGroup
  updateResourceGroup(input: ResourceGroupUpdate!): ResourceGroup
  deleteResourceGroup(self: ResourceGroupRef): String

  createTransport(input: TransportInput!): Transport
  deleteTransport(self: BaseRef): String

  createAgent(input: AgentInput!): SaveAgentResponse
  deleteAgent(id: String!, technicalUserId: String!): String

  saveDataPort(input: DataPortSave!): DataPort
  deleteDataPort(self: DataPortRef): String

  saveDataItem(input: DataItemSave!): DataItem
  deleteDataItem(self: DataItemRef): String

  createDataOffer(input: DataOfferInput!): DataOffer
  updateDataOffer(input: DataOfferUpdate!): DataOffer
  saveDataOffer(input: DataOfferChange!): DataOffer!
  deleteDataOffer(self: DataOfferRef): String

  followEntity(input: FollowEntityInput): Boolean
  unFollowEntity(input: FollowEntityInput): Boolean

  saveDataSubscriptionState(
    input: DataSubscriptionStateSave!
  ): DataSubscriptionState
  deleteDataSubscriptionState(self: DataSubscriptionStateRef): String

  savePermission(input: PermissionInput!): Permission
  unsetPermission(input: PermissionUnsetInput!): String

  createIssue(input: IssueInput!): Issue

  "topology"
  saveDataSourceNode(id: ID, input: DataSourceNodeInput): DataSourceNode
  deleteDataSourceNode(id: ID): String

  saveDataSinkNode(id: ID, input: DataSinkNodeInput): DataSinkNode
  deleteDataSinkNode(id: ID): String

  saveContainerNode(id: ID, input: ContainerNodeInput): ContainerNode
  deleteContainerNode(id: ID): String

  "organizations"
  saveOrganization(input: OrganizationChangeInput): Organization!

  "users and groups"
  saveUser(input: UserChangeInput!): User!
  saveTechnicalUser(
    input: TechnicalUserChangeInput!
  ): SaveTechnicalUserResponse!
  deleteTechnicalUser(id: String!): String
  saveUserGroup(input: UserGroupChangeInput!): UserGroup!
  deleteUserGroup(id: String!): String
  resetPasswordTechnicalUser(id: String!): ResetPasswordTechnicalUserResponse!
  inviteUserToOrganization(input: InviteUserToOrganizationInput!): String
  removeUserFromOrganization(input: RemoveUserFromOrganizationInput!): String

  "schemas"
  saveSchema(input: SchemaInput!): DataSchema!

  updateNotificationChannelsConfiguration(
    input: UpdateNotificationChannelConfigurationInput
  ): NotificationConfiguration

  deleteNotificationChannelConfiguration(id: String): Boolean
}