schema {
  query: CustomQuery
  mutation: CustomMutation
}

input AddCommentInput {
  comment: String!
  roomEntry: ID!
  clientMutationId: String
}

type AddCommentPayload {
  success: Boolean
  comment: CommentNode
  clientMutationId: String
}

input AddContentBlockInput {
  contentBlock: ContentBlockInput
  parent: ID
  after: ID
  clientMutationId: String
}

type AddContentBlockPayload {
  newContentBlock: ContentBlockNode
  errors: [String]
  clientMutationId: String
}

input AddNoteArgument {
  content: UUID
  block: String
  type: String
  parent: ID
  text: String!
}

input AddNoteInput {
  note: AddNoteArgument
  clientMutationId: String
}

type AddNotePayload {
  note: NoteNode
  clientMutationId: String
}

input AddObjectiveArgument {
  text: String!
  objectiveGroup: ID
}

input AddObjectiveInput {
  objective: AddObjectiveArgument
  clientMutationId: String
}

type AddObjectivePayload {
  objective: ObjectiveNode
  clientMutationId: String
}

input AddProjectArgument {
  title: String
  description: String
  objectives: String
  appearance: String
}

input AddProjectEntryArgument {
  description: String
  documentUrl: String
  project: ID!
}

input AddProjectEntryInput {
  projectEntry: AddProjectEntryArgument
  clientMutationId: String
}

type AddProjectEntryPayload {
  errors: [String]
  projectEntry: ProjectEntryNode
  clientMutationId: String
}

input AddProjectInput {
  project: AddProjectArgument
  clientMutationId: String
}

type AddProjectPayload {
  errors: [String]
  project: ProjectNode
  clientMutationId: String
}

input AddRemoveMemberInput {
  member: ID!
  schoolClass: ID!
  active: Boolean!
  clientMutationId: String
}

type AddRemoveMemberPayload {
  success: Boolean
  clientMutationId: String
}

input AddRoomArgument {
  title: String
  description: String
  schoolClass: SchoolClassInput
  appearance: String
}

input AddRoomEntryArgument {
  title: String!
  contents: [ContentElementInput]
  room: ID!
}

input AddRoomEntryInput {
  roomEntry: AddRoomEntryArgument
  clientMutationId: String
}

type AddRoomEntryPayload {
  roomEntry: RoomEntryNode
  errors: [String]
  clientMutationId: String
}

input AddRoomInput {
  room: AddRoomArgument
  clientMutationId: String
}

type AddRoomPayload {
  errors: [String]
  room: RoomNode
  clientMutationId: String
}

type AnswerNode implements Node {
  id: ID!
  owner: PrivateUserNode!
  data: JSONString!
  survey: SurveyNode!
  pk: Int
}

type AnswerNodeConnection {
  pageInfo: PageInfo!
  edges: [AnswerNodeEdge]!
}

type AnswerNodeEdge {
  node: AnswerNode
  cursor: String!
}

input ApplySnapshotInput {
  snapshot: ID!
  selectedClass: ID!
  clientMutationId: String
}

type ApplySnapshotPayload {
  success: Boolean
  module: ModuleNode
  clientMutationId: String
}

input AssignmentInput {
  id: ID!
  answer: String!
  document: String
  final: Boolean
}

type AssignmentNode implements Node {
  created: DateTime!
  modified: DateTime!
  id: ID!
  title: String!
  assignment: String!
  solution: String
  deleted: Boolean!
  owner: PrivateUserNode
  module: ModuleNode!
  userCreated: Boolean!
  taskbaseId: String
  submissions: [StudentSubmissionNode]
  submission: StudentSubmissionNode
}

type AssignmentNodeConnection {
  pageInfo: PageInfo!
  edges: [AssignmentNodeEdge]!
}

type AssignmentNodeEdge {
  node: AssignmentNode
  cursor: String!
}

enum BasicKnowledgeType {
  LANGUAGE_COMMUNICATION
  SOCIETY
  INTERDISCIPLINARY
}

type ChapterBookmarkNode implements Node {
  user: PrivateUserNode!
  note: NoteNode
  id: ID!
  chapter: ChapterNode!
}

type ChapterBookmarkNodeConnection {
  pageInfo: PageInfo!
  edges: [ChapterBookmarkNodeEdge]!
}

type ChapterBookmarkNodeEdge {
  node: ChapterBookmarkNode
  cursor: String!
}

interface ChapterInterface {
  description: String
  title: String
}

type ChapterNode implements Node & ChapterInterface {
  title: String
  slug: String!
  description: String
  titleHiddenFor: [SchoolClassNode]
  descriptionHiddenFor: [SchoolClassNode]
  id: ID!
  bookmark: ChapterBookmarkNode
  contentBlocks: [ContentBlockNode]
}

