schema {
  query: Query
  mutation: Mutation
}

type BlockQuoteBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  value: String!
}

type BooleanBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  value: Boolean!
}

type CharBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  value: String!
}

type ChoiceBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  value: String!
  choices: [ChoiceOption!]!
}

type ChoiceOption {
  key: String!
  value: String!
}

type Circle implements PageInterface {
  id: ID
  path: String!
  depth: Int
  numchild: Int!
  translationKey: UUID!
  title: String!
  draftTitle: String!
  slug: String!
  contentType: String!
  live: Boolean!
  hasUnpublishedChanges: Boolean!
  urlPath: String!
  owner: User
  seoTitle: String!
  showInMenus: Boolean!
  searchDescription: String
  goLiveAt: DateTime
  expireAt: DateTime
  expired: Boolean!
  locked: Boolean
  lockedAt: DateTime
  lockedBy: User
  firstPublishedAt: DateTime
  lastPublishedAt: DateTime
  latestRevisionCreatedAt: DateTime
  aliasOf: Page
  pageType: String
  url: String
  parent: PageInterface
  children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}

type CollectionObjectType {
  id: ID!
  path: String!
  depth: Int!
  numchild: Int!
  name: String!
  descendants: [CollectionObjectType]!
  ancestors: [CollectionObjectType]!
}

type CompetencePage implements PageInterface {
  id: ID
  path: String!
  depth: Int
  numchild: Int!
  translationKey: UUID!
  title: String!
  draftTitle: String!
  slug: String!
  contentType: String!
  live: Boolean!
  hasUnpublishedChanges: Boolean!
  urlPath: String!
  owner: User
  seoTitle: String!
  showInMenus: Boolean!
  searchDescription: String
  goLiveAt: DateTime
  expireAt: DateTime
  expired: Boolean!
  locked: Boolean
  lockedAt: DateTime
  lockedBy: User
  firstPublishedAt: DateTime
  lastPublishedAt: DateTime
  latestRevisionCreatedAt: DateTime
  aliasOf: Page
  pageType: String
  url: String
  parent: PageInterface
  children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}

type CompetenceProfilePage implements PageInterface {
  id: ID
  path: String!
  depth: Int
  numchild: Int!
  translationKey: UUID!
  title: String!
  draftTitle: String!
  slug: String!
  contentType: String!
  live: Boolean!
  hasUnpublishedChanges: Boolean!
  urlPath: String!
  owner: User
  seoTitle: String!
  showInMenus: Boolean!
  searchDescription: String
  goLiveAt: DateTime
  expireAt: DateTime
  expired: Boolean!
  locked: Boolean
  lockedAt: DateTime
  lockedBy: User
  firstPublishedAt: DateTime
  lastPublishedAt: DateTime
  latestRevisionCreatedAt: DateTime
  aliasOf: Page
  pageType: String
  url: String
  parent: PageInterface
  children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}

type Course {
  id: ID
}

type CourseCategory {
  id: ID
}

type CourseCompletion {
  id: ID
}

type CoursePage implements PageInterface {
  id: ID
  path: String!
  depth: Int
  numchild: Int!
  translationKey: UUID!
  title: String!
  draftTitle: String!
  slug: String!
  contentType: String!
  live: Boolean!
  hasUnpublishedChanges: Boolean!
  urlPath: String!
  owner: User
  seoTitle: String!
  showInMenus: Boolean!
  searchDescription: String
  goLiveAt: DateTime
  expireAt: DateTime
  expired: Boolean!
  locked: Boolean
  lockedAt: DateTime
  lockedBy: User
  firstPublishedAt: DateTime
  lastPublishedAt: DateTime
  latestRevisionCreatedAt: DateTime
  aliasOf: Page
  pageType: String
  url: String
  parent: PageInterface
  children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}

type CourseSession {
  id: ID
}

type CourseSessionUser {
  id: ID
}

type DateBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  value(format: String): String!
}

scalar DateTime

type DateTimeBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  value(format: String): String!
}

type DecimalBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  value: Float!
}

type DocumentChooserBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  document: LibraryDocument!
}

type EmailBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  value: String!
}

type EmbedBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  value: String!
  url: String!
  embed: String
  rawEmbed: JSONString
}

type ErrorType {
  field: String!
  messages: [String!]!
}

type FloatBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  value: Float!
}

type ImageChooserBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  image: ImageObjectType!
}

