# ===============================================
# SYSTEM
# ===============================================

extend type Query {
  systemExtensions: [SystemExtension]
  systemFlags: [SystemFlag]
  systemInfo: SystemInfo
  systemSecurity: SystemSecurity
}

extend type Mutation {
  disconnectWS: DefaultResponse

  installExtension(
    key: String!
  ): DefaultResponse

  updateSystemFlags(
    flags: [SystemFlagInput]!
  ): DefaultResponse

  updateSystemSecurity(
    authJwtAudience: String
    authJwtExpiration: String
    authJwtRenewablePeriod: String
    corsConfig: String
    corsMode: SystemSecurityCorsMode
    cspDirectives: String
    disallowFloc: Boolean
    disallowIframe: Boolean
    disallowOpenRedirect: Boolean
    enforceCsp: Boolean
    enforceHsts: Boolean
    enforceSameOriginReferrerPolicy: Boolean
    forceAssetDownload: Boolean
    hstsDuration: Int
    trustProxy: Boolean
    uploadMaxFiles: Int
    uploadMaxFileSize: Int
    uploadScanSVG: Boolean
  ): DefaultResponse
}

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

type SystemFlag {
  key: String
  value: Boolean
}

input SystemFlagInput {
  key: String!
  value: Boolean!
}

type SystemInfo {
  configFile: String
  cpuCores: Int
  currentVersion: String
  dbHost: String
  dbType: String
  dbVersion: String
  groupsTotal: Int
  hostname: String
  httpPort: Int
  httpRedirection: Boolean
  httpsPort: Int
  latestVersion: String
  latestVersionReleaseDate: Date
  mailConfigured: Boolean
  nodeVersion: String
  operatingSystem: String
  pagesTotal: Int
  platform: String
  ramTotal: String
  sslDomain: String
  sslExpirationDate: Date
  sslProvider: String
  sslStatus: String
  sslSubscriberEmail: String
  tagsTotal: Int
  telemetry: Boolean
  telemetryClientId: String
  upgradeCapable: Boolean
  usersTotal: Int
  workingDirectory: String
}

enum SystemImportUsersGroupMode {
  MULTI
  SINGLE
  NONE
}

type SystemImportUsersResponse {
  operation: Operation
  usersCount: Int
  groupsCount: Int
  failed: [SystemImportUsersResponseFailed]
}

type SystemImportUsersResponseFailed {
  provider: String
  email: String
  error: String
}

type SystemExtension {
  key: String
  title: String
  description: String
  isInstalled: Boolean
  isInstallable: Boolean
  isCompatible: Boolean
}

type SystemSecurity {
  authJwtAudience: String
  authJwtExpiration: String
  authJwtRenewablePeriod: String
  corsConfig: String
  corsMode: SystemSecurityCorsMode
  cspDirectives: String
  disallowFloc: Boolean
  disallowIframe: Boolean
  disallowOpenRedirect: Boolean
  enforceCsp: Boolean
  enforceHsts: Boolean
  enforceSameOriginReferrerPolicy: Boolean
  forceAssetDownload: Boolean
  hstsDuration: Int
  trustProxy: Boolean
  uploadMaxFiles: Int
  uploadMaxFileSize: Int
  uploadScanSVG: Boolean
}

enum SystemSecurityCorsMode {
  OFF
  REFLECT
  HOSTNAMES
  REGEX
}