type ChapterNodeConnection {
  pageInfo: PageInfo!
  edges: [ChapterNodeEdge]!
}

type ChapterNodeEdge {
  node: ChapterNode
  cursor: String!
}

type ClassMemberNode {
  user: PublicUserNode
  active: Boolean
  firstName: String
  lastName: String
  isTeacher: Boolean
  id: ID
  isMe: Boolean
}

type CommentNode implements Node {
  text: String!
  owner: PublicUserNode
  created: DateTime!
  id: ID!
}

type CommentNodeConnection {
  pageInfo: PageInfo!
  edges: [CommentNodeEdge]!
}

type CommentNodeEdge {
  node: CommentNode
  cursor: String!
}

type ContentBlockBookmarkNode implements Node {
  id: ID!
  user: PrivateUserNode!
  note: NoteNode
  uuid: UUID
  contentBlock: ContentBlockNode!
}

type ContentBlockBookmarkNodeConnection {
  pageInfo: PageInfo!
  edges: [ContentBlockBookmarkNodeEdge]!
}

type ContentBlockBookmarkNodeEdge {
  node: ContentBlockBookmarkNode
  cursor: String!
}

input ContentBlockInput {
  title: String
  type: String
  contents: [ContentElementInput]
  visibility: [UserGroupBlockVisibility]
}

interface ContentBlockInterface {
  title: String
  contents: GenericStreamFieldType
  type: String
}

type ContentBlockNode implements Node & ContentBlockInterface {
  title: String
  slug: String!
  hiddenFor: [SchoolClassNode]
  visibleFor: [SchoolClassNode]
  userCreated: Boolean!
  contents: GenericStreamFieldType
  type: String
  id: ID!
  mine: Boolean
  bookmarks: [ContentBlockBookmarkNode]
  originalCreator: PublicUserNode
}

type ContentBlockNodeConnection {
  pageInfo: PageInfo!
  edges: [ContentBlockNodeEdge]!
}

type ContentBlockNodeEdge {
  node: ContentBlockNode
  cursor: String!
}

input ContentElementInput {
  id: String
  type: InputTypes!
  value: ContentElementValueInput
}

input ContentElementValueInput {
  text: String
  url: String
  description: String
  title: String
  assignment: String
  id: String
}

input CouponInput {
  couponCode: String
  clientMutationId: String
}

type CouponPayload {
  success: Boolean
  clientMutationId: String
}

input CreateSchoolClassInput {
  name: String
  clientMutationId: String
}

type CreateSchoolClassPayload {
  success: Boolean
  schoolClass: SchoolClassNode
  clientMutationId: String
}

input CreateSnapshotInput {
  module: String!
  selectedClass: ID!
  clientMutationId: String
}

type CreateSnapshotPayload {
  snapshot: SnapshotNode
  success: Boolean
  clientMutationId: String
}

input CreateTeamInput {
  name: String!
  clientMutationId: String
}

type CreateTeamPayload {
  success: Boolean
  team: TeamNode
  clientMutationId: String
}