type ImageObjectType {
  id: ID!
  collection: CollectionObjectType!
  title: String!
  file: String!
  width: Int!
  height: Int!
  createdAt: DateTime!
  uploadedByUser: User
  focalPointX: Int
  focalPointY: Int
  focalPointWidth: Int
  focalPointHeight: Int
  fileSize: Int
  fileHash: String!
  renditions: [ImageRenditionObjectType!]!
  src: String! @deprecated(reason: "Use the `url` attribute")
  url: String!
  aspectRatio: Float!
  sizes: String!
  tags: [TagObjectType!]!
  rendition(max: String, min: String, width: Int, height: Int, fill: String, format: String, bgcolor: String, jpegquality: Int, webpquality: Int): ImageRenditionObjectType
  srcSet(sizes: [Int], format: String): String
}

type ImageRenditionObjectType {
  id: ID!
  filterSpec: String!
  file: String!
  width: Int!
  height: Int!
  focalPointKey: String!
  image: ImageObjectType!
  title: String!
  createdAt: DateTime!
  focalPointX: Int
  focalPointY: Int
  focalPointWidth: Int
  focalPointHeight: Int
  fileSize: Int
  fileHash: String!
  src: String! @deprecated(reason: "Use the `url` attribute")
  url: String!
  aspectRatio: Float!
  sizes: String!
  collection: CollectionObjectType!
  tags: [TagObjectType!]!
}

type IntegerBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  value: Int!
}

scalar JSONString

type LearningContent implements PageInterface {
  id: ID
  path: String!
  depth: Int
  numchild: Int!
  translationKey: UUID!
  title: String!
  draftTitle: String!
  slug: String!
  contentType: String!
  live: Boolean!
  hasUnpublishedChanges: Boolean!
  urlPath: String!
  owner: User
  seoTitle: String!
  showInMenus: Boolean!
  searchDescription: String
  goLiveAt: DateTime
  expireAt: DateTime
  expired: Boolean!
  locked: Boolean
  lockedAt: DateTime
  lockedBy: User
  firstPublishedAt: DateTime
  lastPublishedAt: DateTime
  latestRevisionCreatedAt: DateTime
  aliasOf: Page
  pageType: String
  url: String
  parent: PageInterface
  children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}

type LearningPath implements PageInterface {
  id: ID
  path: String!
  depth: Int
  numchild: Int!
  translationKey: UUID!
  title: String!
  draftTitle: String!
  slug: String!
  contentType: String!
  live: Boolean!
  hasUnpublishedChanges: Boolean!
  urlPath: String!
  owner: User
  seoTitle: String!
  showInMenus: Boolean!
  searchDescription: String
  goLiveAt: DateTime
  expireAt: DateTime
  expired: Boolean!
  locked: Boolean
  lockedAt: DateTime
  lockedBy: User
  firstPublishedAt: DateTime
  lastPublishedAt: DateTime
  latestRevisionCreatedAt: DateTime
  aliasOf: Page
  pageType: String
  url: String
  parent: PageInterface
  children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}

type LearningSequence implements PageInterface {
  id: ID
  path: String!
  depth: Int
  numchild: Int!
  translationKey: UUID!
  title: String!
  draftTitle: String!
  slug: String!
  contentType: String!
  live: Boolean!
  hasUnpublishedChanges: Boolean!
  urlPath: String!
  owner: User
  seoTitle: String!
  showInMenus: Boolean!
  searchDescription: String
  goLiveAt: DateTime
  expireAt: DateTime
  expired: Boolean!
  locked: Boolean
  lockedAt: DateTime
  lockedBy: User
  firstPublishedAt: DateTime
  lastPublishedAt: DateTime
  latestRevisionCreatedAt: DateTime
  aliasOf: Page
  pageType: String
  url: String
  parent: PageInterface
  children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}

type LearningUnit implements PageInterface {
  id: ID
  path: String!
  depth: Int
  numchild: Int!
  translationKey: UUID!
  title: String!
  draftTitle: String!
  slug: String!
  contentType: String!
  live: Boolean!
  hasUnpublishedChanges: Boolean!
  urlPath: String!
  owner: User
  seoTitle: String!
  showInMenus: Boolean!
  searchDescription: String
  goLiveAt: DateTime
  expireAt: DateTime
  expired: Boolean!
  locked: Boolean
  lockedAt: DateTime
  lockedBy: User
  firstPublishedAt: DateTime
  lastPublishedAt: DateTime
  latestRevisionCreatedAt: DateTime
  aliasOf: Page
  pageType: String
  url: String
  parent: PageInterface
  children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}

