type Query {
  placeholderQuery(name: String): Boolean
}
type Mutation {
  createAppConfig(input: CreateAppConfigInput): AppConfig
  createAppAuthClient(input: CreateAppAuthClientInput): AppAuthClient
  createConnection(input: CreateConnectionInput): Connection
  createFlow(input: CreateFlowInput): Flow
  createRole(input: CreateRoleInput): Role
  createStep(input: CreateStepInput): Step
  createUser(input: CreateUserInput): User
  deleteConnection(input: DeleteConnectionInput): Boolean
  deleteCurrentUser: Boolean
  deleteFlow(input: DeleteFlowInput): Boolean
  deleteRole(input: DeleteRoleInput): Boolean
  deleteStep(input: DeleteStepInput): Step
  deleteUser(input: DeleteUserInput): Boolean
  duplicateFlow(input: DuplicateFlowInput): Flow
  executeFlow(input: ExecuteFlowInput): executeFlowType
  forgotPassword(input: ForgotPasswordInput): Boolean
  generateAuthUrl(input: GenerateAuthUrlInput): AuthLink
  login(input: LoginInput): Auth
  registerUser(input: RegisterUserInput): User
  resetConnection(input: ResetConnectionInput): Connection
  resetPassword(input: ResetPasswordInput): Boolean
  updateAppAuthClient(input: UpdateAppAuthClientInput): AppAuthClient
  updateAppConfig(input: UpdateAppConfigInput): AppConfig
  updateConfig(input: JSONObject): JSONObject
  updateConnection(input: UpdateConnectionInput): Connection
  updateCurrentUser(input: UpdateCurrentUserInput): User
  updateFlow(input: UpdateFlowInput): Flow
  updateFlowStatus(input: UpdateFlowStatusInput): Flow
  updateRole(input: UpdateRoleInput): Role
  updateStep(input: UpdateStepInput): Step
  updateUser(input: UpdateUserInput): User
  upsertSamlAuthProvider(input: UpsertSamlAuthProviderInput): SamlAuthProvider
  upsertSamlAuthProvidersRoleMappings(
    input: UpsertSamlAuthProvidersRoleMappingsInput
  ): [SamlAuthProvidersRoleMapping]
  verifyConnection(input: VerifyConnectionInput): Connection
}

"""
Exposes a URL that specifies the behaviour of this scalar.
"""
directive @specifiedBy(
  """
  The URL that specifies the behaviour of this scalar.
  """
  url: String!
) on SCALAR

type Trigger {
  name: String
  key: String
  description: String
  showWebhookUrl: Boolean
  pollInterval: Int
  type: String
  substeps: [Substep]
}

type Action {
  name: String
  key: String
  description: String
  substeps: [Substep]
}

type Substep {
  key: String
  name: String
  arguments: [SubstepArgument]
}

type SubstepArgument {
  label: String
  key: String
  type: String
  description: String
  required: Boolean
  variables: Boolean
  options: [SubstepArgumentOption]
  source: SubstepArgumentSource
  additionalFields: SubstepArgumentAdditionalFields
  dependsOn: [String]
  fields: [SubstepArgument]
  value: JSONObject
}

type SubstepArgumentOption {
  label: String
  value: JSONObject
}

type SubstepArgumentSource {
  type: String
  name: String
  arguments: [SubstepArgumentSourceArgument]
}

type SubstepArgumentSourceArgument {
  name: String
  value: String
}

type SubstepArgumentAdditionalFields {
  type: String
  name: String
  arguments: [SubstepArgumentAdditionalFieldsArgument]
}

type SubstepArgumentAdditionalFieldsArgument {
  name: String
  value: String
}

type AppConfig {
  id: String
  key: String
  allowCustomConnection: Boolean
  canConnect: Boolean
  canCustomConnect: Boolean
  shared: Boolean
  disabled: Boolean
}

type App {
  name: String
  key: String
  connectionCount: Int
  flowCount: Int
  iconUrl: String
  docUrl: String
  authDocUrl: String
  primaryColor: String
  supportsConnections: Boolean
  auth: AppAuth
  triggers: [Trigger]
  actions: [Action]
  connections: [Connection]
}