type CustomMutation {
  spellCheck(input: SpellCheckInput!): SpellCheckPayload
  addNote(input: AddNoteInput!): AddNotePayload
  updateNote(input: UpdateNoteInput!): UpdateNotePayload
  updateContentBookmark(input: UpdateContentBookmarkInput!): UpdateContentBookmarkPayload
  updateChapterBookmark(input: UpdateChapterBookmarkInput!): UpdateChapterBookmarkPayload
  updateModuleBookmark(input: UpdateModuleBookmarkInput!): UpdateModuleBookmarkPayload
  updateInstrumentBookmark(input: UpdateInstrumentBookmarkInput!): UpdateInstrumentBookmarkPayload
  updateAnswer(input: UpdateAnswerInput!): UpdateAnswerPayload
  updatePassword(input: UpdatePasswordInput!): UpdatePasswordPayload
  updateAvatar(input: UpdateAvatarInput!): UpdateAvatarPayload
  updateSetting(input: UpdateSettingInput!): UpdateSettingPayload
  joinClass(input: JoinClassInput!): JoinClassPayload
  addRemoveMember(input: AddRemoveMemberInput!): AddRemoveMemberPayload
  updateSchoolClass(input: UpdateSchoolClassInput!): UpdateSchoolClassPayload
  createSchoolClass(input: CreateSchoolClassInput!): CreateSchoolClassPayload
  updateOnboardingProgress: UpdateOnboardingProgress
  createTeam(input: CreateTeamInput!): CreateTeamPayload
  joinTeam(input: JoinTeamInput!): JoinTeamPayload
  updateTeam(input: UpdateTeamInput!): UpdateTeamPayload
  leaveTeam: LeaveTeam
  addProject(input: AddProjectInput!): AddProjectPayload
  updateProject(input: UpdateProjectInput!): UpdateProjectPayload
  deleteProject(input: DeleteProjectInput!): DeleteProjectPayload
  addProjectEntry(input: AddProjectEntryInput!): AddProjectEntryPayload
  updateProjectEntry(input: UpdateProjectEntryInput!): UpdateProjectEntryPayload
  deleteProjectEntry(input: DeleteProjectEntryInput!): DeleteProjectEntryPayload
  updateProjectSharedState(input: UpdateProjectSharedStateInput!): UpdateProjectSharedStatePayload
  logout: Logout
  coupon(input: CouponInput!): CouponPayload
  updateObjectiveVisibility(input: UpdateObjectiveVisibilityInput!): UpdateObjectiveVisibilityPayload
  updateObjectiveGroupVisibility(input: UpdateObjectiveGroupVisibilityInput!): UpdateObjectiveGroupVisibilityPayload
  addObjective(input: AddObjectiveInput!): AddObjectivePayload
  deleteObjective(input: DeleteObjectiveInput!): DeleteObjectivePayload
  updateAssignment(input: UpdateAssignmentInput!): UpdateAssignmentPayload
  updateSubmissionFeedback(input: UpdateSubmissionFeedbackInput!): UpdateSubmissionFeedbackPayload
  updateRoom(input: UpdateRoomInput!): UpdateRoomPayload
  addRoom(input: AddRoomInput!): AddRoomPayload
  deleteRoom(input: DeleteRoomInput!): DeleteRoomPayload
  addRoomEntry(input: AddRoomEntryInput!): AddRoomEntryPayload
  deleteRoomEntry(input: DeleteRoomEntryInput!): DeleteRoomEntryPayload
  updateRoomEntry(input: UpdateRoomEntryInput!): UpdateRoomEntryPayload
  addComment(input: AddCommentInput!): AddCommentPayload
  updateRoomVisibility(input: UpdateRoomVisibilityInput!): UpdateRoomVisibilityPayload
  mutateContentBlock(input: MutateContentBlockInput!): MutateContentBlockPayload
  addContentBlock(input: AddContentBlockInput!): AddContentBlockPayload
  deleteContentBlock(input: DeleteContentBlockInput!): DeleteContentBlockPayload
  updateSolutionVisibility(input: UpdateSolutionVisibilityInput!): UpdateSolutionVisibilityPayload
  updateLastModule(input: UpdateLastModuleInput!): UpdateLastModulePayload
  updateLastTopic(input: UpdateLastTopicInput!): UpdateLastTopicPayload
  updateChapterVisibility(input: UpdateChapterVisibilityInput!): UpdateChapterVisibilityPayload
  syncModuleVisibility(input: SyncModuleVisibilityInput!): SyncModuleVisibilityPayload
  createSnapshot(input: CreateSnapshotInput!): CreateSnapshotPayload
  applySnapshot(input: ApplySnapshotInput!): ApplySnapshotPayload
  shareSnapshot(input: ShareSnapshotInput!): ShareSnapshotPayload
  _debug: DjangoDebug
}

type CustomQuery {
  newsTeasers(offset: Int, before: String, after: String, first: Int, last: Int, date: Date): NewsTeaserNodeConnection
  survey(id: ID): SurveyNode
  surveys(offset: Int, before: String, after: String, first: Int, last: Int): SurveyNodeConnection
  project(id: ID, slug: String): ProjectNode
  projects: [ProjectNode]
  instrument(slug: String, id: ID): InstrumentNode
  instruments(offset: Int, before: String, after: String, first: Int, last: Int, slug: String, type: String): InstrumentNodeConnection
  studentSubmission(id: ID!): StudentSubmissionNode
  assignment(id: ID!): AssignmentNode
  assignments(offset: Int, before: String, after: String, first: Int, last: Int): AssignmentNodeConnection
  node(id: ID!): Node
  topic(slug: String): TopicNode
  module(slug: String, id: ID): ModuleNode
  chapter(id: ID!): ChapterNode
  contentBlock(id: ID!): ContentBlockNode
  snapshot(id: ID!): SnapshotNode
  topics(before: String, after: String, first: Int, last: Int): TopicConnection
  modules(before: String, after: String, first: Int, last: Int): ModuleConnection
  chapters(offset: Int, before: String, after: String, first: Int, last: Int, slug: String, title: String): ChapterNodeConnection
  objectiveGroup(id: ID!): ObjectiveGroupNode
  objectiveGroups(offset: Int, before: String, after: String, first: Int, last: Int, title: String, module_Slug: String): ObjectiveGroupNodeConnection
  roomEntry(id: ID, slug: String): RoomEntryNode
  room(slug: String, id: ID, appearance: String): RoomNode
  rooms(offset: Int, before: String, after: String, first: Int, last: Int, slug: String, appearance: String): RoomNodeConnection
  allRoomEntries(offset: Int, before: String, after: String, first: Int, last: Int, slug: String): RoomEntryNodeConnection
  moduleRoom(slug: String, classId: ID): RoomNode
  me: PrivateUserNode
  allUsers(offset: Int, before: String, after: String, first: Int, last: Int, username: String, email: String): PrivateUserNodeConnection
  myActivity(offset: Int, before: String, after: String, first: Int, last: Int, slug: String, slug_Icontains: String, slug_In: [String], title: String, title_Icontains: String, title_In: [String]): ModuleNodeConnection
  myInstrumentActivity(offset: Int, before: String, after: String, first: Int, last: Int, slug: String, type: String): InstrumentNodeConnection
  _debug: DjangoDebug
}