type LibraryDocument {
  id: ID
  collection: CollectionObjectType!
  title: String!
  file: String!
  createdAt: DateTime!
  fileSize: Int
  fileHash: String!
  url: String!
  tags: [TagObjectType!]!
}

type ListBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  items: [StreamFieldInterface!]!
}

type MediaCategoryPage implements PageInterface {
  id: ID
  path: String!
  depth: Int
  numchild: Int!
  translationKey: UUID!
  title: String!
  draftTitle: String!
  slug: String!
  contentType: String!
  live: Boolean!
  hasUnpublishedChanges: Boolean!
  urlPath: String!
  owner: User
  seoTitle: String!
  showInMenus: Boolean!
  searchDescription: String
  goLiveAt: DateTime
  expireAt: DateTime
  expired: Boolean!
  locked: Boolean
  lockedAt: DateTime
  lockedBy: User
  firstPublishedAt: DateTime
  lastPublishedAt: DateTime
  latestRevisionCreatedAt: DateTime
  aliasOf: Page
  pageType: String
  url: String
  parent: PageInterface
  children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}

type MediaLibraryPage implements PageInterface {
  id: ID
  path: String!
  depth: Int
  numchild: Int!
  translationKey: UUID!
  title: String!
  draftTitle: String!
  slug: String!
  contentType: String!
  live: Boolean!
  hasUnpublishedChanges: Boolean!
  urlPath: String!
  owner: User
  seoTitle: String!
  showInMenus: Boolean!
  searchDescription: String
  goLiveAt: DateTime
  expireAt: DateTime
  expired: Boolean!
  locked: Boolean
  lockedAt: DateTime
  lockedBy: User
  firstPublishedAt: DateTime
  lastPublishedAt: DateTime
  latestRevisionCreatedAt: DateTime
  aliasOf: Page
  pageType: String
  url: String
  parent: PageInterface
  children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}

type Mutation {
  sendFeedback(input: SendFeedbackInput!): SendFeedbackPayload
}

type Page implements PageInterface {
  id: ID
  path: String!
  depth: Int
  numchild: Int!
  translationKey: UUID!
  title: String!
  draftTitle: String!
  slug: String!
  contentType: String!
  live: Boolean!
  hasUnpublishedChanges: Boolean!
  urlPath: String!
  owner: User
  seoTitle: String!
  showInMenus: Boolean!
  searchDescription: String
  goLiveAt: DateTime
  expireAt: DateTime
  expired: Boolean!
  locked: Boolean
  lockedAt: DateTime
  lockedBy: User
  firstPublishedAt: DateTime
  lastPublishedAt: DateTime
  latestRevisionCreatedAt: DateTime
  aliasOf: Page
  sitesRootedHere: [SiteObjectType!]!
  aliases: [Page!]!
  coursepage: CoursePage
  learningpath: LearningPath
  topic: Topic
  circle: Circle
  learningsequence: LearningSequence
  learningunit: LearningUnit
  learningcontent: LearningContent
  competenceprofilepage: CompetenceProfilePage
  competencepage: CompetencePage
  performancecriteria: PerformanceCriteria
  medialibrarypage: MediaLibraryPage
  mediacategorypage: MediaCategoryPage
  pageType: String
  url: String
  parent: PageInterface
  children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}

type PageChooserBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  page: PageInterface!
}

interface PageInterface {
  id: ID
  title: String!
  slug: String!
  contentType: String!
  pageType: String
  live: Boolean!
  url: String
  urlPath: String!
  depth: Int
  seoTitle: String!
  searchDescription: String
  showInMenus: Boolean!
  locked: Boolean
  firstPublishedAt: DateTime
  lastPublishedAt: DateTime
  parent: PageInterface
  children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}

type PerformanceCriteria implements PageInterface {
  id: ID
  path: String!
  depth: Int
  numchild: Int!
  translationKey: UUID!
  title: String!
  draftTitle: String!
  slug: String!
  contentType: String!
  live: Boolean!
  hasUnpublishedChanges: Boolean!
  urlPath: String!
  owner: User
  seoTitle: String!
  showInMenus: Boolean!
  searchDescription: String
  goLiveAt: DateTime
  expireAt: DateTime
  expired: Boolean!
  locked: Boolean
  lockedAt: DateTime
  lockedBy: User
  firstPublishedAt: DateTime
  lastPublishedAt: DateTime
  latestRevisionCreatedAt: DateTime
  aliasOf: Page
  pageType: String
  url: String
  parent: PageInterface
  children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}

