enum ShareStatus {
  INVITED
  JOINED
}

enum RoleLevel {
  ADMIN
  MEMBER
}

enum ActionLevel {
  ORG
  TEAM
  PROJECT
}

enum ObjectType {
  ORG
  TEAM
  PROJECT
  TASK
  TASK_GROUP
  TASK_CHECKLIST
  TASK_CHECKLIST_ITEM
}

directive @hasRole(roles: [RoleLevel!]!, level: ActionLevel!, type: ObjectType!) on FIELD_DEFINITION

type Query {
  organizations: [Organization!]!
  users: [UserAccount!]!
  invitedUsers: [InvitedUserAccount!]!
  findUser(input: FindUser!): UserAccount!
  findProject(input: FindProject!):
    Project! @hasRole(roles: [ADMIN, MEMBER], level: PROJECT, type: PROJECT)
  findTask(input: FindTask!): Task!
  projects(input: ProjectsFilter): [Project!]!
  findTeam(input: FindTeam!): Team!
  teams: [Team!]!
  myTasks(input: MyTasks!): MyTasksPayload!
  labelColors: [LabelColor!]!
  taskGroups: [TaskGroup!]!
  me: MePayload!
}


type Mutation

enum MyTasksStatus {
  ALL
  INCOMPLETE
  COMPLETE_ALL
  COMPLETE_TODAY
  COMPLETE_YESTERDAY
  COMPLETE_ONE_WEEK
  COMPLETE_TWO_WEEK
  COMPLETE_THREE_WEEK
}

enum MyTasksSort {
  NONE
  PROJECT
  DUE_DATE
}

input MyTasks {
  status: MyTasksStatus!
  sort: MyTasksSort!
}

type ProjectTaskMapping {
  projectID: UUID!
  taskID: UUID!
}

type MyTasksPayload {
  tasks: [Task!]!
  projects: [ProjectTaskMapping!]!
}

type TeamRole {
  teamID: UUID!
  roleCode: RoleCode!
}

type ProjectRole {
  projectID: UUID!
  roleCode: RoleCode!
}

type MePayload {
  user: UserAccount!
  organization: RoleCode
  teamRoles: [TeamRole!]!
  projectRoles: [ProjectRole!]!
}

input ProjectsFilter {
  teamID: UUID
}

input FindUser {
  userID: UUID!
}

input FindProject {
  projectID: UUID!
}

input FindTask {
  taskID: UUID!
}

input FindTeam {
  teamID: UUID!
}