scalar Date

scalar DateTime

input DeleteContentBlockInput {
  id: ID!
  clientMutationId: String
}

type DeleteContentBlockPayload {
  success: Boolean
  errors: String
  clientMutationId: String
}

input DeleteObjectiveInput {
  id: ID!
  clientMutationId: String
}

type DeleteObjectivePayload {
  success: Boolean
  clientMutationId: String
}

input DeleteProjectEntryInput {
  id: ID!
  clientMutationId: String
}

type DeleteProjectEntryPayload {
  success: Boolean
  errors: [String]
  clientMutationId: String
}

input DeleteProjectInput {
  id: ID!
  clientMutationId: String
}

type DeleteProjectPayload {
  success: Boolean
  errors: [String]
  clientMutationId: String
}

input DeleteRoomEntryInput {
  id: ID!
  clientMutationId: String
}

type DeleteRoomEntryPayload {
  success: Boolean
  roomSlug: String
  roomId: ID
  errors: [String]
  clientMutationId: String
}

input DeleteRoomInput {
  id: ID!
  clientMutationId: String
}

type DeleteRoomPayload {
  success: Boolean
  errors: [String]
  clientMutationId: String
}

type DjangoDebug {
  sql: [DjangoDebugSQL]
}

type DjangoDebugSQL {
  vendor: String!
  alias: String!
  sql: String
  duration: Float!
  rawSql: String!
  params: String!
  startTime: Float!
  stopTime: Float!
  isSlow: Boolean!
  isSelect: Boolean!
  transId: String
  transStatus: String
  isoLevel: String
  encoding: String
}

type FieldError {
  code: String
}

scalar GenericStreamFieldType

enum InputTypes {
  text_block
  assignment
  image_block
  image_url_block
  link_block
  video_block
  document_block
}

type InstrumentBookmarkNode implements Node {
  user: PrivateUserNode!
  note: NoteNode
  id: ID!
  uuid: UUID
  instrument: InstrumentNode!
}

type InstrumentNode implements Node {
  title: String!
  slug: String!
  intro: String!
  contents: GenericStreamFieldType
  type: BasicKnowledgeType!
  id: ID!
  bookmarks: [InstrumentBookmarkNode]
}

type InstrumentNodeConnection {
  pageInfo: PageInfo!
  edges: [InstrumentNodeEdge]!
}

type InstrumentNodeEdge {
  node: InstrumentNode
  cursor: String!
}

scalar JSONString

input JoinClassInput {
  code: String!
  clientMutationId: String
}

type JoinClassPayload {
  success: Boolean
  schoolClass: SchoolClassNode
  clientMutationId: String
}

input JoinTeamInput {
  code: String!
  clientMutationId: String
}

type JoinTeamPayload {
  success: Boolean
  team: TeamNode
  clientMutationId: String
}

type LeaveTeam {
  success: Boolean
}

type Logout {
  success: Boolean
}

type ModuleBookmarkNode {
  user: PrivateUserNode!
  note: NoteNode
  id: ID!
  module: ModuleNode!
}

type ModuleConnection {
  pageInfo: PageInfo!
  edges: [ModuleEdge]!
  nodes: [ModuleNode]
}

type ModuleEdge {
  node: ModuleNode
  cursor: String!
}

interface ModuleInterface {
  id: ID!
  pk: Int
  heroImage: String!
  topic: TopicNode
}

