type Query {
  course(id: Int): CourseType
  assignment(id: ID, slug: String): AssignmentType
  assignment_completion(assignment_id: ID!, course_session_id: ID!, assignment_user_id: ID): AssignmentCompletionType
}

type CourseType {
  id: ID!
  title: String!
  category_name: String!
  slug: String!
  learning_path: LearningPathType
}

type LearningPathType implements CoursePageInterface {
  id: ID
  path: String!
  depth: Int!
  numchild: Int!
  translation_key: String
  live: Boolean
  has_unpublished_changes: Boolean!
  first_published_at: DateTime
  last_published_at: DateTime
  go_live_at: DateTime
  expire_at: DateTime
  expired: Boolean!
  locked: Boolean!
  locked_at: DateTime
  locked_by: UserType
  title: String
  draft_title: String!
  slug: String
  content_type: String
  url_path: String!
  owner: UserType

  """
  Der Titel der Seite, dargestellt in Suchmaschinen-Ergebnissen als die verlinkte Überschrift.
  """
  seo_title: String!

  """
  Ob ein Link zu dieser Seite in automatisch generierten Menüs auftaucht.
  """
  show_in_menus: Boolean!

  """
  Die informative Beschreibung, dargestellt in Suchmaschinen-Ergebnissen unter der Überschrift.
  """
  search_description: String!
  latest_revision_created_at: DateTime
  frontend_url: String
}

interface CoursePageInterface {
  id: ID
  title: String
  slug: String
  content_type: String
  live: Boolean
  translation_key: String
  frontend_url: String
}

"""
The `DateTime` scalar type represents a DateTime
value as specified by
[iso8601](https://en.wikipedia.org/wiki/ISO_8601).
"""
scalar DateTime

type UserType {
  id: ID!

  """
  Erforderlich. 150 Zeichen oder weniger. Nur Buchstaben, Ziffern und @/./+/-/_.
  """
  username: String!
  first_name: String!
  last_name: String!
  avatar_url: String!
  email: String!
  language: CoreUserLanguageChoices!
}

"""An enumeration."""
enum CoreUserLanguageChoices {
  """Deutsch"""
  DE

  """Français"""
  FR

  """Italiano"""
  IT
}

type AssignmentType implements CoursePageInterface {
  assignment_type: AssignmentAssignmentAssignmentTypeChoices!

  """Erläuterung der Ausgangslage"""
  intro_text: String!

  """Zeitaufwand als Text"""
  effort_required: String!

  """Beschreibung der Bewertung"""
  evaluation_description: String!

  """URL zum Beurteilungsinstrument"""
  evaluation_document_url: String!
  id: ID
  title: String
  slug: String
  content_type: String
  live: Boolean
  translation_key: String
  frontend_url: String
  tasks: JSONStreamField
  evaluation_tasks: JSONStreamField
  performance_objectives: JSONStreamField
}

"""An enumeration."""
enum AssignmentAssignmentAssignmentTypeChoices {
  """CASEWORK"""
  CASEWORK

  """PREP_ASSIGNMENT"""
  PREP_ASSIGNMENT

  """REFLECTION"""
  REFLECTION
}

scalar JSONStreamField

type AssignmentCompletionType {
  id: ID!
  created_at: DateTime!
  updated_at: DateTime!
  submitted_at: DateTime
  evaluation_submitted_at: DateTime
  evaluation_user: UserType
  evaluation_grade: Float
  evaluation_points: Float
  assignment_user: UserType!
  assignment: AssignmentType!
  completion_status: AssignmentAssignmentCompletionCompletionStatusChoices!
  completion_data: GenericScalar
  additional_json_data: JSONString!
}

"""An enumeration."""
enum AssignmentAssignmentCompletionCompletionStatusChoices {
  """IN_PROGRESS"""
  IN_PROGRESS

  """SUBMITTED"""
  SUBMITTED

  """EVALUATION_IN_PROGRESS"""
  EVALUATION_IN_PROGRESS

  """EVALUATION_SUBMITTED"""
  EVALUATION_SUBMITTED
}

"""
The `GenericScalar` scalar type represents a generic
GraphQL scalar value that could be:
String, Boolean, Int, Float, List or Object.
"""
scalar GenericScalar

"""
Allows use of a JSON String for input / output from the GraphQL schema.

Use of this type is *not recommended* as you lose the benefits of having a defined, static
schema (one of the key benefits of GraphQL).
"""
scalar JSONString

type Mutation {
  send_feedback(input: SendFeedbackInput!): SendFeedbackPayload
  upsert_assignment_completion(assignment_id: ID!, assignment_user_id: ID, completion_data_string: String, completion_status: String, course_session_id: ID!, evaluation_grade: Float, evaluation_points: Float): AssignmentCompletionMutation
}

type SendFeedbackPayload {
  feedback_response: FeedbackResponse

  """May contain more than one error for same field."""
  errors: [ErrorType]
  clientMutationId: String
}

type FeedbackResponse implements Node {
  """The ID of the object"""
  id: ID!
  data: GenericScalar
  created_at: DateTime!
}

"""An object with an ID"""
interface Node {
  """The ID of the object"""
  id: ID!
}

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

input SendFeedbackInput {
  page: String!
  course_session: Int!
  data: GenericScalar
  clientMutationId: String
}

type AssignmentCompletionMutation {
  assignment_completion: AssignmentCompletionType
}