type AppAuth {
  fields: [Field]
  authenticationSteps: [AuthenticationStep]
  sharedAuthenticationSteps: [AuthenticationStep]
  reconnectionSteps: [ReconnectionStep]
  sharedReconnectionSteps: [ReconnectionStep]
}

enum ArgumentEnumType {
  integer
  string
}

type Auth {
  user: User
  token: String
}

type AuthenticationStep {
  type: String
  name: String
  arguments: [AuthenticationStepArgument]
}

type AuthenticationStepArgument {
  name: String
  value: String
  type: ArgumentEnumType
  properties: [AuthenticationStepProperty]
}

type AuthenticationStepProperty {
  name: String
  value: String
}

type AuthLink {
  url: String
}

type Connection {
  id: String
  key: String
  reconnectable: Boolean
  appAuthClientId: String
  formattedData: ConnectionData
  verified: Boolean
  app: App
  createdAt: String
  flowCount: Int
}

type ConnectionData {
  screenName: String
}

type executeFlowType {
  data: JSONObject
  step: Step
}

type ExecutionStep {
  id: String
  executionId: String
  stepId: String
  step: Step
  status: String
  dataIn: JSONObject
  dataOut: JSONObject
  errorDetails: JSONObject
  createdAt: String
  updatedAt: String
}

type Field {
  key: String
  label: String
  type: String
  required: Boolean
  readOnly: Boolean
  value: String
  placeholder: String
  description: String
  docUrl: String
  clickToCopy: Boolean
  options: [SubstepArgumentOption]
}

enum FlowStatus {
  paused
  published
  draft
}

type Flow {
  id: String
  name: String
  active: Boolean
  steps: [Step]
  createdAt: String
  updatedAt: String
  status: FlowStatus
}

type SamlAuthProvider {
  id: String
  name: String
  certificate: String
  signatureAlgorithm: String
  issuer: String
  entryPoint: String
  firstnameAttributeName: String
  surnameAttributeName: String
  emailAttributeName: String
  roleAttributeName: String
  active: Boolean
  defaultRoleId: String
}

type SamlAuthProvidersRoleMapping {
  id: String
  samlAuthProviderId: String
  roleId: String
  remoteRoleName: String
}

input CreateConnectionInput {
  key: String!
  appAuthClientId: String
  formattedData: JSONObject
}

input GenerateAuthUrlInput {
  id: String!
}

input UpdateConnectionInput {
  id: String!
  formattedData: JSONObject
  appAuthClientId: String
}

input ResetConnectionInput {
  id: String!
}

input VerifyConnectionInput {
  id: String!
}

input UpsertSamlAuthProviderInput {
  name: String!
  certificate: String!
  signatureAlgorithm: String!
  issuer: String!
  entryPoint: String!
  firstnameAttributeName: String!
  surnameAttributeName: String!
  emailAttributeName: String!
  roleAttributeName: String!
  defaultRoleId: String!
  active: Boolean!
}

input UpsertSamlAuthProvidersRoleMappingsInput {
  samlAuthProviderId: String!
  samlAuthProvidersRoleMappings: [SamlAuthProviderRoleMappingInput]
}

input SamlAuthProviderRoleMappingInput {
  roleId: String!
  remoteRoleName: String!
}

input DeleteConnectionInput {
  id: String!
}

input CreateFlowInput {
  triggerAppKey: String
  connectionId: String
}

input UpdateFlowInput {
  id: String!
  name: String!
}

input UpdateFlowStatusInput {
  id: String!
  active: Boolean!
}

input ExecuteFlowInput {
  stepId: String!
}

input DeleteFlowInput {
  id: String!
}

input DuplicateFlowInput {
  id: String!
}

input CreateStepInput {
  id: String
  previousStepId: String
  key: String
  appKey: String
  connection: StepConnectionInput
  flow: StepFlowInput
  parameters: JSONObject
  previousStep: PreviousStepInput
}