type ModuleNode implements ModuleInterface {
  title: String!
  slug: String!
  metaTitle: String!
  heroImage: String!
  teaser: String!
  intro: String!
  assignments(offset: Int, before: String, after: String, first: Int, last: Int): AssignmentNodeConnection!
  objectiveGroups: [ObjectiveGroupNode]
  id: ID!
  pk: Int
  topic: TopicNode
  chapters: [ChapterNode]
  solutionsEnabled: Boolean
  bookmark: ModuleBookmarkNode
  mySubmissions(offset: Int, before: String, after: String, first: Int, last: Int): StudentSubmissionNodeConnection
  myAnswers(offset: Int, before: String, after: String, first: Int, last: Int): AnswerNodeConnection
  myContentBookmarks(offset: Int, before: String, after: String, first: Int, last: Int): ContentBlockBookmarkNodeConnection
  myChapterBookmarks(offset: Int, before: String, after: String, first: Int, last: Int): ChapterBookmarkNodeConnection
  snapshots: [SnapshotNode]
}

type ModuleNodeConnection {
  pageInfo: PageInfo!
  edges: [ModuleNodeEdge]!
}

type ModuleNodeEdge {
  node: ModuleNode
  cursor: String!
}

input MutateContentBlockInput {
  id: ID!
  contentBlock: ContentBlockInput
  clientMutationId: String
}

type MutateContentBlockPayload {
  contentBlock: ContentBlockNode
  clientMutationId: String
}

type NewsTeaserNode implements Node {
  id: ID!
  imageUrl: String
  title: String!
  description: String
  date: Date
  orderId: Int!
  newsArticleUrl: String
  imageSource: String!
  displayDate: String
}

type NewsTeaserNodeConnection {
  pageInfo: PageInfo!
  edges: [NewsTeaserNodeEdge]!
}

type NewsTeaserNodeEdge {
  node: NewsTeaserNode
  cursor: String!
}

interface Node {
  id: ID!
}

type NoteNode implements Node {
  id: ID!
  text: String!
  contentblockbookmark: ContentBlockBookmarkNode
  modulebookmark: ModuleBookmarkNode
  chapterbookmark: ChapterBookmarkNode
  instrumentbookmark: InstrumentBookmarkNode
  pk: Int
}

type ObjectiveGroupNode implements Node {
  id: ID!
  title: ObjectiveGroupTitle
  module: ModuleNode!
  hiddenFor: [SchoolClassNode]
  objectives: [ObjectiveNode]
  pk: Int
  displayTitle: String
}

type ObjectiveGroupNodeConnection {
  pageInfo: PageInfo!
  edges: [ObjectiveGroupNodeEdge]!
}

type ObjectiveGroupNodeEdge {
  node: ObjectiveGroupNode
  cursor: String!
}

enum ObjectiveGroupTitle {
  LANGUAGE_COMMUNICATION
  SOCIETY
  INTERDISCIPLINARY
}

type ObjectiveNode implements Node {
  id: ID!
  text: String!
  group: ObjectiveGroupNode!
  owner: PrivateUserNode
  hiddenFor: [SchoolClassNode]
  visibleFor: [SchoolClassNode]
  order: Int
  hiddenForSnapshots(offset: Int, before: String, after: String, first: Int, last: Int): SnapshotNodeConnection!
  pk: Int
  userCreated: Boolean
  mine: Boolean
}

type ObjectiveNodeConnection {
  pageInfo: PageInfo!
  edges: [ObjectiveNodeEdge]!
}

type ObjectiveNodeEdge {
  node: ObjectiveNode
  cursor: String!
}

type PageInfo {
  hasNextPage: Boolean!
  hasPreviousPage: Boolean!
  startCursor: String
  endCursor: String
}

input PasswordUpdateInput {
  oldPassword: String
  newPassword: String
}

type PrivateUserNode implements Node {
  firstName: String!
  lastName: String!
  avatarUrl: String!
  username: String!
  lastModule: ModuleNode
  lastTopic: TopicNode
  email: String!
  onboardingVisited: Boolean!
  team: TeamNode
  schoolClasses(offset: Int, before: String, after: String, first: Int, last: Int, name: String): SchoolClassNodeConnection!
  id: ID!
  pk: Int
  permissions: [String]
  selectedClass: SchoolClassNode
  expiryDate: String
  isTeacher: Boolean
  oldClasses(offset: Int, before: String, after: String, first: Int, last: Int, name: String): SchoolClassNodeConnection
  recentModules(offset: Int, before: String, after: String, first: Int, last: Int, recentModules: [ID], orderBy: String): ModuleNodeConnection
  readOnly: Boolean
}

