# ===============================================
# GROUPS
# ===============================================

extend type Query {
  groups: GroupQuery
}

extend type Mutation {
  groups: GroupMutation
}

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

type GroupQuery {
  list(
    filter: String
    orderBy: String
  ): [GroupMinimal] @auth(requires: ["write:groups", "manage:groups", "manage:system"])

  single(
    id: Int!
  ): Group @auth(requires: ["write:groups", "manage:groups", "manage:system"])
}

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

type GroupMutation {
  create(
    name: String!
  ): GroupResponse @auth(requires: ["write:groups", "manage:groups", "manage:system"])

  update(
    id: Int!
    name: String!
    redirectOnLogin: String!
    permissions: [String]!
    pageRules: [PageRuleInput]!
  ): DefaultResponse @auth(requires: ["write:groups", "manage:groups", "manage:system"])

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

  assignUser(
    groupId: Int!
    userId: Int!
  ): DefaultResponse @auth(requires: ["write:groups", "manage:groups", "manage:system"])

  unassignUser(
    groupId: Int!
    userId: Int!
  ): DefaultResponse @auth(requires: ["write:groups", "manage:groups", "manage:system"])
}

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

type GroupResponse {
  responseResult: ResponseStatus!
  group: Group
}

type GroupMinimal {
  id: Int!
  name: String!
  isSystem: Boolean!
  userCount: Int
  createdAt: Date!
  updatedAt: Date!
}

type Group {
  id: Int!
  name: String!
  isSystem: Boolean!
  redirectOnLogin: String
  permissions: [String]!
  pageRules: [PageRule]
  users: [UserMinimal]
  createdAt: Date!
  updatedAt: Date!
}

type PageRule {
  id: String!
  deny: Boolean!
  match: PageRuleMatch!
  roles: [String]!
  path: String!
  locales: [String]!
}

input PageRuleInput {
  id: String!
  deny: Boolean!
  match: PageRuleMatch!
  roles: [String]!
  path: String!
  locales: [String]!
}

enum PageRuleMatch {
  START
  EXACT
  END
  REGEX
  TAG
}
