# ===============================================
# USERS
# ===============================================

extend type Query {
  users: UserQuery
}

extend type Mutation {
  users: UserMutation
}

# -----------------------------------------------
# QUERIES
# -----------------------------------------------

type UserQuery {
  list(
    filter: String
    orderBy: String
  ): [UserMinimal] @auth(requires: ["write:users", "manage:users", "manage:system"])

  search(
    query: String!
  ): [UserMinimal] @auth(requires: ["write:groups", "manage:groups", "write:users", "manage:users", "manage:system"])

  single(
    id: Int!
  ): User @auth(requires: ["manage:users", "manage:system"])
}

# -----------------------------------------------
# MUTATIONS
# -----------------------------------------------

type UserMutation {
  create(
    email: String!
    name: String
    passwordRaw: String
    providerKey: String!
    providerId: String
  ): UserResponse @auth(requires: ["write:users", "manage:users", "manage:system"])

  update(
    id: Int!
    email: String
    name: String
    providerKey: String
    providerId: String
  ): UserResponse @auth(requires: ["manage:users", "manage:system"])

  delete(
    id: Int!
  ): DefaultResponse @auth(requires: ["manage:users", "manage:system"])

  resetPassword(
    id: Int!
  ): DefaultResponse

  setPassword(
    id: Int!
    passwordRaw: String!
  ): DefaultResponse
}

# -----------------------------------------------
# TYPES
# -----------------------------------------------

type UserResponse {
  responseResult: ResponseStatus!
  user: User
}

type UserMinimal {
  id: Int!
  name: String!
  email: String!
  providerKey: String!
  isSystem: Boolean!
  createdAt: Date!
}

type User {
  id: Int!
  name: String!
  email: String!
  providerKey: String!
  providerId: String
  isSystem: Boolean!
  location: String!
  jobTitle: String!
  timezone: String!
  createdAt: Date!
  updatedAt: Date!
  groups: [Group]!
}