type PrivateUserNodeConnection {
  pageInfo: PageInfo!
  edges: [PrivateUserNodeEdge]!
}

type PrivateUserNodeEdge {
  node: PrivateUserNode
  cursor: String!
}

type ProjectEntryNode implements Node {
  documentUrl: String!
  description: String!
  created: DateTime!
  project: ProjectNode!
  id: ID!
}

type ProjectNode implements Node {
  id: ID!
  title: String!
  description: String
  slug: String!
  objectives: String!
  appearance: String!
  student: PrivateUserNode!
  final: Boolean!
  schoolClass: SchoolClassNode
  entries: [ProjectEntryNode]
  pk: Int
  entriesCount: Int
}

type PublicUserNode implements Node {
  firstName: String!
  lastName: String!
  avatarUrl: String!
  id: ID!
  fullName: String!
  isMe: Boolean
}

type RoomEntryNode implements Node {
  title: String!
  description: String
  slug: String!
  id: ID!
  room: RoomNode!
  author: PublicUserNode
  contents: GenericStreamFieldType
  comments(offset: Int, before: String, after: String, first: Int, last: Int, owner: ID): CommentNodeConnection
  pk: Int
}

type RoomEntryNodeConnection {
  pageInfo: PageInfo!
  edges: [RoomEntryNodeEdge]!
}

type RoomEntryNodeEdge {
  node: RoomEntryNode
  cursor: String!
}

type RoomNode implements Node {
  title: String!
  description: String
  slug: String!
  id: ID!
  schoolClass: SchoolClassNode!
  appearance: String!
  userCreated: Boolean!
  restricted: Boolean!
  roomEntries(offset: Int, before: String, after: String, first: Int, last: Int, slug: String): RoomEntryNodeConnection!
  pk: Int
  entryCount: Int
}

type RoomNodeConnection {
  pageInfo: PageInfo!
  edges: [RoomNodeEdge]!
}

type RoomNodeEdge {
  node: RoomNode
  cursor: String!
}

input SchoolClassInput {
  id: ID
  name: String
}

type SchoolClassNode implements Node {
  name: String!
  code: String
  id: ID!
  pk: Int
  members: [ClassMemberNode]
  readOnly: Boolean
}

type SchoolClassNodeConnection {
  pageInfo: PageInfo!
  edges: [SchoolClassNodeEdge]!
}

type SchoolClassNodeEdge {
  node: SchoolClassNode
  cursor: String!
}

input ShareSnapshotInput {
  snapshot: ID!
  shared: Boolean!
  clientMutationId: String
}

type ShareSnapshotPayload {
  success: Boolean!
  snapshot: SnapshotNode
  clientMutationId: String
}

type SnapshotChangesNode {
  hiddenObjectives: Int!
  newObjectives: Int!
  hiddenContentBlocks: Int!
  newContentBlocks: Int!
}

type SnapshotChapterNode implements Node & ChapterInterface {
  id: ID!
  description: String
  title: String
  contentBlocks: [SnapshotContentBlockNode]
  descriptionHidden: Boolean
  titleHidden: Boolean
}

type SnapshotContentBlockNode implements Node & ContentBlockInterface {
  id: ID!
  title: String
  contents: GenericStreamFieldType
  type: String
  hidden: Boolean
}

type SnapshotNode implements Node {
  id: ID!
  module: ModuleNode!
  chapters: [SnapshotChapterNode]
  hiddenContentBlocks(offset: Int, before: String, after: String, first: Int, last: Int, slug: String, title: String): ContentBlockNodeConnection!
  created: DateTime!
  creator: String!
  shared: Boolean!
  objectiveGroups: [SnapshotObjectiveGroupNode]
  hiddenObjectives(offset: Int, before: String, after: String, first: Int, last: Int, text: String): ObjectiveNodeConnection!
  title: String
  metaTitle: String
  heroImage: String
  changes: SnapshotChangesNode
  mine: Boolean
}

type SnapshotNodeConnection {
  pageInfo: PageInfo!
  edges: [SnapshotNodeEdge]!
}

type SnapshotNodeEdge {
  node: SnapshotNode
  cursor: String!
}

type SnapshotObjectiveGroupNode implements Node {
  id: ID!
  title: String!
  hidden: Boolean!
  displayTitle: String!
  objectives: [SnapshotObjectiveNode]!
}

type SnapshotObjectiveNode implements Node {
  id: ID!
  hidden: Boolean!
  text: String!
}

input SpellCheckInput {
  text: String!
  assignment: ID!
  clientMutationId: String
}

type SpellCheckPayload {
  results: [SpellCheckStepNode]
  correct: Boolean
  clientMutationId: String
}

