input EqualityConstraint {
  field: String!
  value: String!
}

type Mutation {
  createUser(user: CreateUserInput!): User!
  createGroup(name: String!): Group!
  updateUser(user: UpdateUserInput!): Success!
  updateGroup(group: UpdateGroupInput!): Success!
  addUserToGroup(userId: String!, groupId: Int!): Success!
  removeUserFromGroup(userId: String!, groupId: Int!): Success!
  deleteUser(userId: String!): Success!
  deleteGroup(groupId: Int!): Success!
}

type Group {
  id: Int!
  displayName: String!
  creationDate: DateTimeUtc!
  uuid: String!
  "The groups to which this user belongs."
  users: [User!]!
}

"""
  A filter for requests, specifying a boolean expression based on field constraints. Only one of
  the fields can be set at a time.
"""
input RequestFilter {
  any: [RequestFilter!]
  all: [RequestFilter!]
  not: RequestFilter
  eq: EqualityConstraint
  memberOf: String
  memberOfId: Int
}

"DateTime"
scalar DateTimeUtc

"The fields that can be updated for a group."
input UpdateGroupInput {
  id: Int!
  displayName: String
}

type Query {
  apiVersion: String!
  user(userId: String!): User!
  users(filters: RequestFilter): [User!]!
  groups: [Group!]!
  group(groupId: Int!): Group!
}

"The details required to create a user."
input CreateUserInput {
  id: String!
  email: String!
  displayName: String
  firstName: String
  lastName: String
  avatar: String
}

type User {
  id: String!
  email: String!
  displayName: String!
  firstName: String!
  lastName: String!
  avatar: String
  creationDate: DateTimeUtc!
  uuid: String!
  "The groups to which this user belongs."
  groups: [Group!]!
}

type Success {
  ok: Boolean!
}

"The fields that can be updated for a user."
input UpdateUserInput {
  id: String!
  email: String
  displayName: String
  firstName: String
  lastName: String
  avatar: String
}

schema {
  query: Query
  mutation: Mutation
}