input UpdateStepInput {
  id: String
  previousStepId: String
  key: String
  appKey: String
  connection: StepConnectionInput
  flow: StepFlowInput
  parameters: JSONObject
  previousStep: PreviousStepInput
}

input DeleteStepInput {
  id: String!
}

input CreateUserInput {
  fullName: String!
  email: String!
  password: String!
  role: UserRoleInput!
}

input UserRoleInput {
  id: String
}

input UpdateUserInput {
  id: String!
  fullName: String
  email: String
  role: UserRoleInput
}

input DeleteUserInput {
  id: String!
}

input RegisterUserInput {
  fullName: String!
  email: String!
  password: String!
}

input UpdateCurrentUserInput {
  email: String
  password: String
  fullName: String
}

input ForgotPasswordInput {
  email: String!
}

input ResetPasswordInput {
  token: String!
  password: String!
}

input LoginInput {
  email: String!
  password: String!
}

input PermissionInput {
  action: String!
  subject: String!
  conditions: [String]
}

input CreateRoleInput {
  name: String!
  description: String
  permissions: [PermissionInput]
}

input UpdateRoleInput {
  id: String!
  name: String!
  description: String
  permissions: [PermissionInput]
}

input DeleteRoleInput {
  id: String!
}

"""
The `JSONObject` scalar type represents JSON objects as specified by [ECMA-404](http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf).
"""
scalar JSONObject

input PreviousStepInput {
  id: String
}

type ReconnectionStep {
  type: String
  name: String
  arguments: [ReconnectionStepArgument]
}

type ReconnectionStepArgument {
  name: String
  value: String
  type: ArgumentEnumType
  properties: [ReconnectionStepProperty]
}

type ReconnectionStepProperty {
  name: String
  value: String
}

type Step {
  id: String
  previousStepId: String
  key: String
  appKey: String
  iconUrl: String
  webhookUrl: String
  type: StepEnumType
  parameters: JSONObject
  connection: Connection
  flow: Flow
  position: Int
  status: String
  executionSteps: [ExecutionStep]
}

input StepConnectionInput {
  id: String
}

enum StepEnumType {
  trigger
  action
}

input StepFlowInput {
  id: String
}

input StepInput {
  id: String
  previousStepId: String
  key: String
  appKey: String
  connection: StepConnectionInput
  flow: StepFlowInput
  parameters: JSONObject
  previousStep: PreviousStepInput
}

type User {
  id: String
  fullName: String
  email: String
  role: Role
  permissions: [Permission]
  createdAt: String
  updatedAt: String
}

type Role {
  id: String
  name: String
  key: String
  description: String
  isAdmin: Boolean
  permissions: [Permission]
}

type PageInfo {
  currentPage: Int!
  totalPages: Int!
}

type ExecutionStepEdge {
  node: ExecutionStep
}

type ExecutionStepConnection {
  edges: [ExecutionStepEdge]
  pageInfo: PageInfo
}

type License {
  id: String
  name: String
  expireAt: String
  verified: Boolean
}

type Permission {
  id: String
  action: String
  subject: String
  conditions: [String]
}

type Action {
  label: String
  key: String
  subjects: [String]
}

type Condition {
  key: String
  label: String
}

type Subject {
  label: String
  key: String
}

input CreateAppConfigInput {
  key: String
  allowCustomConnection: Boolean
  shared: Boolean
  disabled: Boolean
}

input UpdateAppConfigInput {
  id: String
  allowCustomConnection: Boolean
  shared: Boolean
  disabled: Boolean
}

type AppAuthClient {
  id: String
  appConfigId: String
  name: String
  active: Boolean
}

input CreateAppAuthClientInput {
  appConfigId: String
  name: String
  formattedAuthDefaults: JSONObject
  active: Boolean
}

input UpdateAppAuthClientInput {
  id: String
  name: String
  formattedAuthDefaults: JSONObject
  active: Boolean
}

schema {
  query: Query
  mutation: Mutation
}