type SpellCheckStepNode {
  sentence: String
  offset: Int
  sentenceOffset: Int
  length: Int
  affected: String
  corrected: String
}

type StudentSubmissionNode implements Node {
  created: DateTime!
  modified: DateTime!
  id: ID!
  text: String!
  document: String!
  assignment: AssignmentNode!
  student: PrivateUserNode!
  final: Boolean!
  submissionFeedback: SubmissionFeedbackNode
}

type StudentSubmissionNodeConnection {
  pageInfo: PageInfo!
  edges: [StudentSubmissionNodeEdge]!
}

type StudentSubmissionNodeEdge {
  node: StudentSubmissionNode
  cursor: String!
}

input SubmissionFeedbackInput {
  id: ID
  studentSubmission: ID!
  text: String!
  final: Boolean
}

type SubmissionFeedbackNode implements Node {
  created: DateTime!
  modified: DateTime!
  text: String!
  teacher: PrivateUserNode!
  studentSubmission: StudentSubmissionNode!
  final: Boolean!
  id: ID!
}

type SurveyNode implements Node {
  id: ID!
  title: String!
  module: ModuleNode
  data: JSONString!
  answers(offset: Int, before: String, after: String, first: Int, last: Int): AnswerNodeConnection!
  pk: Int
  answer: AnswerNode
}

type SurveyNodeConnection {
  pageInfo: PageInfo!
  edges: [SurveyNodeEdge]!
}

type SurveyNodeEdge {
  node: SurveyNode
  cursor: String!
}

input SyncModuleVisibilityInput {
  module: String!
  templateSchoolClass: ID!
  schoolClass: ID!
  clientMutationId: String
}

type SyncModuleVisibilityPayload {
  success: Boolean
  clientMutationId: String
}

type TeamNode implements Node {
  name: String!
  code: String
  id: ID!
  isDeleted: Boolean!
  creator: PrivateUserNode
  members: [PublicUserNode]
  pk: Int
}

type TopicConnection {
  pageInfo: PageInfo!
  edges: [TopicEdge]!
  nodes: [TopicNode]
}

type TopicEdge {
  node: TopicNode
  cursor: String!
}

type TopicNode implements Node {
  title: String!
  slug: String!
  order: Int!
  teaser: String!
  description: String!
  vimeoId: String
  instructions: String
  id: ID!
  pk: Int
  modules(offset: Int, before: String, after: String, first: Int, last: Int, slug: String, slug_Icontains: String, slug_In: [String], title: String, title_Icontains: String, title_In: [String]): ModuleNodeConnection
}

scalar UUID

input UpdateAnswerArgument {
  surveyId: ID!
  data: String!
}

input UpdateAnswerInput {
  answer: UpdateAnswerArgument
  clientMutationId: String
}

type UpdateAnswerPayload {
  answer: AnswerNode
  clientMutationId: String
}

input UpdateAssignmentInput {
  assignment: AssignmentInput
  clientMutationId: String
}

type UpdateAssignmentPayload {
  updatedAssignment: AssignmentNode
  submission: StudentSubmissionNode
  successful: Boolean
  errors: [String]
  clientMutationId: String
}

input UpdateAvatarInput {
  avatarUrl: String
  clientMutationId: String
}

type UpdateAvatarPayload {
  success: Boolean
  errors: [UpdateError]
  clientMutationId: String
}

input UpdateChapterBookmarkInput {
  chapter: ID!
  bookmarked: Boolean!
  clientMutationId: String
}

type UpdateChapterBookmarkPayload {
  success: Boolean
  clientMutationId: String
}

input UpdateChapterVisibilityInput {
  id: ID!
  visibility: [UserGroupBlockVisibility]
  type: String!
  clientMutationId: String
}

type UpdateChapterVisibilityPayload {
  chapter: ChapterNode
  clientMutationId: String
}

input UpdateContentBookmarkInput {
  uuid: UUID!
  contentBlock: ID!
  bookmarked: Boolean!
  clientMutationId: String
}

type UpdateContentBookmarkPayload {
  success: Boolean
  errors: String
  clientMutationId: String
}

type UpdateError {
  field: String
  errors: [FieldError]
}

input UpdateInstrumentBookmarkInput {
  uuid: UUID!
  instrument: String!
  bookmarked: Boolean!
  clientMutationId: String
}

type UpdateInstrumentBookmarkPayload {
  success: Boolean
  clientMutationId: String
}

input UpdateLastModuleInput {
  id: ID
  clientMutationId: String
}

type UpdateLastModulePayload {
  lastModule: ModuleNode
  clientMutationId: String
}

