extend type Mutation {
  createTask(input: NewTask!):
    Task! @hasRole(roles: [ADMIN, MEMBER], level: PROJECT, type: TASK_GROUP)
  deleteTask(input: DeleteTaskInput!):
    DeleteTaskPayload! @hasRole(roles: [ADMIN, MEMBER], level: PROJECT, type: TASK)

  updateTaskDescription(input: UpdateTaskDescriptionInput!):
    Task! @hasRole(roles: [ADMIN, MEMBER], level: PROJECT, type: TASK)
  updateTaskLocation(input: NewTaskLocation!):
    UpdateTaskLocationPayload! @hasRole(roles: [ADMIN, MEMBER], level: PROJECT, type: TASK)
  updateTaskName(input: UpdateTaskName!):
    Task! @hasRole(roles: [ADMIN, MEMBER], level: PROJECT, type: TASK)
  setTaskComplete(input: SetTaskComplete!):
    Task! @hasRole(roles: [ADMIN, MEMBER], level: PROJECT, type: TASK)
  updateTaskDueDate(input: UpdateTaskDueDate!):
    Task! @hasRole(roles: [ADMIN, MEMBER], level: PROJECT, type: TASK)
  toggleTaskWatch(input: ToggleTaskWatch!):
    Task! @hasRole(roles: [ADMIN, MEMBER], level: PROJECT, type: TASK)

  assignTask(input: AssignTaskInput):
    Task! @hasRole(roles: [ADMIN, MEMBER], level: PROJECT, type: TASK)
  unassignTask(input: UnassignTaskInput):
    Task! @hasRole(roles: [ADMIN, MEMBER], level: PROJECT, type: TASK)
}

input ToggleTaskWatch {
  taskID: UUID!
}

input NewTask {
  taskGroupID: UUID!
  name: String!
  position: Float!
  assigned: [UUID!]
}

input AssignTaskInput {
  taskID: UUID!
  userID: UUID!
}

input UnassignTaskInput {
  taskID: UUID!
  userID: UUID!
}

input UpdateTaskDescriptionInput {
  taskID: UUID!
  description: String!
}

type UpdateTaskLocationPayload {
  previousTaskGroupID: UUID!
  task: Task!
}

input UpdateTaskDueDate  {
  taskID: UUID!
  hasTime: Boolean!
  dueDate: Time
}

input SetTaskComplete {
  taskID: UUID!
  complete: Boolean!
}

input NewTaskLocation {
  taskID: UUID!
  taskGroupID: UUID!
  position: Float!
}

input DeleteTaskInput {
  taskID: UUID!
}

type DeleteTaskPayload {
  taskID: UUID!
}

input UpdateTaskName {
  taskID: UUID!
  name: String!
}
