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

extend type Query {
  groups(
    filter: String
    orderBy: String
  ): [Group]

  groupById(
    id: UUID!
  ): Group
}

extend type Mutation {
  createGroup(
    name: String!
  ): GroupResponse

  updateGroup(
    id: UUID!
    name: String!
    redirectOnLogin: String!
    permissions: [String]!
    rules: [GroupRuleInput]!
  ): DefaultResponse

  deleteGroup(
    id: UUID!
  ): DefaultResponse

  assignUserToGroup(
    groupId: UUID!
    userId: UUID!
  ): DefaultResponse

  unassignUserFromGroup(
    groupId: UUID!
    userId: UUID!
  ): DefaultResponse
}

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

type GroupResponse {
  operation: Operation
  group: Group
}

type Group {
  id: UUID
  name: String
  isSystem: Boolean
  redirectOnLogin: String
  redirectOnFirstLogin: String
  redirectOnLogout: String
  permissions: [String]
  rules: [GroupRule]
  users(
    page: Int
    pageSize: Int
    orderBy: UserOrderBy
    orderByDirection: OrderByDirection
    # Filter by name / email
    filter: String
    ): [UserMinimal]
  userCount: Int
  createdAt: Date
  updatedAt: Date
}

type GroupRule {
  id: UUID
  name: String
  mode: GroupRuleMode
  match: GroupRuleMatch
  roles: [String]
  path: String
  locales: [String]
  sites: [UUID]
}

input GroupRuleInput {
  id: UUID!
  name: String!
  mode: GroupRuleMode!
  match: GroupRuleMatch!
  roles: [String]!
  path: String!
  locales: [String]!
  sites: [UUID]
}

enum GroupRuleMode {
  ALLOW
  DENY
  FORCEALLOW
}

enum GroupRuleMatch {
  START
  EXACT
  END
  REGEX
  TAG
  TAGALL
}