scalar PositiveInt

type Query {
  redirects: [RedirectType!]!
  collections(limit: PositiveInt, offset: PositiveInt, order: String, id: ID): [CollectionObjectType]!
  tag(id: ID): TagObjectType
  tags(limit: PositiveInt, offset: PositiveInt, order: String, id: ID): [TagObjectType!]!
  search(query: String): [Search!]!
  document(id: ID): LibraryDocument
  documents(collection: ID, limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [LibraryDocument!]!
  documentType: String!
  image(id: ID): ImageObjectType
  images(collection: ID, limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [ImageObjectType!]!
  imageType: String!
  site(hostname: String, id: ID): SiteObjectType
  sites(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [SiteObjectType!]!
  pages(contentType: String, inSite: Boolean = false, site: String, ancestor: ID, parent: ID, limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  page(id: Int, slug: String, urlPath: String, token: String, contentType: String, inSite: Boolean = false, site: String): PageInterface
}

type RawHTMLBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  value: String!
}

type RedirectType {
  oldPath: String!
  oldUrl: String!
  newUrl: String!
  page: PageInterface
  isPermanent: Boolean!
}

type RegexBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  value: String!
}

type RichTextBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  value: String!
}

union Search = CoursePage | LearningPath | Topic | Circle | LearningSequence | LearningUnit | LearningContent | CompetenceProfilePage | CompetencePage | PerformanceCriteria | MediaLibraryPage | MediaCategoryPage | Page | LibraryDocument | User | SecurityRequestResponseLog | Course | CourseCategory | CourseCompletion | CourseSession | CourseSessionUser

type SecurityRequestResponseLog {
  id: ID
}

input SendFeedbackInput {
  id: Int
  page: String!
  satisfaction: Int
  goalAttainment: Int
  proficiency: Int
  receivedMaterials: Boolean
  materialsRating: Int
  instructorCompetence: Int
  instructorRespect: Int
  instructorOpenFeedback: String
  wouldRecommend: Boolean
  coursePositiveFeedback: String
  courseNegativeFeedback: String
  clientMutationId: String
}

type SendFeedbackPayload {
  id: Int
  satisfaction: Int
  goalAttainment: Int
  proficiency: Int
  receivedMaterials: Boolean
  materialsRating: Int
  instructorCompetence: Int
  instructorRespect: Int
  instructorOpenFeedback: String
  wouldRecommend: Boolean
  coursePositiveFeedback: String
  courseNegativeFeedback: String
  errors: [ErrorType]
  clientMutationId: String
}

type SiteObjectType {
  id: ID!
  hostname: String!
  port: Int!
  siteName: String!
  rootPage: Page!
  isDefaultSite: Boolean!
  pages(contentType: String, limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  page(id: Int, slug: String, urlPath: String, token: String, contentType: String): PageInterface
}

type StaticBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  value: String!
}

type StreamBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  blocks: [StreamFieldInterface!]!
}

type StreamFieldBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  value: String!
}

interface StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
}

type StructBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  blocks: [StreamFieldInterface!]!
}

type TagObjectType {
  id: ID!
  name: String!
}

type TextBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  value: String!
}

type TimeBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  value(format: String): String!
}

type Topic implements PageInterface {
  id: ID
  path: String!
  depth: Int
  numchild: Int!
  translationKey: UUID!
  title: String!
  draftTitle: String!
  slug: String!
  contentType: String!
  live: Boolean!
  hasUnpublishedChanges: Boolean!
  urlPath: String!
  owner: User
  seoTitle: String!
  showInMenus: Boolean!
  searchDescription: String
  goLiveAt: DateTime
  expireAt: DateTime
  expired: Boolean!
  locked: Boolean
  lockedAt: DateTime
  lockedBy: User
  firstPublishedAt: DateTime
  lastPublishedAt: DateTime
  latestRevisionCreatedAt: DateTime
  aliasOf: Page
  pageType: String
  url: String
  parent: PageInterface
  children(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  siblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  nextSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  previousSiblings(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  descendants(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
  ancestors(limit: PositiveInt, offset: PositiveInt, order: String, searchQuery: String, id: ID): [PageInterface!]!
}

type URLBlock implements StreamFieldInterface {
  id: String
  blockType: String!
  field: String!
  rawValue: String!
  value: String!
}

scalar UUID

type User {
  id: ID
}