input UpdateLastTopicInput {
  id: ID
  clientMutationId: String
}

type UpdateLastTopicPayload {
  topic: TopicNode
  clientMutationId: String
}

input UpdateModuleBookmarkInput {
  module: String!
  bookmarked: Boolean!
  clientMutationId: String
}

type UpdateModuleBookmarkPayload {
  success: Boolean
  clientMutationId: String
}

input UpdateNoteArgument {
  id: ID!
  text: String!
}

input UpdateNoteInput {
  note: UpdateNoteArgument
  clientMutationId: String
}

type UpdateNotePayload {
  note: NoteNode
  clientMutationId: String
}

input UpdateObjectiveGroupVisibilityInput {
  id: ID!
  visibility: [UserGroupBlockVisibility]
  clientMutationId: String
}

type UpdateObjectiveGroupVisibilityPayload {
  objectiveGroup: ObjectiveGroupNode
  clientMutationId: String
}

input UpdateObjectiveVisibilityInput {
  id: ID!
  visibility: [UserGroupBlockVisibility]
  clientMutationId: String
}

type UpdateObjectiveVisibilityPayload {
  objective: ObjectiveNode
  clientMutationId: String
}

type UpdateOnboardingProgress {
  success: Boolean
}

input UpdatePasswordInput {
  passwordInput: PasswordUpdateInput
  clientMutationId: String
}

type UpdatePasswordPayload {
  success: Boolean
  errors: [UpdateError]
  clientMutationId: String
}

input UpdateProjectArgument {
  title: String
  description: String
  objectives: String
  appearance: String
  id: ID!
  final: Boolean
}

input UpdateProjectEntryArgument {
  description: String
  documentUrl: String
  id: ID!
}

input UpdateProjectEntryInput {
  projectEntry: UpdateProjectEntryArgument
  clientMutationId: String
}

type UpdateProjectEntryPayload {
  errors: [String]
  projectEntry: ProjectEntryNode
  clientMutationId: String
}

input UpdateProjectInput {
  project: UpdateProjectArgument
  clientMutationId: String
}

type UpdateProjectPayload {
  errors: [String]
  project: ProjectNode
  clientMutationId: String
}

input UpdateProjectSharedStateInput {
  id: ID
  shared: Boolean
  clientMutationId: String
}

type UpdateProjectSharedStatePayload {
  success: Boolean
  shared: Boolean
  errors: [String]
  clientMutationId: String
}

input UpdateRoomArgument {
  title: String
  description: String
  schoolClass: SchoolClassInput
  appearance: String
  id: ID!
}

input UpdateRoomEntryArgument {
  title: String!
  contents: [ContentElementInput]
  id: ID!
}

input UpdateRoomEntryInput {
  roomEntry: UpdateRoomEntryArgument
  clientMutationId: String
}

type UpdateRoomEntryPayload {
  roomEntry: RoomEntryNode
  errors: [String]
  clientMutationId: String
}

input UpdateRoomInput {
  room: UpdateRoomArgument
  clientMutationId: String
}

type UpdateRoomPayload {
  errors: [String]
  room: RoomNode
  clientMutationId: String
}

input UpdateRoomVisibilityInput {
  id: ID!
  restricted: Boolean!
  clientMutationId: String
}

type UpdateRoomVisibilityPayload {
  success: Boolean
  room: RoomNode
  clientMutationId: String
}

input UpdateSchoolClassInput {
  id: ID!
  name: String
  clientMutationId: String
}

type UpdateSchoolClassPayload {
  success: Boolean
  schoolClass: SchoolClassNode
  clientMutationId: String
}

input UpdateSettingInput {
  id: ID!
  clientMutationId: String
}

type UpdateSettingPayload {
  success: Boolean
  errors: [UpdateError]
  clientMutationId: String
}

input UpdateSolutionVisibilityInput {
  slug: String
  enabled: Boolean
  clientMutationId: String
}

type UpdateSolutionVisibilityPayload {
  success: Boolean
  solutionsEnabled: Boolean
  errors: [String]
  clientMutationId: String
}

input UpdateSubmissionFeedbackInput {
  submissionFeedback: SubmissionFeedbackInput
  clientMutationId: String
}

type UpdateSubmissionFeedbackPayload {
  updatedSubmissionFeedback: SubmissionFeedbackNode
  successful: Boolean
  errors: [String]
  clientMutationId: String
}

input UpdateTeamInput {
  id: ID!
  name: String
  clientMutationId: String
}

type UpdateTeamPayload {
  success: Boolean
  team: TeamNode
  clientMutationId: String
}

input UserGroupBlockVisibility {
  schoolClassId: ID!
  hidden: Boolean!
}
