schema {
  query: RootQuery
  mutation: RootMutation
}

directive @doc(category: String!) on FIELD_DEFINITION

enum ACL {
  """
  private
  """
  private

  """
  public (read only)
  """
  public
}

input ActiveRecordReference {
  id: ID
  ids: [ID]
  type: String!
}

input ActivitiesSortInput {
  created_at: StandardSort
  id: StandardSort
  updated_at: StandardSort
}

type ActivityStreamsActivity {
  id: ID!
  payload: ActivityStreamsPayload
  uuid: String!
}

type ActivityStreamsActivityCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [ActivityStreamsActivity!]
  total_entries: Int!
  total_pages: Int!
}

type ActivityStreamsActivityStreamCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [ActivityStreamsActivity!]
  total_entries: Int!
  total_pages: Int!
  unread_count: Int!
}

type ActivityStreamsFeed {
  ids: [ID!]
  name: String
}

type ActivityStreamsHandler {
  filter: ActivityStreamsPayload
  id: ID!
  name: String
  targets: ActivityStreamsPayload
}

type ActivityStreamsHandlerCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [ActivityStreamsHandler!]
  total_entries: Int!
  total_pages: Int!
}

"""
Represents ActivityPayload objects
"""
scalar ActivityStreamsPayload

input AddressImport {
  address: String
  address2: String
  apartment: String
  city: String
  country: String
  iso_country_code: String
  lat: Float
  lng: Float

  """
  name of the defined property
  """
  name: String!
  postcode: String
  service_radius: String
  state: String
  street: String
  street_number: String
  suburb: String
}

interface AdminNonDeployableSharedAttributesInterface {
  created_at: JSONDate!
  id: ID!
  updated_at: JSONDate!
}

interface AdminPropertiesInterface {
  """
  Deprecated, use properties instead.
  """
  fields: [Property!]! @deprecated(reason: "Use properties")

  """
  List of properties attributes to be included in the results
  """
  properties: [Property!]!
}

interface AdminSharedAttributesInterface {
  created_at: JSONDate!
  id: ID!
  metadata: HashObject

  """
  defines the physical path of the file
  """
  physical_file_path: String
  updated_at: JSONDate!
}

input AggregationField {
  aggregations: [AggregationField]
  customization_name: String
  customization_property_name: String
  field_name: String
  name: String!
  profile_property_name: String
  profile_type: String
  size: Int = 200

  """
  sort buckets; default is by doc-count descending
  """
  sort: AggregationSort
  type: AggregationTypeEnum = terms
}

input AggregationSort {
  name: AggregationSortFieldEnum = _term
  order: AggregationSortOrderEnum = asc
}

enum AggregationSortFieldEnum {
  """
  document count sort
  """
  _count

  """
  alpha sort
  """
  _term
}

enum AggregationSortOrderEnum {
  """
  ascending
  """
  asc

  """
  descending
  """
  desc
}

enum AggregationTypeEnum {
  """
  A single-value metrics aggregation that keeps track and returns the average
  value among the values extracted from the aggregated documents.
  """
  avg

  """
  A single-value metrics aggregation that keeps track and returns the maximum
  value among the values extracted from the aggregated documents.
  """
  max

  """
  A single-value metrics aggregation that keeps track and returns the minimum
  value among the values extracted from the aggregated documents.
  """
  min

  """
  A multi-bucket value source based aggregation where buckets are dynamically built - one per unique value.
  """
  terms
}

type Aggregations {
  compact: JSONPayload
  raw: JSONPayload
}

"""
Could be any of String Number Object Date and so on. Anytype
"""
scalar Any

"""
ApiCall Notification
"""
type ApiCallNotification implements AdminSharedAttributesInterface {
  """
  liquid code which can be used to process the response from the endpoint. You have access to "response" variable.
  """
  callback: String

  """
  liquid code to evaluate to whatever you want to send, for example a JSON.
  """
  content: String
  created_at: JSONDate!

  """
  liquid code which should evaluate to integer. Delays invoking the job by
  specified number of minutes. Useful to invoke code at certain point in time,
  for example 1 hour before something etc. To calculate proper number you can
  use time_diff filter.
  """
  delay_by: String

  """
  form configurations which trigger the email
  """
  form_configurations: [FormConfiguration!] @deprecated(reason: "use forms")

  """
  forms which trigger the email
  """
  forms: [Form!]

  """
  liquid code to evaluate to valid json of request headers
  """
  headers: String
  id: ID!
  metadata: HashObject

  """
  name of the api call, which is used in form_configurations or mutation to trigger it
  """
  name: String!

  """
  defines the physical path of the file
  """
  physical_file_path: String

  """
  Liquid code which should evaluate to valid request type: Get, Post, Put,
  Patch, Delete, Head or if you want to send binary files: Post_Multipart,
  Put_Multipart, Patch_Multipart
  """
  request_type: String!

  """
  liquid code to evaluate to valid endpoint for the request.
  """
  to: String!

  """
  liquid code which should evaluate to true if the api call should be sent
  """
  trigger_condition: String
  updated_at: JSONDate!
}

type ApiCallNotificationCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [ApiCallNotification!]
  total_entries: Int!
  total_pages: Int!
}

input ApiCallNotificationInputType {
  """
  liquid code which can be used to process the response from the endpoint. You have access to "response" variable.
  """
  callback: String

  """
  liquid code to evaluate to whatever you want to send as a request body, for example a JSON.
  """
  content: String

  """
  liquid code which should evaluate to integer. Delays invoking the job by
  specified number of minutes. Useful to invoke code at certain point in time,
  for example 1 hour before something etc. To calculate proper number you can
  use time_diff filter.
  """
  delay_by: String = "0"

  """
  ids of forms which should trigger the api call
  """
  form_configuration_ids: [ID]

  """
  Deprecated, use request_headers
  """
  headers: HashObject
  metadata: HashObject

  """
  deprecated - derived from physical_file_path; name of the api call, which is used in forms or mutation to trigger it
  """
  name: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/api_calls/my_api_call_notification
  """
  physical_file_path: String!
  request_headers: HashObject

  """
  Liquid code which should evaluate to valid request type: Get, Post, Put,
  Patch, Delete, Head or if you want to send binary files: Post_Multipart,
  Put_Multipart, Patch_Multipart
  """
  request_type: String!

  """
  liquid code to evaluate to valid endpoint for the request.
  """
  to: String!

  """
  liquid code which should evaluate to true if the api call should be sent
  """
  trigger_condition: String = "true"
}

input ApiCallNotificationsFilterInput {
  callback: StringFilter
  content: StringFilter
  created_at: DateFilter

  """
  Deprecated - use delay_by
  """
  delay: StringFilter
  delay_by: StringFilter
  headers: StringFilter
  id: UniqIdFilter

  """
  Filter by metadata properties
  """
  metadata: [JsonbFilter!]
  name: StringFilter
  or: [ApiCallNotificationsFilterInput!]
  physical_file_path: StringFilter
  to: StringFilter
  trigger_condition: StringFilter
  updated_at: DateFilter
}

input ApiCallNotificationsSortInput {
  created_at: StandardSort
  id: StandardSort
  metadata: [JsonbSort!]
  name: StandardSort
  physical_file_path: StandardSort
  updated_at: StandardSort
}

input ApiCallSendOptions {
  """
  Read timeout of HTTP request is seconds. For calls triggered from backgroud
  jobs default is 8s and max 180s. For calls triggered from web request default
  is 5s and max 5s.
  """
  timeout: Int
}

"""
Autogenerated return type of ApiCallSend.
"""
type ApiCallSendPayload {
  errors: [BaseError!]! @deprecated(reason: "Not needed")
  response: Response
}

type Asset implements AdminSharedAttributesInterface {
  """
  file content type
  """
  content_type: String
  created_at: JSONDate!
  deleted_at: JSONDate

  """
  file size
  """
  file_size: Int
  id: ID!
  metadata: HashObject

  """
  Name of the asset
  """
  name: String!

  """
  defines the physical path of the file
  """
  physical_file_path: String
  updated_at: JSONDate!

  """
  Url to the file
  """
  url: String!
}

type AssetCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [Asset!]
  total_entries: Int!
  total_pages: Int!
}

input AssetInput {
  file_size: Int

  """
  metadata hash for the attribute
  """
  metadata: HashObject
  name: String!

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/assets/logo.png
  """
  physical_file_path: String!
  url: String!
}

input AssetPresignInput {
  path: String!
}

input AssetUpdateInput {
  """
  metadata hash for the attribute
  """
  metadata: HashObject

  """
  defines the file location, from which we will extract the name and move the file from old location to the new one
  """
  physical_file_path: String!
}

"""
Autogenerated return type of AssetsCreateMutation.
"""
type AssetsCreateMutationPayload {
  assets: [Asset!]!
}

type AssetsListing {
  created_at: JSONDate!

  """
  ID of the assets listing object
  """
  id: ID
  private_assets_url: String
  public_assets_url: String
  status: String
}

type AssetsListingIdentifier {
  created_at: JSONDate!

  """
  ID of the assets listing create job which can be queried
  """
  id: ID!
}

"""
Autogenerated return type of AssetsPresignUrlsMutation.
"""
type AssetsPresignUrlsMutationPayload {
  urls: [PresignedUrl!]!
}

input AssetsSortInput {
  content_type: StandardSort
  created_at: StandardSort
  file_size: StandardSort
  id: StandardSort
  metadata: [JsonbSort!]
  name: StandardSort
  physical_file_path: StandardSort
  updated_at: StandardSort
}

enum AsyncCallbackPriority {
  """
  default - max timeout: 5 minutes
  """
  default

  """
  high - max timeout: 1 minute
  """
  high

  """
  low - max timeout: 4 hours
  """
  low
}

input AtachmentInputType {
  """
  File URL returned by directly uploading it to platformOS s3 bucket using pre-signed URL
  """
  file: String

  """
  Name of the property
  """
  name: String!

  """
  External url to the file
  """
  remote_file_url: String
}

enum AttachmentContentDispositionEnum {
  """
  download
  """
  download

  """
  inline
  """
  inline
}

input AttachmentContentLengthRange {
  gte: Int!
  lte: Int!
}

input AttachmentModelPropertyInput {
  model_schema_name: String!
  property_name: String!
}

input AttachmentPresignUrlInput {
  content_disposition: AttachmentContentDispositionEnum = inline

  """
  file size limitation in KiB. ex. [gte: 1, lte: 1024] allows file size from 1KiB to 1 MiB 
  """
  content_length: AttachmentContentLengthRange

  """
  Choose property which should be used to generate versions, versions defined in yml schema file
  """
  model_property: AttachmentModelPropertyInput

  """
  Choose property which should be used to generate versions, versions defined in yml schema file
  """
  user_property: AttachmentUserPropertyInput
}

type AttachmentPresignedUploadUrl {
  """
  Direct s3 upload endpoint to which you can upload files. Make sure you include upload_url_payload with the request
  """
  upload_url: String!

  """
  Payload you need to provide for upload_url
  """
  upload_url_payload: HashObject!
}

input AttachmentUserPropertyInput {
  property_name: String!
}

input AttachmentsImport {
  """
  direct path to file on S3
  """
  direct_path: String

  """
  ID will ignored.
  """
  id: ID

  """
  name of the defined property
  """
  name: String!

  """
  URL to presigned slot on S3
  """
  url: String
}

type Authenticate {
  """
  returns true if the provided JWT is valid for the given user and has not expired yet
  """
  jwt(algorithm: JwtAlgorithm = HS256, token: String!): Boolean!

  """
  validates otp_code
  """
  otp_code(
    """
    OTP code sent to user
    """
    code: String!

    """
    Allowed TOTP time drift between client and server
    """
    drift: Int
  ): Boolean!

  """
  plain text password which will be matched against stored encrypted_password. Returns true if password matches.
  """
  password(password: String!): Boolean!

  """
  returns true if the provided temporary_token is valid for the given user and has not expired yet
  """
  temporary_token(token: String!): Boolean!
}

"""
Authentication using provider
"""
type Authentication {
  """
  timestamp of when the record was created, automatically generated by the system
  """
  created_at: JSONDate

  """
  timestamp of when the record was soft delete, populated by delete action. It
  is also possible to manually set it via update. To undelete change it back to
  empty value, but please note that associated records would need to be manually
  undeleted as well.
  """
  deleted_at: JSONDate
  id: ID

  """
  name of authentication provider used for creating this authentication
  """
  provider: AuthenticationProvider
  raw_info: HashObject
  token: String
  token_expires_at: JSONDate
  uid: String

  """
  timestamp of when the record was updated, automatically generated by the system
  """
  updated_at: JSONDate
}

input AuthenticationInputType {
  provider: AuthenticationProvider!
  raw_info: HashObject
  token: String
  token_expires_at: JSONDate
  uid: String
}

"""
List of authentication providers
"""
enum AuthenticationProvider {
  """
  auth0
  """
  auth0

  """
  facebook
  """
  facebook

  """
  github
  """
  github

  """
  google
  """
  google

  """
  instagram
  """
  instagram

  """
  linkedin
  """
  linkedin

  """
  openid_connect
  """
  openid_connect

  """
  saml
  """
  saml

  """
  twitter
  """
  twitter
}

input AuthorizationPoliciesFilter {
  not_value: String
  not_value_in: [String!]
  value: String
  value_in: [String!]
}

input AuthorizationPoliciesFilterInput {
  content: StringFilter
  created_at: DateFilter
  flash_alert: StringFilter
  id: UniqIdFilter

  """
  Filter by metadata properties
  """
  metadata: [JsonbFilter!]
  name: StringFilter
  or: [AuthorizationPoliciesFilterInput!]
  physical_file_path: StringFilter
  redirect_to: StringFilter
  updated_at: DateFilter
}

input AuthorizationPoliciesSortInput {
  created_at: StandardSort
  id: StandardSort
  metadata: [JsonbSort!]
  name: StandardSort
  physical_file_path: StandardSort
  updated_at: StandardSort
}

"""
Authorization Policy is used to restrict access to pages and forms
"""
type AuthorizationPolicy implements AdminSharedAttributesInterface {
  authorization_policy_associations: [AuthorizationPolicyAssociation!]
  content: String!
  created_at: JSONDate!
  flash_alert: String

  """
  use this status code when authorization fails; usually 404 or 403
  """
  http_status: Int
  id: ID!
  metadata: HashObject
  name: String!

  """
  defines the physical path of the file
  """
  physical_file_path: String
  redirect_to: String
  updated_at: JSONDate!
}

type AuthorizationPolicyAssociation {
  """
  id of the admin resource
  """
  authorizable_id: ID!

  """
  type of the admin resource - Page or Form
  """
  authorizable_type: String!

  """
  id of the authorization policy
  """
  authorization_policy_id: ID!
  created_at: JSONDate!
  id: ID!
  updated_at: JSONDate!
}

type AuthorizationPolicyCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [AuthorizationPolicy!]
  total_entries: Int!
  total_pages: Int!
}

input AuthorizationPolicyInputType {
  content: String!
  flash_alert: String
  metadata: HashObject

  """
  deprecated - derived from physical_file_path
  """
  name: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/authorization_policies/my_policy
  """
  physical_file_path: String
  redirect_to: String
}

"""
Background Job
"""
type BackgroundJob {
  arguments: JSONPayload

  """
  how many times the job was tried to be processed. By default the job is not retried on error.
  """
  attempts: Int
  created_at: JSONDate!

  """
  when job has been considered as dead
  """
  dead_at: JSONDate

  """
  Deprecated
  """
  error: String

  """
  class of an error which made the job fail
  """
  error_class: String

  """
  error which made the job fail
  """
  error_message: String

  """
  when job failed
  """
  failed_at: JSONDate

  """
  Deprecated
  """
  form_configuration_name: String

  """
  Deprecated
  """
  form_name: String
  id: ID!

  """
  Deprecated
  """
  label: String
  liquid_body: JSONPayload

  """
  Deprecated
  """
  locked_at: JSONDate

  """
  which queue is used to process the job
  """
  queue: String!

  """
  Deprecated
  """
  resource_id: ID

  """
  Deprecated
  """
  resource_type: String

  """
  when job will retry to run
  """
  retry_at: JSONDate

  """
  when job is scheduled to run
  """
  run_at: JSONDate
  source_name: String

  """
  Deprecated
  """
  source_type: String

  """
  when job started to be processed
  """
  started_at: JSONDate

  """
  Deprecated
  """
  updated_at: JSONDate
}

type BackgroundJobCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [BackgroundJob!]
  total_entries: Int!
  total_pages: Int!
}

input BackgroundJobsFilterInput {
  created_at: DateFilter

  """
  Deprecated
  """
  failed_at: DateFilter

  """
  Deprecated
  """
  form_configuration_name: StringFilter
  id: UniqIdFilter

  """
  Deprecated
  """
  label: StringFilter

  """
  Deprecated
  """
  locked_at: DateFilter

  """
  Deprecated
  """
  queue: StringFilter

  """
  Deprecated
  """
  resource_id: UniqIdFilter

  """
  Deprecated
  """
  resource_type: StringFilter

  """
  Deprecated
  """
  run_at: DateFilter

  """
  Deprecated
  """
  source_name: StringFilter

  """
  Deprecated
  """
  source_type: StringFilter

  """
  it filters based on: run_at - for SCHEDULED type; retry_at - for RETRY type;
  dead_at - for DEAD type. It is ignored for RUNNING type.
  """
  timestamp: DateFilter

  """
  Type of jobs to retrieve
  """
  type: BackgroundJobsTypeEnum
  updated_at: DateFilter
}

input BackgroundJobsSortInput {
  attempts: StandardSort
  created_at: StandardSort
  failed_at: StandardSort
  form_configuration_name: StandardSort
  id: StandardSort
  label: StandardSort
  locked_at: StandardSort
  queue: StandardSort
  resource_id: StandardSort
  resource_type: StandardSort
  run_at: StandardSort
  source_name: StandardSort
  source_type: StandardSort
  updated_at: StandardSort
}

"""
Background Jobs Type
"""
enum BackgroundJobsTypeEnum {
  """
  Jobs that have failed `max_attempts` times and won't be retried any more
  """
  DEAD

  """
  Jobs that have failed and are scheduled for a retry
  """
  RETRY

  """
  Jobs that are being processed in this moment
  """
  RUNNING

  """
  Jobs that have been scheduled to be performed in the future
  """
  SCHEDULED
}

"""
Base error message
"""
type BaseError {
  """
  A description of the error
  """
  message: String!
}

interface BasicPropertyInterface {
  """
  ID of an object.
  """
  id: ID

  """
  List of all properties assigned to the object.
  """
  properties(select: [PropertiesFieldInput!]): HashObject

  """
  Fetch any property by name and return value as a String; ex: hair_color: property(name: "hair_color")
  """
  property(name: String!): String

  """
  Fetch any property by name and return value as an Array of Strings. ex: todo_list: property_array(name: "todo_list")
  """
  property_array(name: String!): [String!]

  """
  Fetch any property by name and return value as a Boolean; ex: price: property_boolean(name: "enabled")
  """
  property_boolean(name: String!): Boolean

  """
  Fetch any property by name and return value as a Float; ex: price: property_float(name: "price")
  """
  property_float(name: String!): Float

  """
  Fetch any property by name and return value as an Integer; ex: age: property_int(name: "age")
  """
  property_int(name: String!): Int

  """
  Fetch any property by name and return value as a JSON string.
  """
  property_json(name: String!): JSONPayload

  """
  Fetch any property by name, parse it as a JSON and return object
  """
  property_object(name: String!): HashObject
}

input BooleanFilter {
  """
  filter whether value was not set
  """
  is_null: Boolean
  not_value: Boolean
  value: Boolean
}

type CMSItemDefinition {
  fields: [String]!
  name: CMSItemType!
  path: JSONPayload!
}

type CMSItemDefinitionCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [CMSItemDefinition!]
  total_entries: Int!
  total_pages: Int!
}

type CMSItemPayload {
  data: JSONPayload
  resource_name: String!
  type: CMSItemType
}

type CMSItemPayloadCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [CMSItemPayload!]
  total_entries: Int!
  total_pages: Int!
}

enum CMSItemType {
  ActivityStreamsGroupingHandler
  ActivityStreamsHandler
  ApiCallNotification
  Asset
  AuthorizationPolicy
  CustomModelType
  EmailNotification
  FormConfiguration
  GraphQuery
  InstanceConfig
  InstanceProfileType
  LiquidView
  Migration
  Modules
  Page
  SmsNotification
  TransactableType
  Translation
  UserType
}

"""
Deprecated
"""
type Communication {
  phone_number: String!
  verified: Boolean!
}

input Content {
  """
  Content type should start with this value
  """
  starts_with: String

  """
  Content type should have this value
  """
  value: String
}

input ContentLength {
  """
  Greater than or equal size in KiB
  """
  gte: Int = null

  """
  Lower than or equal size in KiB
  """
  lte: Int!
}

input ContentLengthRange {
  gte: Int!
  lte: Int!
}

"""
Color can be represented by: hex - "#000000", name - "red", rgba - "rgba(0,0,0,0.5)", hsla - "hsla(0%, 0%, 0%, 50%)"
"""
scalar CssColor

type CustomAddrress {
  address: String
  address2: String
  apartment: String
  city: String
  country: String
  id: Int!
  iso_country_code: String
  lat: Float
  lng: Float
  name: String
  point: GeoPointType
  postcode: String
  service_radius: String
  state: String
  street: String
  street_number: String
  suburb: String
}

type CustomAttachment {
  created_at: JSONDate
  file_url: String
  id: ID!
}

input CustomAttachmentInputType {
  """
  attribute of type file with which the created attachment should be associated
  - must be defined in the schema of the record, for example CustomModelType for
  Customization, InstanceProfileType for UserProfile or user.yml for User
  """
  custom_attribute_name: String!

  """
  URL to image that was uploaded to s3 presigned url
  """
  direct_url: String

  """
  allows you to create attachment with your own content; useful for generating reports, pdf, csv etc
  """
  generate_file: ProcessStrategyInputType

  """
  id of associated record - Model, UserProfile, User
  """
  owner_id: ID!

  """
  class of associated record - Model, UserProfile, User
  """
  owner_type: String!

  """
  deprecated, ignore
  """
  page_slug: String

  """
  create attachment based on a file available on remote location
  """
  raw_remote_file_url: String

  """
  id of a user who uploads the attachment
  """
  uploader_id: ID
}

"""
Definition of Custom attribute
"""
type CustomAttributeDefinition {
  attribute_type: String
  id: ID
  name: String
}

input CustomAttributeInputType {
  """
  Adds provided value at the end of an array property. It's secure atomic operation executed in separate transaction
  """
  array_append: String

  """
  Removes provided value from an array property. It's secure atomic operation executed in separate transaction
  """
  array_remove: String

  """
  Decrements property value by provided value. It's secure atomic operation executed in separate transaction
  """
  decrement: Float

  """
  Increments property value by provided value. It's secure atomic operation executed in separate transaction
  """
  increment: Float
  name: String
  value: String
  value_array: [String]
  value_boolean: Boolean
  value_float: Float
  value_int: Int
  value_json: JSONPayload
}

type CustomImage {
  """
  timestamp of when the record was created, automatically generated by the system
  """
  created_at: JSONDate!

  """
  timestamp of when the record was soft delete, populated by delete action. It
  is also possible to manually set it via update. To undelete change it back to
  empty value, but please note that associated records would need to be manually
  undeleted as well.
  """
  deleted_at: JSONDate
  file_url: String @deprecated(reason: "use `url`")
  id: ID!
  name: String
  property_id: ID

  """
  timestamp of when the record was updated, automatically generated by the system
  """
  updated_at: JSONDate!
  uploader_id: ID

  """
  image url; ex: thumb: url(version: "thumb")
  """
  url(version: String): String
}

type CustomImageCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [CustomImage!]
  total_entries: Int!
  total_pages: Int!
}

input CustomImageInputType {
  custom_attribute_name: String

  """
  URL to image that was uploaded to s3 presigned url
  """
  direct_url: String

  """
  id of associated record - Customization, UserProfile, User
  """
  owner_id: ID

  """
  class of associated record - Customization, UserProfile, User
  """
  owner_type: String

  """
  deprecated
  """
  page_slug: String

  """
  id of the user who uploads the attachment
  """
  uploader_id: ID
}

union Customizable = Listing | Profile | User

enum CustomizableTypeEnum {
  """
  Customization
  """
  Customization

  """
  Transactable
  """
  Transactable

  """
  User
  """
  User

  """
  UserProfile
  """
  UserProfile
}

type Customization implements LegacyCustomAttributeInterface & ListingsMetadata & PropertiesInterface & RelationOnDemandInterface & RemoteModelInterface {
  """
  Fetch address by name; ex: address: address(name: "office_address")
  """
  address(name: String!): CustomAddrress @deprecated(reason: "use your own model for address if needed")

  """
  Fetch all addresses, optionally you can filter results by name; ex: home_address: addresses(name: "home")
  """
  addresses(name: String): [CustomAddrress!] @deprecated(reason: "use your own model for address if needed")

  """
  Fetch attachment by name; ex: sales_report: attachment(name: "sales_report")
  """
  attachment(name: String!): PrivateFile @deprecated(reason: "use property upload")

  """
  Fetch all attachments, optionally you can filter results by name; ex: sales_reports: attachments(name: "sales_report")
  """
  attachments(name: String): [PrivateFile!] @deprecated(reason: "use property upload")

  """
  timestamp of when the record was created, automatically generated by the system
  """
  created_at: JSONDate

  """
  Fetch address by name; ex: address: custom_address(name: "office_address")
  """
  custom_address(name: String!): CustomAddrress @deprecated(reason: "Use address")

  """
  Fetch all addresses, optionaly you can filter results by name; ex: home: custom_addresses(name: "home")
  """
  custom_addresses(name: String): [CustomAddrress!] @deprecated(reason: "Use addresses")

  """
  Fetch attachment by name; ex: sales_report: custom_attachment(name: "sales_report")
  """
  custom_attachment(name: String!): PrivateFile @deprecated(reason: "Use attachment")

  """
  Fetch all attachments, optionally you can filter results by name; ex:
  sales_reports: custom_attachments(name: "sales_report")
  """
  custom_attachments(name: String): [PrivateFile!] @deprecated(reason: "Use attachments")

  """
  Fetch image by name; ex: header: custom_image(name: "header")
  """
  custom_image(name: String!): Image @deprecated(reason: "Use image")

  """
  Fetch all images, optionaly you can filter results by name; ex: cat_images: custom_images(name: "cat")
  """
  custom_images(name: String): [Image!] @deprecated(reason: "Use images")
  customizable: Customizable

  """
  id of a parent, which can other customization, user profile or user
  """
  customizable_id: ID

  """
  class of a parent - Customization, User or UserProfile
  """
  customizable_type: String

  """
  timestamp of when the record was soft delete, populated by delete action. It
  is also possible to manually set it via update. To undelete change it back to
  empty value, but please note that associated records would need to be manually
  undeleted as well.
  """
  deleted_at: JSONDate

  """
  Used mainly for import/export, if you want to use third party service as a source of truth
  """
  external_id: ID
  human_name: String
  id: ID

  """
  Fetch image by name; ex: header: image(name: "header")
  """
  image(name: String!): Image @deprecated(reason: "use property upload")

  """
  Fetch all images, optionally you can filter results by name; ex: cat_images: images(name: "cat")
  """
  images(name: String): [Image!] @deprecated(reason: "use property upload")

  """
  Defines belongs-to relation with other model; ex: parent: model(model_name:
  "parent", join_on_property: "parent_id") { id }
  """
  model(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_name: String
  ): ListingsCustomization @deprecated(reason: "use `related_model`")

  """
  Defines has-many relation with other model; ex: children: models(model_name:
  "child", join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  models(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_name: [String]
  ): [ListingsCustomization!] @deprecated(reason: "use `related_models`")
  name: String

  """
  List of all properties assigned to the object.
  """
  properties(select: [PropertiesFieldInput!]): HashObject

  """
  Fetch any property by name and return value as a String; ex: hair_color: property(name: "hair_color")
  """
  property(name: String!): String

  """
  Fetch any property by name and return value as an Array of Strings. ex: todo_list: property_array(name: "todo_list")
  """
  property_array(name: String!): [String!]

  """
  Fetch any property by name and return value as a Boolean; ex: price: property_boolean(name: "enabled")
  """
  property_boolean(name: String!): Boolean

  """
  Fetch any property by name and return value as a Float; ex: price: property_float(name: "price")
  """
  property_float(name: String!): Float

  """
  Fetch any property by name and return value as an Integer; ex: age: property_int(name: "age")
  """
  property_int(name: String!): Int

  """
  Fetch any property by name and return value as a JSON string.
  """
  property_json(name: String!): JSONPayload

  """
  Fetch any property by name, parse it as a JSON and return object
  """
  property_object(name: String!): HashObject

  """
  Fetch any property by name and returns upload details
  """
  property_upload(
    """
    Defines the number of seconds for which the generated url will be accessible. Must be set if acl was set to private
    """
    expires_in: Int
    name: String!
  ): PropertyUpload

  """
  Defines belongs-to relation with other model; ex: parent: model(model_name:
  "parent", join_on_property: "parent_id") { id }
  """
  related_model(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_schema_name: String
  ): ListingsCustomization

  """
  Defines has-many relation with other model, returns maximum of 10000 records
  at once; ex: children: models(model_name: "child", join_on_property:
  "parent_id", foreign_property: "parent_id") { id }
  """
  related_models(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_schema_name: [String]
  ): [ListingsCustomization!]

  """
  Defines relation with other user, returns maximum of 10000 records at once;
  ex: invited_by: user(join_on_property: "invited_by_id") { id }
  """
  related_user(foreign_property: String = "id", join_on_property: String = "user_id"): User

  """
  Defines relation object accessible over HTTP in JSON collection identified by it's ID.
  """
  remote_model(
    """
    Endpoint that will return resources for given ids in json format
    """
    endpoint: Endpoint!

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String!
  ): Customization

  """
  when sorting by distance - field contains distance to target location
  """
  sort_score: [Int] @deprecated(reason: "not supported everywhere")

  """
  timestamp of when the record was updated, automatically generated by the system
  """
  updated_at: JSONDate

  """
  Defines relation with other user; ex: invited_by: user(join_on_property: "invited_by_id") { id }
  """
  user(foreign_property: String = "id", join_on_property: String = "user_id"): User @deprecated(reason: "use `related_users`")
  user_id: ID
}

input CustomizationImport {
  addresses: [AddressImport!]
  attachments: [AttachmentsImport!]
  created_at: ISO8601DateTime
  customizable_id: ID
  customizable_type: CustomizableTypeEnum

  """
  ID will be stored as external_id, relations will be preseved. We generate it when empty.
  """
  id: ID
  images: [ImagesImport!]

  """
  ex. {"color": "red"}
  """
  properties: HashObject
  type_name: String!
  updated_at: ISO8601DateTime
  user_id: ID
}

input CustomizationInputType {
  created_at: JSONDate
  custom_attachments: [AtachmentInputType]
  custom_images: [ImageInputType]
  custom_model_type_id: ID

  """
  deprecated, use model_schema_name
  """
  custom_model_type_name: String
  customizable_id: ID
  customizable_type: CustomizableTypeEnum
  customizations: [CustomizationsInputType]
  deleted_at: JSONDate
  external_id: ID
  id: ID
  model_schema_name: String
  models: [CustomizationsInputType]
  properties: [CustomAttributeInputType]

  """
  deprectated, use properties
  """
  title: String
  user_id: ID
}

input CustomizationSortOrder {
  """
  Sort by given field value
  """
  field: String
  order: String = "asc"

  """
  Sort by given property value
  """
  property: String
}

input CustomizationsInputType {
  name: String
  values: CustomizationInputType
}

input CustomizationsSortOrder {
  """
  Sort by field name
  """
  name: String
  order: String = "asc"

  """
  Sort by property field
  """
  property_name: String
}

type DataExport {
  created_at: JSONDate!

  """
  ID of the export task which can be queried same way as pos-cli. Once done, the task will include url to the zip file
  """
  id: ID
  status: String
  updated_at: JSONDate!
  url: String
}

type DataExportCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [DataExport!]
  total_entries: Int!
  total_pages: Int!
}

input DataExportModelsInput {
  filter: ModelsFilterInput
  per_page: Int = 3000000
  sort: [ModelsSortInput!]
}

input DataExportRecordsInput {
  filter: RecordsFilterInput
  per_page: Int = 3000000
  sort: [RecordsSortInput!]
}

input DataExportUsersInput {
  filter: UsersFilterInput
  per_page: Int = 3000000
  sort: [UsersSortInput!]
}

input DataExportsFilterInput {
  created_at: DateFilter
  id: UniqIdFilter
  updated_at: DateFilter
}

input DataExportsSortInput {
  created_at: StandardSort
  id: StandardSort
  updated_at: StandardSort
}

input DateFilter {
  exists: Boolean
  gt: String
  gte: String
  lt: String
  lte: String
  not_value: String
  not_value_in: [String!]
  value: String
  value_in: [String!]
}

input DateRange {
  gt: String
  gte: String
  lt: String
  lte: String
}

input DefaultProfileInputType {
  custom_attachments: [AtachmentInputType]
  custom_images: [ImageInputType]
  deleted_at: JSONDate
  properties: [CustomAttributeInputType]
}

enum DistanceUnit {
  """
  Centimeters
  """
  cm

  """
  Kilometers
  """
  km

  """
  Meters
  """
  m

  """
  Miles
  """
  mi

  """
  Nautical Miles
  """
  nmi

  """
  Yards
  """
  yd
}

type Document implements BasicPropertyInterface {
  """
  ID of an object.
  """
  id: ID

  """
  List of all properties assigned to the object.
  """
  properties(select: [PropertiesFieldInput!]): HashObject

  """
  Fetch any property by name and return value as a String; ex: hair_color: property(name: "hair_color")
  """
  property(name: String!): String

  """
  Fetch any property by name and return value as an Array of Strings. ex: todo_list: property_array(name: "todo_list")
  """
  property_array(name: String!): [String!]

  """
  Fetch any property by name and return value as a Boolean; ex: price: property_boolean(name: "enabled")
  """
  property_boolean(name: String!): Boolean

  """
  Fetch any property by name and return value as a Float; ex: price: property_float(name: "price")
  """
  property_float(name: String!): Float

  """
  Fetch any property by name and return value as an Integer; ex: age: property_int(name: "age")
  """
  property_int(name: String!): Int

  """
  Fetch any property by name and return value as a JSON string.
  """
  property_json(name: String!): JSONPayload

  """
  Fetch any property by name, parse it as a JSON and return object
  """
  property_object(name: String!): HashObject
}

"""
Email Notification
"""
type EmailNotification implements AdminSharedAttributesInterface {
  """
  json of the form { "file_name.jpg": { "url": "http://example.com/file.jpg" } }
  which defines email attachments. Liquid will be processed.
  """
  attachments: String

  """
  Comma separated blind carbon copy list. Liquid allowed. For example "john@example.com, jane@example.com"
  """
  bcc: String

  """
  Comma separated carbon copy list. Liquid allowed. For example "john@example.com, jane@example.com"
  """
  cc: String

  """
  liquid code to evaluate to valid form html. If email is triggered via form
  configuration, You have access to "form" variable, with data specified in the configuration.
  """
  content: String
  created_at: JSONDate!

  """
  liquid code which should evaluate to integer. Delays invoking the job by
  specified number of minutes. Useful to invoke code at certain point in time,
  for example 1 hour before something etc. To calculate proper number you can
  use time_diff filter.
  """
  delay_by: String

  """
  form configurations which trigger the email
  """
  form_configurations: [FormConfiguration!] @deprecated(reason: "use forms")

  """
  forms which trigger the email
  """
  forms: [Form!]

  """
  email address from which you would like to send the email, for example notifications@mydomain.com
  """
  from: String
  id: ID!

  """
  name of the liquid layout to which the content should be injected
  """
  layout: String

  """
  name of the liquid layout to which the content should be injected
  """
  layout_path: String @deprecated(reason: "use layout")
  metadata: HashObject

  """
  name of the email, which is used in form_configurations or mutation to trigger it
  """
  name: String!

  """
  defines the physical path of the file
  """
  physical_file_path: String

  """
  email address to which users should reply, for example support@mydomain.com
  """
  reply_to: String

  """
  liquid code to evaluate to text
  """
  subject: String

  """
  Comma separated recipient list. Liquid allowed. For example: "john@example.com, jane@example.com"
  """
  to: String

  """
  liquid code which should evaluate to true if the email should be sent
  """
  trigger_condition: String
  updated_at: JSONDate!
}

type EmailNotificationCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [EmailNotification!]
  total_entries: Int!
  total_pages: Int!
}

input EmailNotificationInputType {
  """
  json of the form { "file_name.jpg": { "url": "http://example.com/file.jpg" } }
  which defines email attachments. Liquid will be processed.
  """
  attachments: String

  """
  liquid code to evaluate to valid, comma separated blind carbon copy list, for example "john@example.com, jane@example.com"
  """
  bcc: String

  """
  liquid code to evaluate to valid, comma separated carbon copy list, for example "john@example.com, jane@example.com"
  """
  cc: String

  """
  liquid code to evaluate to valid form html. If email is triggered via form
  configuration, You have access to "form" variable, with data specified in configuration.
  """
  content: String

  """
  liquid code which should evaluate to integer. Delays invoking the job by
  specified number of minutes. Useful to invoke code at certain point in time,
  for example 1 hour before something etc. To calculate proper number you can
  use time_diff filter.
  """
  delay_by: String = "0"

  """
  ids of forms which should trigger the email
  """
  form_configuration_ids: [ID]

  """
  email address from which you would like to send the email, for example notifications@mydomain.com
  """
  from: String

  """
  name of the liquid layout to which the content should be injected
  """
  layout: String

  """
  deprecated, use layout
  """
  layout_path: String
  metadata: HashObject

  """
  deprecated - derived from physical_file_path; name of the email, which is used in form or mutation to trigger it
  """
  name: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/emails/my_email_notification
  """
  physical_file_path: String!

  """
  email address to which users should reply, for example support@mydomain.com
  """
  reply_to: String

  """
  liquid code to evaluate to text
  """
  subject: String!

  """
  liquid code to evaluate to valid, comma separated recipient list, for example "john@example.com, jane@example.com"
  """
  to: String

  """
  liquid code which should evaluate to true if the email should be sent
  """
  trigger_condition: String = "true"
}

input EmailNotificationsFilterInput {
  attachments: StringFilter
  bcc: StringFilter
  cc: StringFilter
  content: StringFilter
  created_at: DateFilter

  """
  Deprecated - use delay_by
  """
  delay: StringFilter
  delay_by: StringFilter
  id: UniqIdFilter
  layout: StringFilter

  """
  Deprecated - use layout
  """
  layout_path: StringFilter

  """
  Filter by metadata properties
  """
  metadata: [JsonbFilter!]
  name: StringFilter
  or: [EmailNotificationsFilterInput!]
  physical_file_path: StringFilter
  subject: StringFilter
  to: StringFilter
  trigger_condition: StringFilter
  updated_at: DateFilter
}

input EmailNotificationsSortInput {
  created_at: StandardSort
  id: StandardSort
  metadata: [JsonbSort!]
  name: StandardSort
  physical_file_path: StandardSort
  updated_at: StandardSort
}

type Embedding {
  """
  original text that was converted to embedding
  """
  content: String

  """
  timestamp of when the record was created, automatically generated by the system
  """
  created_at: JSONDate!

  """
  vector with 1536 dimensions, compatible with openai embeddings
  """
  embedding: [Float!]!
  id: ID!
  metadata: HashObject

  """
  tokens
  """
  token_count: Int

  """
  timestamp of when the record was updated, automatically generated by the system
  """
  updated_at: JSONDate!
}

type EmbeddingCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [Embedding!]
  total_entries: Int!
  total_pages: Int!
}

input EmbeddingCreateInputType {
  content: String
  created_at: JSONDate

  """
  vector with 1536 dimensions, compatible with openai embeddings
  """
  embedding: [Float!]!
  id: ID
  metadata: HashObject
  token_count: Int
  updated_at: JSONDate
}

input EmbeddingUpdateInputType {
  content: String
  created_at: JSONDate

  """
  vector with 1536 dimensions, compatible with openai embeddings
  """
  embedding: [Float!]
  id: ID
  metadata: HashObject
  token_count: Int
  updated_at: JSONDate
}

input EmbeddingsFilterInput {
  created_at: DateFilter
  id: UniqIdFilter

  """
  Filter by metadata properties
  """
  metadata: [JsonbFilter!]
  updated_at: DateFilter
}

input EmbeddingsSortInput {
  created_at: StandardSort
  embedding: VectorDistanceSort
  id: StandardSort
  updated_at: StandardSort
}

type EncryptedConstant {
  created_at: JSONDate!
  deleted_at: JSONDate

  """
  Name of the constant
  """
  name: String!
  updated_at: JSONDate!

  """
  Decrypted value of a constant
  """
  value: String!
}

type EncryptedConstantCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [EncryptedConstant!]
  total_entries: Int!
  total_pages: Int!
}

input EncryptedConstantFilterInput {
  created_at: DateFilter
  id: UniqIdFilter
  name: String
  updated_at: DateFilter
}

input EncryptedConstantsFilterInput {
  created_at: DateFilter
  id: UniqIdFilter
  name: StringFilter
  updated_at: DateFilter
}

input EncryptedConstantsSortInput {
  created_at: StandardSort
  id: StandardSort
  name: StandardSort
  updated_at: StandardSort
}

input Endpoint {
  """
  authentication token
  """
  token: String

  """
  endpoint url
  """
  url: String!
}

type FlashMessages {
  alert: String
  notice: String
}

"""
Form configuration - deprecated, use Form
"""
type Form implements AdminSharedAttributesInterface {
  """
  associated api call notifications
  """
  api_call_notifications: [ApiCallNotification!]

  """
  Same as callback, but invoked asynchronously. Recommended for performance reason.
  """
  async_callback_actions: String

  """
  Delays invoking the job by specified number of minutes. Liquid allowed -
  useful to invoke code at certain point in time, for example 1 hour before
  something etc. To calculate proper number you can use time_diff filter.
  """
  async_callback_delay: String

  """
  Defines max number of retrying attempts in case of an error. Usually you do not want to change it.
  """
  async_callback_max_attempts: Int

  """
  defines the invocaction priority, the higher the quicker timeout
  """
  async_callback_priority: AsyncCallbackPriority

  """
  associated authorization policies
  """
  authorization_policies: [AuthorizationPolicy!]

  """
  liquid code to be invoked after persisting input to DB. If possible, use async callback actions instead
  """
  callback_actions: String

  """
  whitelist of attributes which can be persisted in the DB. On server side
  (callbacks, emails etc) you have access to submited values via form variable
  (for exapmple configuration: properties: my_var is accessible via
  form.properties.my_var )
  """
  configuration: HashObject @deprecated(reason: "use fields")
  created_at: JSONDate!

  """
  liquid code which has to evaluate to JSON. This extends/overwrites user
  submitted input via form, before validation. Most useful to store in DB
  sensitive data which you do not want user to modify, for example
  context.current_user.id
  """
  default_payload: String

  """
  associated email notifications
  """
  email_notifications: [EmailNotification!]

  """
  whitelist of attributes which can be persisted in the DB. On server side
  (callbacks, emails etc) you have access to submited values via form variable
  (for exapmple fields: properties: my_var is accessible via
  form.properties.my_var )
  """
  fields: HashObject

  """
  Message which you want to display to user upon validation errors.Output is
  available via context.flash_alert. Liquid allowed.
  """
  flash_alert: String

  """
  Message which you want to display to user after successful form submission.
  Output is available via context.flash_notice. Liquid allowed.
  """
  flash_notice: String
  id: ID!

  """
  liquid code to evaluate to valid form html. You have access to form_builder variable and form tag.
  """
  liquid_body: String
  metadata: HashObject
  name: String!

  """
  defines the physical path of the file
  """
  physical_file_path: String

  """
  Path or URL to which user should be redirected after successful form submission. Liquid allowed.
  """
  redirect_to: String
  resource: String!

  """
  defines who can submit the form. If set to anyone, please make sure to provide authorization_policies
  """
  resource_owner: String!

  """
  Response headers for the form
  """
  response_headers: String

  """
  associated sms notifications
  """
  sms_notifications: [SmsNotification!]

  """
  name of the strategy and configuration for them
  """
  spam_protection: HashObject
  updated_at: JSONDate!
}

type FormCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [Form!]
  total_entries: Int!
  total_pages: Int!
}

"""
Form configuration - deprecated, use Form
"""
type FormConfiguration implements AdminSharedAttributesInterface {
  """
  associated api call notifications
  """
  api_call_notifications: [ApiCallNotification!]

  """
  Same as callback, but invoked asynchronously. Recommended for performance reason.
  """
  async_callback_actions: String

  """
  Delays invoking the job by specified number of minutes. Liquid allowed -
  useful to invoke code at certain point in time, for example 1 hour before
  something etc. To calculate proper number you can use time_diff filter.
  """
  async_callback_delay: String

  """
  Defines max number of retrying attempts in case of an error. Usually you do not want to change it.
  """
  async_callback_max_attempts: Int

  """
  defines the invocaction priority, the higher the quicker timeout
  """
  async_callback_priority: AsyncCallbackPriority

  """
  associated authorization policies
  """
  authorization_policies: [AuthorizationPolicy!]

  """
  liquid code to be invoked after persisting input to DB. If possible, use async callback actions instead
  """
  callback_actions: String

  """
  whitelist of attributes which can be persisted in the DB. On server side
  (callbacks, emails etc) you have access to submited values via form variable
  (for exapmple configuration: properties: my_var is accessible via
  form.properties.my_var )
  """
  configuration: HashObject
  created_at: JSONDate!

  """
  liquid code which has to evaluate to JSON. This extends/overwrites user
  submitted input via form, before validation. Most useful to store in DB
  sensitive data which you do not want user to modify, for example
  context.current_user.id
  """
  default_payload: String

  """
  associated email notifications
  """
  email_notifications: [EmailNotification!]

  """
  Message which you want to display to user upon validation errors.Output is
  available via context.flash_alert. Liquid allowed.
  """
  flash_alert: String

  """
  Message which you want to display to user after successful form submission.
  Output is available via context.flash_notice. Liquid allowed.
  """
  flash_notice: String
  id: ID!

  """
  liquid code to evaluate to valid form html. You have access to form_builder variable and form tag.
  """
  liquid_body: String
  metadata: HashObject
  name: String!

  """
  defines the physical path of the file
  """
  physical_file_path: String

  """
  Path or URL to which user should be redirected after successful form submission. Liquid allowed.
  """
  redirect_to: String
  resource: String!

  """
  defines who can submit the form. If set to anyone, please make sure to provide authorization_policies
  """
  resource_owner: String!

  """
  associated sms notifications
  """
  sms_notifications: [SmsNotification!]

  """
  name of the strategy and configuration for them
  """
  spam_protection: HashObject
  updated_at: JSONDate!
}

type FormConfigurationCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [FormConfiguration!]
  total_entries: Int!
  total_pages: Int!
}

input FormConfigurationInputType {
  """
  Same as callback, but invoked asynchronously. Recommended for performance reason.
  """
  async_callback_actions: String

  """
  liquid code which should evaluate to float. Delays invoking the job by
  specified number of minutes. Useful to invoke code at certain point in time,
  for example 1 hour before something etc. To calculate proper number you can
  use time_diff filter.
  """
  async_callback_delay: String = "0"

  """
  Defines max number of retrying attempts in case of an error. Usually you do not want to change it.
  """
  async_callback_max_attempts: Int = 1

  """
  defines the invocaction priority, the higher the quicker timeout
  """
  async_callback_priority: AsyncCallbackPriority = default

  """
  ids of authorization policies which should be checked
  """
  authorization_policy_ids: [ID]

  """
  liquid code to be invoked after persisting input to DB. If possible, use async callback actions instead
  """
  callback_actions: String

  """
  whitelist of attributes which can be persisted in the DB. On server side
  (callbacks, emails etc) you have access to submited values via form variable
  (for exapmple configuration: properties: my_var is accessible via
  form.properties.my_var )
  """
  configuration: HashObject

  """
  liquid code which has to evaluate to JSON. This extends/overwrites user
  submitted input via form, before validation. Most useful to store in DB
  sensitive data which you do not want user to modify, for example
  context.current_user.id
  """
  default_payload: String

  """
  liquid code which should evaluate to message which you want to display to user
  upon validation errors. Output is available via context.flash_alert
  """
  flash_alert: String

  """
  liquid code which should evaluate to message which you want to display to user
  after successful form submission. Output is available via context.flash_notice
  """
  flash_notice: String

  """
  liquid code to evaluate to valid form html. You have access to form_builder variable and form tag.
  """
  liquid_body: String
  metadata: HashObject
  name: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/form_configurations/my_form_configuration
  """
  physical_file_path: String!

  """
  liquid code which should evaluate to valid path or url to which user should be
  redirected after successful form submission.
  """
  redirect_to: String
  resource: String!

  """
  defines who can submit the form. If set to anyone, please make sure to provide authorization_policies
  """
  resource_owner: String!

  """
  strategy to protect against spam attacks.
  """
  spam_protection: SpamProtectionInputType = null
}

input FormConfigurationsFilterInput {
  async_callback_actions: StringFilter
  callback_actions: StringFilter
  created_at: DateFilter
  default_payload: StringFilter
  flash_notice: StringFilter
  id: UniqIdFilter
  liquid_body: StringFilter

  """
  Filter by metadata properties
  """
  metadata: [JsonbFilter!]
  name: StringFilter
  redirect_to: StringFilter
  resource: StringFilter
  resource_owner: StringFilter
  updated_at: DateFilter
}

input FormConfigurationsSortInput {
  created_at: StandardSort
  id: StandardSort
  metadata: [JsonbSort!]
  name: StandardSort
  physical_file_path: StandardSort
  updated_at: StandardSort
}

input FormInput {
  """
  Same as callback, but invoked asynchronously. Recommended for performance reason.
  """
  async_callback_actions: String

  """
  liquid code which should evaluate to float. Delays invoking the job by
  specified number of minutes. Useful to invoke code at certain point in time,
  for example 1 hour before something etc. To calculate proper number you can
  use time_diff filter.
  """
  async_callback_delay: String = "0"

  """
  Defines max number of retrying attempts in case of an error. Usually you do not want to change it.
  """
  async_callback_max_attempts: Int = 1

  """
  defines the invocaction priority, the higher the quicker timeout
  """
  async_callback_priority: AsyncCallbackPriority = default

  """
  ids of authorization policies which should be checked
  """
  authorization_policy_ids: [ID!]

  """
  liquid code to be invoked after persisting input to DB. If possible, use async callback actions instead
  """
  callback_actions: String

  """
  whitelist of attributes which can be persisted in the DB. On server side
  (callbacks, emails etc) you have access to submited values via form variable
  (for exapmple configuration: properties: my_var is accessible via
  form.properties.my_var )
  """
  configuration: HashObject

  """
  liquid code which has to evaluate to JSON. This extends/overwrites user
  submitted input via form, before validation. Most useful to store in DB
  sensitive data which you do not want user to modify, for example
  context.current_user.id
  """
  default_payload: String

  """
  liquid code which should evaluate to message which you want to display to user
  upon validation errors. Output is available via context.flash_alert
  """
  flash_alert: String

  """
  liquid code which should evaluate to message which you want to display to user
  after successful form submission. Output is available via context.flash_notice
  """
  flash_notice: String

  """
  liquid code to evaluate to valid form html. You have access to form_builder variable and form tag.
  """
  liquid_body: String
  metadata: HashObject

  """
  deprecated - derived from physical_file_path
  """
  name: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/forms/my_form
  """
  physical_file_path: String!

  """
  liquid code which should evaluate to valid path or url to which user should be
  redirected after successful form submission.
  """
  redirect_to: String
  resource: String!

  """
  defines who can submit the form. If set to anyone, please make sure to provide authorization_policies
  """
  resource_owner: String!

  """
  Response headers for the form
  """
  response_headers: String = null

  """
  strategy to protect against spam attacks.
  """
  spam_protection: SpamProtectionInput = null
}

"""
Autogenerated return type of FormSubmit.
"""
type FormSubmitPayload {
  """
  includes one of model or user, depending on which form was submitted
  """
  result: Result

  """
  validation error messages based on form fields
  """
  validation_errors: HashObject
}

input FormsFilterInput {
  async_callback_actions: StringFilter
  callback_actions: StringFilter
  created_at: DateFilter
  default_payload: StringFilter
  flash_notice: StringFilter
  id: UniqIdFilter
  liquid_body: StringFilter

  """
  Filter by metadata properties
  """
  metadata: [JsonbFilter!]
  name: StringFilter
  or: [FormsFilterInput!]
  physical_file_path: StringFilter
  redirect_to: StringFilter
  resource: StringFilter
  resource_owner: StringFilter
  updated_at: DateFilter
}

input FormsSortInput {
  created_at: StandardSort
  id: StandardSort
  metadata: [JsonbSort!]
  name: StandardSort
  physical_file_path: StandardSort
  updated_at: StandardSort
}

input FullTextQueryField {
  name: String
  priority: Int = 1
  profile_field: String
}

"""
GPG Key
"""
scalar GPGKey

input GeoBox {
  bottom: LatDegree!
  left: LngDegree!
  right: LngDegree!
  top: LatDegree!
}

input GeoBoxTopLeftBottomRight {
  bottom_right: GeoPoint
  top_left: GeoPoint
}

input GeoBoxTopRightBottomLeft {
  bottom_left: GeoPoint
  top_right: GeoPoint
}

input GeoPoint {
  lat: LatDegree!
  lng: LngDegree!
}

input GeoPointInShape {
  point: GeoPoint
}

type GeoPointType {
  lat: Float
  lon: Float
}

input GeoPolygon {
  """
  Remember to keep right order, follow GeoJSON spec
  """
  points: [GeoPoint]
}

input GeoPropertyFilterInput {
  """
  GeoJSON Object: of type Point, MultiPoint, LineString, Polygon. example: `{
  type: "Point", coordinates: [-84.3, 39.8] }`. Read documentation for more
  """
  center: GeometryJSON

  """
  distance in km
  """
  distance_in_km: Float
}

input GeoQuery {
  box: GeoBox
  box_top_left_bottom_right: GeoBoxTopLeftBottomRight
  box_top_right_bottom_left: GeoBoxTopRightBottomLeft
  point_in_shape: GeoPointInShape
  polygon: GeoPolygon
  radius: GeoRadius
}

input GeoRadius {
  center: GeoPoint

  """
  ex. 1km, 100mi, 50yards, 2meters
  """
  distance: String!
}

input GeoRadiusPropertyFilterInput {
  """
  GeoJSON Object: of type Point, MultiPoint, LineString, Polygon. example: `{
  type: "Point", coordinates: [-84.3, 39.8] }`. Read documentation for more
  """
  point: GeometryJSON

  """
  property name with value for radius distance. Property has to be of float type. Value has to be `km` unit.
  """
  radius_in_km_from_property: String
}

"""
GeometryJSON is a JSON format for encoding a variety of geographic data
structures. It supports the following geometry types: Point [long, lan],
LineString [[long, lan], [long, lan]], Polygon [[[long, lan], [long, lan]]] and
MultiPoint [[long, lan], [long, lan]]. Point example:  {"type": "Point",
"coordinates": [100.0, 0.0]}, Polygon exaple: {"type": "Polygon", "coordinates":
[[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]]]}. More
information: https://tools.ietf.org/html/rfc7946
"""
scalar GeometryJSON

"""
Graphql query or mutation
"""
type GraphQL implements AdminSharedAttributesInterface {
  """
  graphql query string
  """
  body: String
  created_at: JSONDate!
  id: ID!
  metadata: HashObject

  """
  defines the physical path of the file
  """
  physical_file_path: String
  updated_at: JSONDate!
}

type GraphQuery implements AdminSharedAttributesInterface {
  created_at: JSONDate!
  id: ID!
  metadata: HashObject

  """
  Name of the graph query
  """
  name: String!

  """
  defines the physical path of the file
  """
  physical_file_path: String

  """
  The query
  """
  query_string: String!
  updated_at: JSONDate!
}

type GraphQueryCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [GraphQuery!]
  total_entries: Int!
  total_pages: Int!
}

input GraphqlFilterInput {
  created_at: DateFilter
  id: UniqIdFilter

  """
  Filter by metadata properties
  """
  metadata: [JsonbFilter!]
  name: StringFilter
  or: [GraphqlFilterInput!]
  physical_file_path: StringFilter
  query_string: StringFilter
  updated_at: DateFilter
}

input GraphqlInputType {
  body: String!
  metadata: HashObject

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  graphql/my_query.graphql
  """
  physical_file_path: String!
}

input GraphqlSortInput {
  created_at: StandardSort
  id: StandardSort
  metadata: [JsonbSort!]
  name: StandardSort
  physical_file_path: StandardSort
  updated_at: StandardSort
}

type HTTPRequestContext {
  """
  Returns array of configured authentication providers
  """
  authentication_providers: [AuthenticationProvider]
  body: String

  """
  Returns a String with the last requested path including their params. /foo?bar
  """
  current_full_path: String!
  current_path: String!

  """
  Returns the original request URL as a String. # => "http://www.example.com/articles?page=2"
  """
  current_url: String!
  flash: FlashMessages
  form_authenticity_token: String!

  """
  Access request headers
  """
  headers: HeadersObject!

  """
  Returns true if the “X-Requested-With” header contains “XMLHttpRequest”
  (case-insensitive),which may need to be manually added depending on the choice
  of JavaScript libraries and frameworks.
  """
  is_xhr: Boolean

  """
  Access data sent in by the user or other parameters in your controller actions
  """
  params: ParamsObject!
  params_unfiltered: HashObject!

  """
  The referer of the client
  """
  referer: String
}

interface HasModelsInterface {
  """
  Defines has-one relation with other model, e.g: children: models(model_name:
  "child" join_on_property: "parent_id" foreign_property: "parent_id") { id }
  """
  model(
    filter: ModelsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with model-schema-name == model_name
    """
    model_name: [String]!
    sort: [ModelsSortInput!]
  ): Model @deprecated(reason: "use `related_record`")

  """
  Defines has-many relation with other model; ex: children: models(model_name:
  "child", join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  models(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int

    """
    Joins model [formaly customization] with model-schema-name == model_name
    """
    model_name: [String]!
    sort: [ModelsSortInput!]
  ): [Model!] @deprecated(reason: "use `related_records`")

  """
  Defines has-one relation with other model; ex: children: models(model_name:
  "child" join_on_property: "parent_id" foreign_property: "parent_id") { id }
  """
  related_model(
    filter: ModelsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with model-schema-name == model_schema_name
    """
    model_schema_name: [String]!
    sort: [ModelsSortInput!]
  ): Model @deprecated(reason: "use `related_record`")

  """
  Defines has-many relation with other model; ex: children:
  related_models(model_schema_name: "child", join_on_property: "parent_id",
  foreign_property: "parent_id") { id }
  """
  related_models(
    filter: ModelsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int

    """
    Joins model [formaly customization] with model-schema-name == model_schema_name
    """
    model_schema_name: [String]!
    sort: [ModelsSortInput!]
  ): [Model!] @deprecated(reason: "use `related_records`")

  """
  Defines relation with other user; ex: invited_by: related_user(join_on_property: "invited_by_id") { id }
  """
  related_user(
    filter: ModelsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    """
    join_on_property: String = "user_id"
    sort: [UsersSortInput!]
  ): User

  """
  Defines has-many relation with other user; ex: children:
  users(join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  related_users(
    filter: ModelsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int
    sort: [UsersSortInput!]
  ): [User!]

  """
  Defines relation with other user; ex: invited_by: user(join_on_property: "invited_by_id") { id }
  """
  user(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    """
    join_on_property: String = "user_id"
    sort: [UsersSortInput!]
  ): User @deprecated(reason: "use `related_user`")

  """
  Defines has-many relation with other user; ex: children:
  users(join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  users(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int
    sort: [UsersSortInput!]
  ): [User!] @deprecated(reason: "use `related_users`")
}

interface HasRecordsInterface {
  """
  Defines has-one relation with other record; ex: children: records(table:
  "child" join_on_property: "parent_id" foreign_property: "parent_id") { id }
  """
  related_record(
    filter: RecordsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    sort: [RecordsSortInput!]

    """
    Joins record [formaly customization] with record-schema-name == table
    """
    table: [String]!
  ): Record

  """
  Defines has-many relation with other records; ex: children:
  related_records(table: "children", join_on_property: "parent_id",
  foreign_property: "parent_id") { id }
  """
  related_records(
    filter: RecordsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int
    sort: [RecordsSortInput!]

    """
    Define table name which should be used as a source for related records
    """
    table: [String]!
  ): [Record!]
}

interface HasUsersInterface {
  """
  Defines relation with other user; ex: invited_by: related_user(join_on_property: "invited_by_id") { id }
  """
  related_user(
    filter: UsersFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    """
    join_on_property: String = "user_id"
    sort: [UsersSortInput!]
  ): User

  """
  Defines has-many relation with other user; ex: children:
  users(join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  related_users(
    filter: UsersFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int
    sort: [UsersSortInput!]
  ): [User!]
}

"""
Represents data as a collection of unique keys and their values. Also known as
associative arrays, maps or dictionaries. You can create it in liquid by
converting JSON object with parse_json filter or tag. It can be any level deep.
"""
scalar HashObject

"""
Represents data defined by platformOS stored in context.headers variable.
"""
scalar HeadersObject

"""
An ISO 8601-encoded datetime
"""
scalar ISO8601DateTime

input IdRangeFilter {
  gt: ID
  gte: ID
  lt: ID
  lte: ID
}

"""
Generic image
"""
type Image {
  filename: String! @deprecated(reason: "Not used in direct s3 way of uploading file")
  id: ID

  """
  image original height
  """
  image_original_height: Int! @deprecated(reason: "Not used in direct s3 way of uploading file")

  """
  image original width
  """
  image_original_width: Int! @deprecated(reason: "Not used in direct s3 way of uploading file")
  name: String @deprecated(reason: "Not needed")

  """
  id of the User who uploaded the image
  """
  uploader_id: ID

  """
  image url; ex: thumb: url(version: "thumb")
  """
  url(
    """
    name of the image version to which url will point
    """
    version: String
  ): String

  """
  object with versions, ex. "urls": { "big": { "url":
  "https://uploads.example.com/images/big_photo.jpg"}, "small": { "url":
  "https://example.com/images/small_photo.jpg" } } }
  """
  urls: HashObject!
}

scalar ImageBlur

enum ImageFormat {
  avif
  jpeg
  png
  webp
}

input ImageInputType {
  """
  external url to the image
  """
  direct_url: String

  """
  Image URL returned by directly uploading it to platformOS s3 bucket using pre-signed URL
  """
  image: String

  """
  name of the property
  """
  name: String!

  """
  external url to the image
  """
  remote_image_url: String
}

input ImagePresignUrlInput {
  """
  file size limitation in KiB. ex. [gte: 1, lte: 1024] allows file size from 1KiB to 1 MiB 
  """
  content_length: ContentLengthRange

  """
  choose property which should be used to generate versions, versions defined in yml schema file
  """
  model_property: ModelPropertyInput

  """
  choose property which should be used to generate versions, versions defined in yml schema file
  """
  user_property: UserPropertyInput

  """
  deprecated
  """
  versions: [VersionInput!]
}

type ImagePresignedUploadUrl {
  """
  Direct s3 upload endpoint to which you can upload files. Make sure you include upload_url_payload with the request
  """
  upload_url: String!

  """
  Payload you need to provide for upload_url
  """
  upload_url_payload: HashObject!
}

"""
Defines the quality of the image, 0 - lowest quality, 100 - highest quality
"""
scalar ImageQuality

enum ImageResizeFit {
  """
  Embed within both provided dimensions.
  """
  contain

  """
  Crop to cover both provided dimensions
  """
  cover

  """
  Ignore the aspect ratio of the input and stretch to both provided dimensions.
  """
  fill

  """
  Preserving aspect ratio, resize the image to be as large as possible while
  ensuring its dimensions are less than or equal to both those specified.
  """
  inside

  """
  Preserving aspect ratio, resize the image to be as small as possible while
  ensuring its dimensions are greater than or equal to both those specified.
  Some of these values are based on the object-fit CSS property.
  """
  outside
}

enum ImageResizePosition {
  bottom
  center
  left
  left_bottom
  left_top
  right
  right_bottom
  right_top
  top
}

input ImagesFilterInput {
  created_at: DateFilter
  deleted_at: DateFilter
  id: UniqIdFilter
  name: StringFilter
  property_id: UniqIdFilter
  updated_at: DateFilter
  uploader_id: UniqIdFilter
}

input ImagesImport {
  """
  direct path to file on S3
  """
  direct_path: String

  """
  ID will ignored.
  """
  id: ID

  """
  name of the defined property
  """
  name: String!

  """
  URL to presigned slot on S3
  """
  url: String
}

input ImagesSortInput {
  created_at: StandardSort
  deleted_at: StandardSort
  id: StandardSort
  property_id: StandardSort
  updated_at: StandardSort
  uploader_id: StandardSort
}

"""
Autogenerated return type of ImportCustomizationsMutation.
"""
type ImportCustomizationsMutationPayload {
  external_ids: [ID!]!
  ids: [ID!]!
}

"""
Autogenerated return type of ImportTransactablesMutation.
"""
type ImportTransactablesMutationPayload {
  external_ids: [ID!]!
  ids: [ID!]!
}

"""
Autogenerated return type of ImportUsersMutation.
"""
type ImportUsersMutationPayload {
  external_ids: [ID!]!
  ids: [ID!]!
}

type IndexSearchCollection {
  aggregations: Aggregations!
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [Document!]
  total_entries: Int!
  total_pages: Int!
}

input IndexSearchFilterInput {
  """
  if argument is true, selects documents for which the property exists and is
  not null; if argument is false, selects documents for which the property
  doesn't exist or is null
  """
  exists: Boolean

  """
  name of the property
  """
  name: String!

  """
  property specified by name should NOT have a value that is equal to the value provided
  """
  not_value: String

  """
  property specified by name should NOT include a value that is provided
  """
  not_value_in: [String!]

  """
  property specified by name have a value that is prefixed with provided value
  """
  prefix: String

  """
  selects documents for which the property value is inside the given range;
  range options that can be given are lt (lower than), lte (lower than or
  equal), gt (greater than), gte (greater than or equal)
  """
  range: RangeFilter

  """
  property specified by name should have a value that is equal to the value provided
  """
  value: String

  """
  property specified by name should include a value that is provided
  """
  value_in: [String!]

  """
  ALL values should be included in document OR one is enough
  """
  value_in_operator: OperatorEnum = OR
}

input IndexSearchQuery {
  """
  Keyword analyzer: english arabic etc. Depends on your search index configuration. Default: standard
  """
  analyzer: String
  fields: [FullTextQueryField]

  """
  Accept wildcards, ? for single character, * for more
  """
  keyword: String
  match_type: QueryMatchTypeEnum = EXACT
  operator: OperatorEnum = AND
  properties: [FullTextQueryField]
}

input IndexSearchSortInput {
  """
  Sort by field
  """
  name: String!
  order: String = "asc"
}

"""
Instance
"""
type Instance {
  id: Int!
  name: String!
}

input IntegerFilter {
  not_value_in: [Int]
  range: IntegerRangeFilter
  value: Int
  value_in: [Int]
}

input IntegerRangeFilter {
  gt: Int
  gte: Int
  lt: Int
  lte: Int
}

"""
Represents Date and time data expressed according to ISO 8601 format to which values are automatically converted.
"""
scalar JSONDate

"""
Represents data structures formatted as JSON standard.
"""
scalar JSONPayload

input JoinModelCollection {
  foreign_property: PropertyName!
  join_on_property: PropertyName = "id"
  property_type: String
}

input JoinRecordCollection {
  foreign_property: PropertyName!
  join_on_property: PropertyName = "id"
  property_type: String
}

input JsonbAttributeFilter {
  """
  The target value must contain the passed array
  """
  array_contains: [String!]

  """
  The value in the target array must have at least one element in common with the passed array
  """
  array_overlaps: [String!]

  """
  The passed array must contain the target array
  """
  array_value_in: [String!]
  contains: String
  key: String!
  value: Any

  """
  The value passed must be the exact target array in that order
  """
  value_array: [String!]
  value_boolean: Boolean
  value_float: Float

  """
  The passed array must contain the target scalar value
  """
  value_in: [String!]
  value_int: Int
}

input JsonbFilter {
  """
  Filter by attribute key and value. Works for one level attributes
  """
  attribute: JsonbAttributeFilter

  """
  Filter by attributes - key and value. Works for one level attribute
  """
  attributes: [JsonbAttributeFilter!]

  """
  Filter metadata that contains part of the text
  """
  contains: String

  """
  Exclude matched resources from results
  """
  exclude: Boolean

  """
  Filter resources that have certain key in metadata
  """
  has_key: String
}

input JsonbSort {
  """
  name of the first level metadata attribute
  """
  name: String!
  order: SortOrderEnum!
}

enum JwtAlgorithm {
  """
  ES256
  """
  ES256

  """
  ES384
  """
  ES384

  """
  ES512
  """
  ES512

  """
  HS256
  """
  HS256

  """
  HS384
  """
  HS384

  """
  HS512
  """
  HS512

  """
  PS256
  """
  PS256

  """
  PS384
  """
  PS384

  """
  PS512
  """
  PS512

  """
  RS256
  """
  RS256

  """
  RS384
  """
  RS384

  """
  RS512
  """
  RS512

  """
  none
  """
  none
}

"""
Must be within range -90.0..90.0
"""
scalar LatDegree

interface LegacyCustomAttributeInterface {
  """
  Fetch address by name; ex: address: custom_address(name: "office_address")
  """
  custom_address(name: String!): CustomAddrress @deprecated(reason: "Use address")

  """
  Fetch all addresses, optionaly you can filter results by name; ex: home: custom_addresses(name: "home")
  """
  custom_addresses(name: String): [CustomAddrress!] @deprecated(reason: "Use addresses")

  """
  Fetch attachment by name; ex: sales_report: custom_attachment(name: "sales_report")
  """
  custom_attachment(name: String!): PrivateFile @deprecated(reason: "Use attachment")

  """
  Fetch all attachments, optionally you can filter results by name; ex:
  sales_reports: custom_attachments(name: "sales_report")
  """
  custom_attachments(name: String): [PrivateFile!] @deprecated(reason: "Use attachments")

  """
  Fetch image by name; ex: header: custom_image(name: "header")
  """
  custom_image(name: String!): Image @deprecated(reason: "Use image")

  """
  Fetch all images, optionaly you can filter results by name; ex: cat_images: custom_images(name: "cat")
  """
  custom_images(name: String): [Image!] @deprecated(reason: "Use images")
}

"""
Liquid Layouts
"""
type LiquidLayout implements AdminSharedAttributesInterface {
  """
  liquid code to evaluate to valid html. To inject content of the resources using the layout use {{ content_for_layout }}
  """
  body: String
  created_at: JSONDate!
  format: PageFormat
  id: ID!
  metadata: HashObject

  """
  Defines the the path for layout, must starts with layouts/, for example
  layouts/my_layout. Please note that the layouts/ prefix must be skipped when
  setting layout in Page or EmailNotification
  """
  path: String!

  """
  defines the physical path of the file
  """
  physical_file_path: String
  updated_at: JSONDate!
}

type LiquidLayoutCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [LiquidLayout!]
  total_entries: Int!
  total_pages: Int!
}

input LiquidLayoutInputType {
  body: String
  format: PageFormat = html
  metadata: HashObject
  path: String!

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/views/layouts/my_layout
  """
  physical_file_path: String!
}

input LiquidLayoutsFilterInput {
  body: StringFilter
  created_at: DateFilter
  id: UniqIdFilter

  """
  Filter by metadata properties
  """
  metadata: [JsonbFilter!]
  or: [LiquidLayoutsFilterInput!]
  path: StringFilter
  physical_file_path: StringFilter
  updated_at: DateFilter
}

input LiquidLayoutsSortInput {
  created_at: StandardSort
  id: StandardSort
  metadata: [JsonbSort!]
  path: StandardSort
  physical_file_path: StandardSort
  updated_at: StandardSort
}

"""
Liquid Partials
"""
type LiquidPartial implements AdminSharedAttributesInterface {
  """
  liquid code to evaluate to valid html
  """
  body: String
  created_at: JSONDate!
  format: PageFormat
  id: ID!
  metadata: HashObject

  """
  defines the name of the partial to be used with include tag
  """
  path: String!

  """
  defines the physical path of the file
  """
  physical_file_path: String
  updated_at: JSONDate!
}

type LiquidPartialCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [LiquidPartial!]
  total_entries: Int!
  total_pages: Int!
}

input LiquidPartialInputType {
  body: String = ""
  format: PageFormat = html
  metadata: HashObject
  path: String!

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/views/partials/my_partial
  """
  physical_file_path: String
}

input LiquidPartialsFilterInput {
  body: StringFilter
  created_at: DateFilter
  id: UniqIdFilter

  """
  Filter by metadata properties
  """
  metadata: [JsonbFilter!]
  or: [LiquidPartialsFilterInput!]
  path: StringFilter
  physical_file_path: StringFilter
  updated_at: DateFilter
}

input LiquidPartialsSortInput {
  created_at: StandardSort
  id: StandardSort
  metadata: [JsonbSort!]
  path: StandardSort
  physical_file_path: StandardSort
  updated_at: StandardSort
}

type Listing implements ListingCustomAttributeInterface & ListingsMetadata & RelationOnDemandInterface & RemoteModelInterface {
  created_at: JSONDate

  """
  Remember to set `listing: { has_creator: true }` in query arguments
  """
  creator: UserListing
  creator_id: ID

  """
  Fetch address by name; ex: address: custom_address(name: "office_address")
  """
  custom_address(name: String!): ListingAddress

  """
  Fetch all addresses, optionaly you can filter results by name; ex: home: custom_addresses(name: "home")
  """
  custom_addresses(name: String): [ListingAddress!]

  """
  Fetch attachment by name; ex: sales_report: custom_attachment(name: "sales_report")
  """
  custom_attachment(name: String!): ListingsPrivateFile
  custom_attachments(name: String): [ListingsPrivateFile!]

  """
  Fetch image by name; ex: header: custom_image(name: "header")
  """
  custom_image(name: String!): ListingImage

  """
  Fetch all images, optionaly you can filter results by name; ex: cat_images: custom_images(name: "cat")
  """
  custom_images(name: String): [ListingImage!]
  customizations(name: String, properties: [QueryCustomAttribute], user_id: ID): [ListingsCustomization!]
  deleted_at: JSONDate
  external_id: ID
  id: ID!

  """
  Defines belongs-to relation with other model; ex: parent: model(model_name:
  "parent", join_on_property: "parent_id") { id }
  """
  model(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_name: String
  ): ListingsCustomization @deprecated(reason: "use `related_model`")

  """
  Defines has-many relation with other model; ex: children: models(model_name:
  "child", join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  models(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_name: [String]
  ): [ListingsCustomization!] @deprecated(reason: "use `related_models`")
  name: String

  """
  List of all properties assigned to the object.
  """
  properties: HashObject

  """
  Fetch any custom attribute by name; ex: hair_color: property(name: "hair_color")
  """
  property(name: String!): String

  """
  Fetch any property of Array type by name, it returns Array in contrast to
  "property" which returns String; ex: todo_list: property_array(name: "todo_list")
  """
  property_array(name: String!): [String!]

  """
  Fetch any property of JSON type by name, it returns JSON in contrast to
  "property" which returns String; ex: todo_list: property_json(name: "todo_list")
  """
  property_json(name: String!): JSONPayload

  """
  Defines belongs-to relation with other model; ex: parent: model(model_name:
  "parent", join_on_property: "parent_id") { id }
  """
  related_model(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_schema_name: String
  ): ListingsCustomization

  """
  Defines has-many relation with other model, returns maximum of 10000 records
  at once; ex: children: models(model_name: "child", join_on_property:
  "parent_id", foreign_property: "parent_id") { id }
  """
  related_models(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_schema_name: [String]
  ): [ListingsCustomization!]

  """
  Defines relation with other user, returns maximum of 10000 records at once;
  ex: invited_by: user(join_on_property: "invited_by_id") { id }
  """
  related_user(foreign_property: String = "id", join_on_property: String = "user_id"): User

  """
  Defines relation object accessible over HTTP in JSON collection identified by it's ID.
  """
  remote_model(
    """
    Endpoint that will return resources for given ids in json format
    """
    endpoint: Endpoint!

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String!
  ): Customization
  slug: String!

  """
  when sorting by distance - field contains distance to target location
  """
  sort_score: [Int] @deprecated(reason: "not supported everywhere")
  type: String
  updated_at: JSONDate

  """
  Defines relation with other user; ex: invited_by: user(join_on_property: "invited_by_id") { id }
  """
  user(foreign_property: String = "id", join_on_property: String = "user_id"): User @deprecated(reason: "use `related_users`")
}

"""
An address
"""
type ListingAddress {
  address: String
  address2: String
  apartment: String
  city: String
  country: String
  id: Int!
  iso_country_code: String
  lat: Float
  lng: Float
  name: String
  point: GeoPointType
  postcode: String
  service_radius: String
  state: String
  street: String
  street_number: String
  suburb: String
}

input ListingAggregation {
  fields: [AggregationField]
  filter: QueryListing
  global: Boolean = false

  """
  Name of the result
  """
  name: String
}

type ListingCollection {
  aggregations: Aggregations!
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  page: Int! @deprecated(reason: "use current_page")
  per_page: Int!
  results: [Listing!]
  size: Int!
  total_entries: Int!
  total_pages: Int!
}

interface ListingCustomAttributeInterface {
  """
  Fetch address by name; ex: address: custom_address(name: "office_address")
  """
  custom_address(name: String!): ListingAddress

  """
  Fetch all addresses, optionaly you can filter results by name; ex: home: custom_addresses(name: "home")
  """
  custom_addresses(name: String): [ListingAddress!]

  """
  Fetch attachment by name; ex: sales_report: custom_attachment(name: "sales_report")
  """
  custom_attachment(name: String!): ListingsPrivateFile
  custom_attachments(name: String): [ListingsPrivateFile!]

  """
  Fetch image by name; ex: header: custom_image(name: "header")
  """
  custom_image(name: String!): ListingImage

  """
  Fetch all images, optionaly you can filter results by name; ex: cat_images: custom_images(name: "cat")
  """
  custom_images(name: String): [ListingImage!]

  """
  List of all properties assigned to the object.
  """
  properties: HashObject

  """
  Fetch any custom attribute by name; ex: hair_color: property(name: "hair_color")
  """
  property(name: String!): String

  """
  Fetch any property of Array type by name, it returns Array in contrast to
  "property" which returns String; ex: todo_list: property_array(name: "todo_list")
  """
  property_array(name: String!): [String!]

  """
  Fetch any property of JSON type by name, it returns JSON in contrast to
  "property" which returns String; ex: todo_list: property_json(name: "todo_list")
  """
  property_json(name: String!): JSONPayload
}

type ListingImage {
  file_name: String
  filename: String @deprecated(reason: "Use file_name")
  id: ID
  image_original_height: Int
  image_original_width: Int
  name: String

  """
  image url; ex: thumb: url(version: "thumb")
  """
  url(version: String = "thumb"): String
}

"""
A profile
"""
type ListingUserProfile implements ListingCustomAttributeInterface & RelationOnDemandInterface & RemoteModelInterface {
  """
  Fetch address by name; ex: address: custom_address(name: "office_address")
  """
  custom_address(name: String!): ListingAddress

  """
  Fetch all addresses, optionaly you can filter results by name; ex: home: custom_addresses(name: "home")
  """
  custom_addresses(name: String): [ListingAddress!]

  """
  Fetch attachment by name; ex: sales_report: custom_attachment(name: "sales_report")
  """
  custom_attachment(name: String!): ListingsPrivateFile
  custom_attachments(name: String): [ListingsPrivateFile!]

  """
  Fetch image by name; ex: header: custom_image(name: "header")
  """
  custom_image(name: String!): ListingImage

  """
  Fetch all images, optionaly you can filter results by name; ex: cat_images: custom_images(name: "cat")
  """
  custom_images(name: String): [ListingImage!]
  customizations(name: String!, user_id: ID): [ListingsCustomization!]
  external_id: ID
  id: ID!

  """
  Defines belongs-to relation with other model; ex: parent: model(model_name:
  "parent", join_on_property: "parent_id") { id }
  """
  model(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_name: String
  ): ListingsCustomization @deprecated(reason: "use `related_model`")

  """
  Defines has-many relation with other model; ex: children: models(model_name:
  "child", join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  models(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_name: [String]
  ): [ListingsCustomization!] @deprecated(reason: "use `related_models`")
  profile_type: String!

  """
  List of all properties assigned to the object.
  """
  properties: HashObject

  """
  Fetch any custom attribute by name; ex: hair_color: property(name: "hair_color")
  """
  property(name: String!): String

  """
  Fetch any property of Array type by name, it returns Array in contrast to
  "property" which returns String; ex: todo_list: property_array(name: "todo_list")
  """
  property_array(name: String!): [String!]

  """
  Fetch any property of JSON type by name, it returns JSON in contrast to
  "property" which returns String; ex: todo_list: property_json(name: "todo_list")
  """
  property_json(name: String!): JSONPayload

  """
  Defines belongs-to relation with other model; ex: parent: model(model_name:
  "parent", join_on_property: "parent_id") { id }
  """
  related_model(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_schema_name: String
  ): ListingsCustomization

  """
  Defines has-many relation with other model, returns maximum of 10000 records
  at once; ex: children: models(model_name: "child", join_on_property:
  "parent_id", foreign_property: "parent_id") { id }
  """
  related_models(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_schema_name: [String]
  ): [ListingsCustomization!]

  """
  Defines relation with other user, returns maximum of 10000 records at once;
  ex: invited_by: user(join_on_property: "invited_by_id") { id }
  """
  related_user(foreign_property: String = "id", join_on_property: String = "user_id"): User

  """
  Defines relation object accessible over HTTP in JSON collection identified by it's ID.
  """
  remote_model(
    """
    Endpoint that will return resources for given ids in json format
    """
    endpoint: Endpoint!

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String!
  ): Customization

  """
  Defines relation with other user; ex: invited_by: user(join_on_property: "invited_by_id") { id }
  """
  user(foreign_property: String = "id", join_on_property: String = "user_id"): User @deprecated(reason: "use `related_users`")
}

"""
Deprecated
"""
type ListingsCommunication {
  phone_number: String!
  verified: Boolean!
}

type ListingsCustomModelType {
  id: ID!
  name: String!
}

type ListingsCustomization implements ListingCustomAttributeInterface & RelationOnDemandInterface & RemoteModelInterface {
  """
  timestamp of when the record was created, automatically generated by the system
  """
  created_at: JSONDate

  """
  Fetch address by name; ex: address: custom_address(name: "office_address")
  """
  custom_address(name: String!): ListingAddress

  """
  Fetch all addresses, optionaly you can filter results by name; ex: home: custom_addresses(name: "home")
  """
  custom_addresses(name: String): [ListingAddress!]

  """
  Fetch attachment by name; ex: sales_report: custom_attachment(name: "sales_report")
  """
  custom_attachment(name: String!): ListingsPrivateFile
  custom_attachments(name: String): [ListingsPrivateFile!]

  """
  Fetch image by name; ex: header: custom_image(name: "header")
  """
  custom_image(name: String!): ListingImage

  """
  Fetch all images, optionaly you can filter results by name; ex: cat_images: custom_images(name: "cat")
  """
  custom_images(name: String): [ListingImage!]
  custom_model_type: ListingsCustomModelType
  customizable: Customizable
  customizable_id: ID
  customizable_type: String
  customizations(filter: NestedCustomizationFilters, page: Int = 1, per_page: Int = 20, sort: [CustomizationsSortOrder]): ListingsCustomizationCollection! @deprecated(reason: "Use models: instead.")
  deleted_at: JSONDate

  """
  Used mainly for import/export, if you want to use third party service as a source of truth
  """
  external_id: ID
  human_name: String
  id: ID!

  """
  Defines belongs-to relation with other model; ex: parent: model(model_name:
  "parent", join_on_property: "parent_id") { id }
  """
  model(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_name: String
  ): ListingsCustomization @deprecated(reason: "use `related_model`")
  model_schema: ListingsModelSchema

  """
  Defines has-many relation with other model; ex: children: models(model_name:
  "child", join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  models(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_name: [String]
  ): [ListingsCustomization!] @deprecated(reason: "use `related_models`")
  name: String

  """
  List of all properties assigned to the object.
  """
  properties: HashObject

  """
  Fetch any custom attribute by name; ex: hair_color: property(name: "hair_color")
  """
  property(name: String!): String

  """
  Fetch any property of Array type by name, it returns Array in contrast to
  "property" which returns String; ex: todo_list: property_array(name: "todo_list")
  """
  property_array(name: String!): [String!]

  """
  Fetch any property of JSON type by name, it returns JSON in contrast to
  "property" which returns String; ex: todo_list: property_json(name: "todo_list")
  """
  property_json(name: String!): JSONPayload

  """
  Defines belongs-to relation with other model; ex: parent: model(model_name:
  "parent", join_on_property: "parent_id") { id }
  """
  related_model(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_schema_name: String
  ): ListingsCustomization

  """
  Defines has-many relation with other model, returns maximum of 10000 records
  at once; ex: children: models(model_name: "child", join_on_property:
  "parent_id", foreign_property: "parent_id") { id }
  """
  related_models(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_schema_name: [String]
  ): [ListingsCustomization!]

  """
  Defines relation with other user, returns maximum of 10000 records at once;
  ex: invited_by: user(join_on_property: "invited_by_id") { id }
  """
  related_user(foreign_property: String = "id", join_on_property: String = "user_id"): User

  """
  Defines relation object accessible over HTTP in JSON collection identified by it's ID.
  """
  remote_model(
    """
    Endpoint that will return resources for given ids in json format
    """
    endpoint: Endpoint!

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String!
  ): Customization
  updated_at: JSONDate

  """
  Defines relation with other user; ex: invited_by: user(join_on_property: "invited_by_id") { id }
  """
  user(foreign_property: String = "id", join_on_property: String = "user_id"): User @deprecated(reason: "use `related_users`")
  user_id: ID
}

type ListingsCustomizationCollection {
  aggregations: Aggregations!
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  page: Int! @deprecated(reason: "use current_page")
  per_page: Int!
  results: [ListingsCustomization!]
  size: Int!
  total_entries: Int!
  total_pages: Int!
}

interface ListingsMetadata {
  """
  when sorting by distance - field contains distance to target location
  """
  sort_score: [Int] @deprecated(reason: "not supported everywhere")
}

type ListingsModelSchema {
  id: ID!
  name: String!
}

type ListingsPrivateFile {
  content_type: String
  created_at: JSONDate
  file_name: String
  id: ID
  name: String
  size_bytes: Int
  url(
    """
    Number of seconds before presigned URL expires. Max value is one week (604800)
    """
    expires_in: Int = 900
  ): String
}

"""
Must be within range -180.0..180.0
"""
scalar LngDegree

type LogEntry {
  id: ID!
  message: String!
  type: String!
}

"""
List of available event types
"""
enum LogEntryType {
  debug
  error
  info
}

type Model implements HasModelsInterface & PropertiesInterface {
  """
  Fetch address by name; ex: address: address(name: "office_address")
  """
  address(name: String!): CustomAddrress @deprecated(reason: "use your own model for address if needed")

  """
  Fetch all addresses, optionally you can filter results by name; ex: home_address: addresses(name: "home")
  """
  addresses(name: String): [CustomAddrress!] @deprecated(reason: "use your own model for address if needed")

  """
  Fetch attachment by name; ex: sales_report: attachment(name: "sales_report")
  """
  attachment(name: String!): PrivateFile @deprecated(reason: "use property upload")

  """
  Fetch all attachments, optionally you can filter results by name; ex: sales_reports: attachments(name: "sales_report")
  """
  attachments(name: String): [PrivateFile!] @deprecated(reason: "use property upload")

  """
  timestamp of when the record was created, automatically generated by the system
  """
  created_at: JSONDate!
  customizable_id: ID @deprecated(reason: "Use property to store foreign keys")
  customizable_type: String @deprecated(reason: "Use property to store foreign keys")

  """
  timestamp of when the record was soft delete, populated by delete action. It
  is also possible to manually set it via update. To undelete change it back to
  empty value, but please note that associated records would need to be manually
  undeleted as well.
  """
  deleted_at: JSONDate

  """
  Used mainly for import/export, if you want to use third party service as a source of truth
  """
  external_id: ID

  """
  ID of an object.
  """
  id: ID

  """
  Fetch image by name; ex: header: image(name: "header")
  """
  image(name: String!): Image @deprecated(reason: "use property upload")

  """
  Fetch all images, optionally you can filter results by name; ex: cat_images: images(name: "cat")
  """
  images(name: String): [Image!] @deprecated(reason: "use property upload")

  """
  Defines has-one relation with other model, e.g: children: models(model_name:
  "child" join_on_property: "parent_id" foreign_property: "parent_id") { id }
  """
  model(
    filter: ModelsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with model-schema-name == model_name
    """
    model_name: [String]!
    sort: [ModelsSortInput!]
  ): Model @deprecated(reason: "use `related_record`")

  """
  ID of Model Schema to which it belongs
  """
  model_schema_id: ID! @deprecated(reason: "use table_id")

  """
  Name of the model schema to which it belongs
  """
  model_schema_name: String @deprecated(reason: "use table")

  """
  Defines has-many relation with other model; ex: children: models(model_name:
  "child", join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  models(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int

    """
    Joins model [formaly customization] with model-schema-name == model_name
    """
    model_name: [String]!
    sort: [ModelsSortInput!]
  ): [Model!] @deprecated(reason: "use `related_records`")

  """
  Name of the model schema
  """
  name: String @deprecated(reason: "use table")

  """
  List of all properties assigned to the object.
  """
  properties(select: [PropertiesFieldInput!]): HashObject

  """
  Fetch any property by name and return value as a String; ex: hair_color: property(name: "hair_color")
  """
  property(name: String!): String

  """
  Fetch any property by name and return value as an Array of Strings. ex: todo_list: property_array(name: "todo_list")
  """
  property_array(name: String!): [String!]

  """
  Fetch any property by name and return value as a Boolean; ex: price: property_boolean(name: "enabled")
  """
  property_boolean(name: String!): Boolean

  """
  Fetch any property by name and return value as a Float; ex: price: property_float(name: "price")
  """
  property_float(name: String!): Float

  """
  Fetch any property by name and return value as an Integer; ex: age: property_int(name: "age")
  """
  property_int(name: String!): Int

  """
  Fetch any property by name and return value as a JSON string.
  """
  property_json(name: String!): JSONPayload

  """
  Fetch any property by name, parse it as a JSON and return object
  """
  property_object(name: String!): HashObject

  """
  Fetch any property by name and returns upload details
  """
  property_upload(
    """
    Defines the number of seconds for which the generated url will be accessible. Must be set if acl was set to private
    """
    expires_in: Int
    name: String!
  ): PropertyUpload

  """
  Defines has-one relation with other model; ex: children: models(model_name:
  "child" join_on_property: "parent_id" foreign_property: "parent_id") { id }
  """
  related_model(
    filter: ModelsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with model-schema-name == model_schema_name
    """
    model_schema_name: [String]!
    sort: [ModelsSortInput!]
  ): Model @deprecated(reason: "use `related_record`")

  """
  Defines has-many relation with other model; ex: children:
  related_models(model_schema_name: "child", join_on_property: "parent_id",
  foreign_property: "parent_id") { id }
  """
  related_models(
    filter: ModelsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int

    """
    Joins model [formaly customization] with model-schema-name == model_schema_name
    """
    model_schema_name: [String]!
    sort: [ModelsSortInput!]
  ): [Model!] @deprecated(reason: "use `related_records`")

  """
  Defines relation with other user; ex: invited_by: related_user(join_on_property: "invited_by_id") { id }
  """
  related_user(
    filter: ModelsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    """
    join_on_property: String = "user_id"
    sort: [UsersSortInput!]
  ): User

  """
  Defines has-many relation with other user; ex: children:
  users(join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  related_users(
    filter: ModelsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int
    sort: [UsersSortInput!]
  ): [User!]

  """
  Name of the Table to which it belongs
  """
  table: String

  """
  ID of the Table to which it belongs
  """
  table_id: ID!

  """
  timestamp of when the record was updated, automatically generated by the system
  """
  updated_at: JSONDate!

  """
  Defines relation with other user; ex: invited_by: user(join_on_property: "invited_by_id") { id }
  """
  user(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    """
    join_on_property: String = "user_id"
    sort: [UsersSortInput!]
  ): User @deprecated(reason: "use `related_user`")

  """
  Id of the User who created and owns the Model
  """
  user_id: ID

  """
  Defines has-many relation with other user; ex: children:
  users(join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  users(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int
    sort: [UsersSortInput!]
  ): [User!] @deprecated(reason: "use `related_users`")
}

type ModelCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [Model!]
  total_entries: Int!
  total_pages: Int!
}

input ModelPropertyInput {
  model_schema_name: String!
  property_name: String!
}

"""
Schema for model (old CustomModelType)
"""
type ModelSchema implements AdminPropertiesInterface & AdminSharedAttributesInterface {
  created_at: JSONDate!

  """
  Deprecated, use properties instead.
  """
  fields: [Property!]! @deprecated(reason: "Use properties")
  id: ID!
  metadata: HashObject
  name: String!
  parameterized_name: String!

  """
  defines the physical path of the file
  """
  physical_file_path: String

  """
  List of properties attributes to be included in the results
  """
  properties: [Property!]!
  updated_at: JSONDate!
}

type ModelSchemaCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [ModelSchema!]
  total_entries: Int!
  total_pages: Int!
}

input ModelSchemaInputType {
  """
  deprecated, use properties
  """
  fields: [NestedPropertyInputType]
  metadata: HashObject

  """
  deprecated - derived from physical_file_path
  """
  name: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/custom_model_types/my_model
  """
  physical_file_path: String!
  properties: [NestedPropertyInputType]
}

input ModelSchemasFilterInput {
  created_at: DateFilter
  id: UniqIdFilter

  """
  Filter by metadata properties
  """
  metadata: [JsonbFilter!]
  name: StringFilter
  or: [ModelSchemasFilterInput!]
  parameterized_name: StringFilter
  physical_file_path: StringFilter
  updated_at: DateFilter
}

input ModelSchemasSortInput {
  created_at: StandardSort
  id: StandardSort
  metadata: [JsonbSort!]
  name: StandardSort
  parameterized_name: StandardSort
  physical_file_path: StandardSort
  updated_at: StandardSort
}

input ModelUpdate {
  addresses: [AddressImport!]
  attachments: [AttachmentsImport!]
  created_at: ISO8601DateTime
  customizable_id: ID
  customizable_type: CustomizableTypeEnum

  """
  ID must match existing object id
  """
  id: ID!
  images: [ImagesImport!]

  """
  ex. {"color": "red"}
  """
  properties: HashObject
  type_name: String!
  updated_at: ISO8601DateTime
  user_id: ID
}

input ModelsFilterInput {
  created_at: DateFilter
  deleted_at: DateFilter
  external_id: StringFilter
  id: UniqIdFilter
  model_schema_id: UniqIdFilter
  model_schema_name: StringFilter

  """
  deprecated, use `related_models`
  """
  models: [RelatedModelsFilterInput!]

  """
  Deprecated, use model_schema_name
  """
  name: StringFilter

  """
  join arguments with OR operator
  """
  or: [ModelsFilterInput!]
  properties: [PropertyFilterInput!]

  """
  filter by related models
  """
  related_models: [RelatedModelsFilterInput!]
  related_users: [RelatedUsersFilterInput!]
  updated_at: DateFilter
  user_id: UniqIdFilter

  """
  deprecated, use `related_users`
  """
  users: [RelatedUsersFilterInput!]
}

input ModelsSortInput {
  created_at: StandardSort
  deleted_at: StandardSort
  external_id: StandardSort
  id: StandardSort
  model_schema_id: StandardSort
  properties: [PropertySort!]
  random_sort: Boolean
  updated_at: StandardSort
}

input MutationAssetsFilterInput {
  created_at: DateFilter
  deleted_at: DateFilter
  id: UniqIdFilter

  """
  Filter by metadata properties
  """
  metadata: JsonbFilter
  name: StringFilter
  physical_file_path: StringFilter
  updated_at: DateFilter
}

input NestedCustomizationFilters {
  created_at: DateRange
  id: ID
  ids: [ID]
  ignore_deleted: Boolean = true
  is_deleted: Boolean

  """
  Name of the Model Schema
  """
  name: String
  properties: [QueryCustomAttribute]
  user_id: ID
  user_ids: [ID]
}

input NestedPropertyInputType {
  """
  provide 1 if property you want to remove property, 0 otherwise
  """
  _destroy: String

  """
  Type of the property
  """
  attribute_type: PropertyTypeEnum = string

  """
  Defines a relationship with other model schema or the user schema. Used during importing/exporting data.
  """
  belongs_to: String

  """
  Default value for new objects
  """
  default_value: String

  """
  id of the property to update
  """
  id: ID
  metadata: HashObject

  """
  Name of the property
  """
  name: String!

  """
  Provides options for type upload - defines for exmple whether newly upload file should be public etc
  """
  options: PropertyUploadOptionsInput
}

input NewCustomImageInputType {
  custom_attribute_name: String!

  """
  URL to image that was uploaded to s3 presigned url
  """
  direct_url: String
  owner_id: ID!

  """
  valid values: Customization, User, UserProfile
  """
  owner_type: String!

  """
  deprecated
  """
  page_slug: String

  """
  deprecated, use direct_url which is generated via image_presign_url mutation
  """
  raw_remote_image_url: String
  uploader_id: ID
}

"""
Autogenerated return type of NotificationSendEmail.
"""
type NotificationSendEmailPayload {
  errors: [BaseError!]! @deprecated(reason: "Not needed")
  is_scheduled_to_send: Boolean!
}

input NotificationTemplateInput {
  """
  Name of the template
  """
  name: String!
}

enum NotificationTypeEnum {
  API_CALL
  EMAIL
  SMS
}

input NotificationTypeFilter {
  not_value: NotificationTypeEnum
  not_value_in: [NotificationTypeEnum!]
  value: NotificationTypeEnum
  value_in: [NotificationTypeEnum!]
}

type ObjectCount {
  count: Int!
}

enum OperatorEnum {
  """
  all values should match
  """
  AND

  """
  any value should match
  """
  OR
}

type Otp {
  current_code: String!
  secret: String!

  """
  SVG from QRcode
  """
  secret_as_svg_qr_code(issuer: String, label: String): String!
}

"""
Page
"""
type Page implements AdminSharedAttributesInterface {
  """
  associated authorization policies
  """
  authorization_policies: [AuthorizationPolicy!]

  """
  Content provider by the develop, can be markdown, can be html with liquid etc.
  """
  content: String

  """
  specfic timestamp of when the content was updated last time, useful for cache
  """
  content_updated_at: JSONDate!
  created_at: JSONDate!
  deleted_at: JSONDate

  """
  the number of seconds for which this page will be cached; set
  dynamic_cache_layout accordingly to your scenario. Triggers authorization. Use
  only if cache_key cannot be easily determined (for example for search results page)
  """
  dynamic_cache_expire: Int

  """
  liquid which evaluates to the cache key, for example {{ context.page.slug
  }}/{{ context.params.slug2 }}for page with slug "abc" will cache separately
  /abc/1 and /abc/2, however abc/1/1 will return the same value as abc/1/2. If
  left blank, the full url will be used.
  """
  dynamic_cache_key: String

  """
  defines whether layout should be cached as well, or only page. Usually it is
  not possible to cache layout due to dynamic data in it, like name of a logged
  in user, hence default is false.
  """
  dynamic_cache_layout: Boolean
  format: PageFormat
  handler: PageHandler

  """
  Evaluated html content, especially useful if content was provided as markdown
  """
  html_content: String
  id: ID!
  layout: String
  layout_name: String @deprecated(reason: "use layout")

  """
  max nesting of the url to be resolved by this slug. For example slug "abc"
  with max_deep_level 2 will resolve /abc, abc/1, abc/2, but will NOT resolve
  abc/2/something.
  """
  max_deep_level: Int
  metadata: HashObject

  """
  defines the physical path of the file
  """
  physical_file_path: String
  redirect_code: Int
  redirect_to: String
  request_method: PageRequestMethod
  response_headers: HashObject
  searchable: Boolean
  slug: String!

  """
  the number of seconds for which this page will be cached as a static html
  page; works only for not logged in users, skips any authorization
  """
  static_cache_expire: Int
  updated_at: JSONDate!
}

type PageCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [Page!]
  total_entries: Int!
  total_pages: Int!
}

input PageFilterInput {
  """
  Filter by authorization policies, ex. authorization_policies: { value_in: ["page_protection", "check_user"] }
  """
  authorization_policies: AuthorizationPoliciesFilter

  """
  Search for text in rendered page content. Page must be marked as searchable
  """
  content: StringFilter
  content_updated_at: DateFilter
  created_at: DateFilter
  deleted_at: DateFilter

  """
  Filter by format, ex. format: { value: HTML }
  """
  format: PageFormatFilter
  id: UniqIdFilter
  layout: StringFilter

  """
  Deprecated - use layout
  """
  layout_name: StringFilter

  """
  Filter by metadata properties
  """
  metadata: [JsonbFilter!]

  """
  join arguments with OR operator
  """
  or: [PageFilterInput!]
  physical_file_path: StringFilter
  redirect_code: IntegerFilter
  redirect_to: StringFilter
  searchable: BooleanFilter

  """
  Filter by slug. Enter slug without leading /, ex. slug: { exact: "client/orders" }
  """
  slug: StringFilter
  updated_at: DateFilter
}

enum PageFormat {
  """
  css
  """
  css

  """
  csv
  """
  csv

  """
  html
  """
  html

  """
  ics
  """
  ics

  """
  js
  """
  js

  """
  json
  """
  json

  """
  pdf
  """
  pdf

  """
  rss
  """
  rss

  """
  svg
  """
  svg

  """
  text
  """
  text

  """
  txt
  """
  txt

  """
  xml
  """
  xml
}

input PageFormatFilter {
  not_value: PageFormat
  not_value_in: [PageFormat!]
  value: PageFormat
  value_in: [PageFormat!]
}

enum PageHandler {
  """
  liquid
  """
  liquid

  """
  markdown
  """
  markdown
}

input PageInputType {
  """
  ids of authorization policies which should be checked
  """
  authorization_policy_ids: [ID]
  content: String
  dynamic_cache_expire: Int
  dynamic_cache_key: String
  dynamic_cache_layout: Boolean = false
  format: PageFormat = html
  handler: PageHandler = liquid

  """
  name of the liquid layout to which the content should be injected
  """
  layout: String

  """
  deprecated, use layout
  """
  layout_name: String

  """
  max nesting of the url to be resolved by this slug. For example slug "abc"
  with max_deep_level 2 will resolve /abc, abc/1, abc/2, but will NOT resolve
  abc/2/something.
  """
  max_deep_level: Int = 3
  metadata: HashObject

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/views/pages/my-page
  """
  physical_file_path: String!
  redirect_code: PageRedifectCode
  redirect_to: String
  request_method: PageRequestMethod = get
  response_headers: HashObject
  searchable: Boolean = false

  """
  defines the url at which the page will be available, for example if you want
  the page to be available at https://example.com/hello/world set the slug to
  hello/world. If blank, slug will be derived from physical_file_path, in this
  example set physical_file_path to views/pages/hello/world.html.liquid
  """
  slug: String
  static_cache_expire: Int
}

enum PageRedifectCode {
  """
  301 Moved Permanently
  """
  MOVED_PERMANENTLY

  """
  302 Moved Temporarily
  """
  MOVED_TEMPORARILY
}

enum PageRequestMethod {
  """
  delete
  """
  delete

  """
  get
  """
  get

  """
  options
  """
  options

  """
  patch
  """
  patch

  """
  post
  """
  post

  """
  put
  """
  put
}

input PagesSortInput {
  content_updated_at: StandardSort
  created_at: StandardSort
  id: StandardSort
  metadata: [JsonbSort!]
  physical_file_path: StandardSort
  redirect_code: StandardSort
  redirect_to: StandardSort
  slug: StandardSort
  updated_at: StandardSort
}

"""
Represents data defined by platformOS stored in context.params variable.
"""
scalar ParamsObject

input PresignUrl {
  """
  ACL for the uploaded file
  """
  acl: ACL = null

  """
  Size range for the uploaded file
  """
  content_length: ContentLength = null

  """
  Content type for the uploaded file
  """
  content_type: Content = null
}

input PresignUrlInput {
  """
  defines whether it is a public file that anyone who knows the url can access
  it, or if its private and even with the known URL it is not possible to see
  the file without a signature.
  """
  acl: ACL = public
  content_disposition: String = "inline"

  """
  file size limitation in KiB. ex. [gte: 1, lte: 1024] allows file size from 1KiB to 1 MiB 
  """
  content_length: ContentLengthRange
  type: UploadType = image

  """
  if image is uploaded, multiple versions of it will be generated automatically
  """
  versions: [VersionInput!]
}

type PresignedUploadUrl {
  """
  Direct s3 upload endpoint to which you can upload files. Make sure you include upload_url_payload with the request
  """
  upload_url: String!

  """
  Payload you need to provide for upload_url
  """
  upload_url_payload: HashObject!
}

type PresignedUrl {
  """
  URL to CDN with your file. Will be available once you upload file
  """
  access_url: String!
  path: String!

  """
  Presigned URL where you should upload file
  """
  upload_url: String!
}

type PrivateFile {
  content_type: String
  created_at: JSONDate
  file_name: String
  id: ID
  name: String
  size_bytes: Int
  url(
    """
    Number of seconds before presigned URL expires. Max value is one week (604800)
    """
    expires_in: Int = 900
  ): String
}

input ProcessPageInputType {
  """
  Parameters you would like to pass to the page to render it dynamically. They will beavailable via context.params. 
  """
  params: HashObject

  """
  Slug of the page which you would like to use as a template
  """
  slug: String!
}

enum ProcessStrategy {
  """
  pdf - body should be html to be converted to pdf
  """
  pdf

  """
  text - choose it for things like csv, json, xml, plain text etc.
  """
  text
}

input ProcessStrategyInputType {
  """
  Expected content depends on strategy, however usually it is text, html, csv,
  json, xml etc.Alternativey you can process page via page argument.
  """
  body: String

  """
  Name of the output file
  """
  file_name: String!

  """
  Provided page will be rendered and its output will be used as a body.
  Alternatively you can pass body directly via body argument
  """
  page: ProcessPageInputType
  strategy: ProcessStrategy!

  """
  if you set to true and strategy requires asynchronous processing by us (like
  pdf generation) then the mutation will wait until the file is actually
  generated so you can for example attach it to an email
  """
  synchronous: Boolean = false
}

"""
A profile
"""
type Profile implements HasModelsInterface & HasRecordsInterface & LegacyCustomAttributeInterface & PropertiesInterface & RemoteRecordsInterface & RemoteUsersInterface {
  """
  Fetch address by name; ex: address: address(name: "office_address")
  """
  address(name: String!): CustomAddrress @deprecated(reason: "use your own model for address if needed")

  """
  Fetch all addresses, optionally you can filter results by name; ex: home_address: addresses(name: "home")
  """
  addresses(name: String): [CustomAddrress!] @deprecated(reason: "use your own model for address if needed")

  """
  Fetch attachment by name; ex: sales_report: attachment(name: "sales_report")
  """
  attachment(name: String!): PrivateFile @deprecated(reason: "use property upload")

  """
  Fetch all attachments, optionally you can filter results by name; ex: sales_reports: attachments(name: "sales_report")
  """
  attachments(name: String): [PrivateFile!] @deprecated(reason: "use property upload")

  """
  Fetch address by name; ex: address: custom_address(name: "office_address")
  """
  custom_address(name: String!): CustomAddrress @deprecated(reason: "Use address")

  """
  Fetch all addresses, optionaly you can filter results by name; ex: home: custom_addresses(name: "home")
  """
  custom_addresses(name: String): [CustomAddrress!] @deprecated(reason: "Use addresses")

  """
  Fetch attachment by name; ex: sales_report: custom_attachment(name: "sales_report")
  """
  custom_attachment(name: String!): PrivateFile @deprecated(reason: "Use attachment")

  """
  Fetch all attachments, optionally you can filter results by name; ex:
  sales_reports: custom_attachments(name: "sales_report")
  """
  custom_attachments(name: String): [PrivateFile!] @deprecated(reason: "Use attachments")

  """
  Fetch image by name; ex: header: custom_image(name: "header")
  """
  custom_image(name: String!): Image @deprecated(reason: "Use image")

  """
  Fetch all images, optionaly you can filter results by name; ex: cat_images: custom_images(name: "cat")
  """
  custom_images(name: String): [Image!] @deprecated(reason: "Use images")
  customizations(customizable_id: ID, customizable_type: String, id: [ID], name: String, properties: [QueryCustomAttribute], sort: [CustomizationSortOrder], user_id: ID): [Customization!]

  """
  timestamp of when the record was soft delete, populated by delete action. It
  is also possible to manually set it via update. To undelete change it back to
  empty value, but please note that associated records would need to be manually
  undeleted as well.
  """
  deleted_at: JSONDate

  """
  ID of an object.
  """
  id: ID

  """
  Fetch image by name; ex: header: image(name: "header")
  """
  image(name: String!): Image @deprecated(reason: "use property upload")

  """
  Fetch all images, optionally you can filter results by name; ex: cat_images: images(name: "cat")
  """
  images(name: String): [Image!] @deprecated(reason: "use property upload")

  """
  Defines has-one relation with other model, e.g: children: models(model_name:
  "child" join_on_property: "parent_id" foreign_property: "parent_id") { id }
  """
  model(
    filter: ModelsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with model-schema-name == model_name
    """
    model_name: [String]!
    sort: [ModelsSortInput!]
  ): Model @deprecated(reason: "use `related_record`")

  """
  Defines has-many relation with other model; ex: children: models(model_name:
  "child", join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  models(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int

    """
    Joins model [formaly customization] with model-schema-name == model_name
    """
    model_name: [String]!
    sort: [ModelsSortInput!]
  ): [Model!] @deprecated(reason: "use `related_records`")
  profile_type: String!

  """
  List of all properties assigned to the object.
  """
  properties(select: [PropertiesFieldInput!]): HashObject

  """
  Fetch any property by name and return value as a String; ex: hair_color: property(name: "hair_color")
  """
  property(name: String!): String

  """
  Fetch any property by name and return value as an Array of Strings. ex: todo_list: property_array(name: "todo_list")
  """
  property_array(name: String!): [String!]

  """
  Fetch any property by name and return value as a Boolean; ex: price: property_boolean(name: "enabled")
  """
  property_boolean(name: String!): Boolean

  """
  Fetch any property by name and return value as a Float; ex: price: property_float(name: "price")
  """
  property_float(name: String!): Float

  """
  Fetch any property by name and return value as an Integer; ex: age: property_int(name: "age")
  """
  property_int(name: String!): Int

  """
  Fetch any property by name and return value as a JSON string.
  """
  property_json(name: String!): JSONPayload

  """
  Fetch any property by name, parse it as a JSON and return object
  """
  property_object(name: String!): HashObject

  """
  Fetch any property by name and returns upload details
  """
  property_upload(
    """
    Defines the number of seconds for which the generated url will be accessible. Must be set if acl was set to private
    """
    expires_in: Int
    name: String!
  ): PropertyUpload

  """
  Defines has-one relation with other model; ex: children: models(model_name:
  "child" join_on_property: "parent_id" foreign_property: "parent_id") { id }
  """
  related_model(
    filter: ModelsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with model-schema-name == model_schema_name
    """
    model_schema_name: [String]!
    sort: [ModelsSortInput!]
  ): Model @deprecated(reason: "use `related_record`")

  """
  Defines has-many relation with other model; ex: children:
  related_models(model_schema_name: "child", join_on_property: "parent_id",
  foreign_property: "parent_id") { id }
  """
  related_models(
    filter: ModelsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int

    """
    Joins model [formaly customization] with model-schema-name == model_schema_name
    """
    model_schema_name: [String]!
    sort: [ModelsSortInput!]
  ): [Model!] @deprecated(reason: "use `related_records`")

  """
  Defines has-one relation with other record; ex: children: records(table:
  "child" join_on_property: "parent_id" foreign_property: "parent_id") { id }
  """
  related_record(
    filter: RecordsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    sort: [RecordsSortInput!]

    """
    Joins record [formaly customization] with record-schema-name == table
    """
    table: [String]!
  ): Record

  """
  Defines has-many relation with other records; ex: children:
  related_records(table: "children", join_on_property: "parent_id",
  foreign_property: "parent_id") { id }
  """
  related_records(
    filter: RecordsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int
    sort: [RecordsSortInput!]

    """
    Define table name which should be used as a source for related records
    """
    table: [String]!
  ): [Record!]

  """
  Defines relation with other user; ex: invited_by: related_user(join_on_property: "invited_by_id") { id }
  """
  related_user(
    filter: ModelsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    """
    join_on_property: String = "user_id"
    sort: [UsersSortInput!]
  ): User

  """
  Defines has-many relation with other user; ex: children:
  users(join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  related_users(
    filter: ModelsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int
    sort: [UsersSortInput!]
  ): [User!]

  """
  Defines relation object accessible over HTTP in JSON collection identified by it's ID.
  """
  remote_records(
    """
    Endpoint that will return resources for given ids in json format
    """
    endpoint: Endpoint!

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String!
  ): [Record!]

  """
  Defines relation object accessible over HTTP in JSON collection identified by it's ID.
  """
  remote_users(
    """
    Endpoint that will return resources for given ids in json format
    """
    endpoint: Endpoint!

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String!
  ): [User!]

  """
  Defines relation with other user; ex: invited_by: user(join_on_property: "invited_by_id") { id }
  """
  user(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    """
    join_on_property: String = "user_id"
    sort: [UsersSortInput!]
  ): User @deprecated(reason: "use `related_user`")

  """
  Defines has-many relation with other user; ex: children:
  users(join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  users(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int
    sort: [UsersSortInput!]
  ): [User!] @deprecated(reason: "use `related_users`")
}

input ProfileFilterInput {
  """
  Name of the user profile type
  """
  name: String

  """
  Name of the user profile type
  """
  name_filter: StringFilter
  properties: [PropertyFilterInput!]
}

input PropertiesFieldInput {
  attribute_type: SelectPropertyTypeEnum!
  name: String!
}

interface PropertiesInterface {
  """
  Fetch address by name; ex: address: address(name: "office_address")
  """
  address(name: String!): CustomAddrress @deprecated(reason: "use your own model for address if needed")

  """
  Fetch all addresses, optionally you can filter results by name; ex: home_address: addresses(name: "home")
  """
  addresses(name: String): [CustomAddrress!] @deprecated(reason: "use your own model for address if needed")

  """
  Fetch attachment by name; ex: sales_report: attachment(name: "sales_report")
  """
  attachment(name: String!): PrivateFile @deprecated(reason: "use property upload")

  """
  Fetch all attachments, optionally you can filter results by name; ex: sales_reports: attachments(name: "sales_report")
  """
  attachments(name: String): [PrivateFile!] @deprecated(reason: "use property upload")

  """
  ID of an object.
  """
  id: ID

  """
  Fetch image by name; ex: header: image(name: "header")
  """
  image(name: String!): Image @deprecated(reason: "use property upload")

  """
  Fetch all images, optionally you can filter results by name; ex: cat_images: images(name: "cat")
  """
  images(name: String): [Image!] @deprecated(reason: "use property upload")

  """
  List of all properties assigned to the object.
  """
  properties(select: [PropertiesFieldInput!]): HashObject

  """
  Fetch any property by name and return value as a String; ex: hair_color: property(name: "hair_color")
  """
  property(name: String!): String

  """
  Fetch any property by name and return value as an Array of Strings. ex: todo_list: property_array(name: "todo_list")
  """
  property_array(name: String!): [String!]

  """
  Fetch any property by name and return value as a Boolean; ex: price: property_boolean(name: "enabled")
  """
  property_boolean(name: String!): Boolean

  """
  Fetch any property by name and return value as a Float; ex: price: property_float(name: "price")
  """
  property_float(name: String!): Float

  """
  Fetch any property by name and return value as an Integer; ex: age: property_int(name: "age")
  """
  property_int(name: String!): Int

  """
  Fetch any property by name and return value as a JSON string.
  """
  property_json(name: String!): JSONPayload

  """
  Fetch any property by name, parse it as a JSON and return object
  """
  property_object(name: String!): HashObject

  """
  Fetch any property by name and returns upload details
  """
  property_upload(
    """
    Defines the number of seconds for which the generated url will be accessible. Must be set if acl was set to private
    """
    expires_in: Int
    name: String!
  ): PropertyUpload
}

scalar PropertiesObject

"""
Property definition
"""
type Property implements AdminSharedAttributesInterface {
  """
  Type of the property
  """
  attribute_type: PropertyTypeEnum!

  """
  Defines a relationship with other model schema or the user schema. Used during importing/exporting data.
  """
  belongs_to: String
  created_at: JSONDate!

  """
  Default value for new objects
  """
  default_value: String
  id: ID!
  metadata: HashObject

  """
  Name of the property
  """
  name: String!

  """
  Options, used only by type upload
  """
  options: HashObject

  """
  defines the physical path of the file
  """
  physical_file_path: String

  """
  Id of the schema to which this property definition belongs
  """
  target_id: ID!

  """
  Type of the schema to which this property definition belongs
  """
  target_type: String!
  updated_at: JSONDate!
}

input PropertyFilterInput {
  """
  allow empty values
  """
  allow_empty: Boolean

  """
  selects records for which the property of type Array contains all of the provided elements
  """
  array_contains: [String!]

  """
  selects records for which the property of type Array contains at least one of the provided elements
  """
  array_overlaps: [String!]

  """
  selects records where the property of type String contains the provided string as a sub-string (case insensitive)
  """
  contains: String

  """
  select records for which a distance between its point from <:property> and <:center> point is less than <:distance>.
  """
  distance_sphere: GeoPropertyFilterInput

  """
  selects records for which the property of type String ends with the provided argument (case insensitive)
  """
  ends_with: String

  """
  if argument is true, selects records for which the property exists and is not
  null; if argument is false, selects records for which the property doesn't
  exist or is null
  """
  exists: Boolean

  """
  name of the property
  """
  name: String!

  """
  selects records for which the property of type Array may contain some, but not all of the provided elements
  """
  not_array_contains: [String!]

  """
  selects records for which the property of type Array doesn't have any element
  in common with the provided array of elements
  """
  not_array_overlaps: [String!]

  """
  selects records where the property of type String does not contain the provided string as a sub-string (case insensitive)
  """
  not_contains: String

  """
  selects records for which the property of type String does not end with the provided argument (case insensitive)
  """
  not_ends_with: String

  """
  selects records for which the property of type String does not start with the provided argument (case insensitive)
  """
  not_starts_with: String

  """
  property specified by name should have a value that is different from the value provided
  """
  not_value: String

  """
  selects records for which the property of type Array is not equal to the provided value
  """
  not_value_array: [String!]

  """
  property specified by name should be different from the value provided
  """
  not_value_boolean: Boolean

  """
  property specified by name should different from the value provided
  """
  not_value_float: Float

  """
  selects records for which the property is not included as a sub-array or is not an element of the provided Array argument
  """
  not_value_in: [String!]

  """
  property specified by name should be equal different from the value provided
  """
  not_value_int: Int

  """
  select records for which a <:point> is not within <:radius_in_km_from_property> km distance from its <:property> point
  """
  not_within_radius: GeoRadiusPropertyFilterInput

  """
  specifies the type of the property if it can't be determined automatically
  """
  property_type: String

  """
  selects records for which the property value is inside the given range; range
  options that can be given are lt (lower than), lte (lower than or equal), gt
  (greater than), gte (greater than or equal)
  """
  range: RangeFilter

  """
  selects records for which the property of type String starts with the provided argument (case insensitive)
  """
  starts_with: String

  """
  property specified by name should have a value that is equal to the value provided
  """
  value: String

  """
  selects records for which the property of type Array is equal to the provided value
  """
  value_array: [String!]

  """
  property specified by name should be equal to the value provided
  """
  value_boolean: Boolean

  """
  property specified by name should be equal to the value provided
  """
  value_float: Float

  """
  selects records for which the property is included as a sub-array or is an element of the provided Array argument
  """
  value_in: [String!]

  """
  property specified by name should be equal to the value provided
  """
  value_int: Int

  """
  select records for which a <:point> is within <:radius_in_km_from_property> km distance from its <:property> point
  """
  within_radius: GeoRadiusPropertyFilterInput
}

input PropertyInputType {
  """
  Adds provided value at the end of an array property. It's secure atomic operation executed in separate transaction
  """
  array_append: String

  """
  Removes provided value from an array property. It's secure atomic operation executed in separate transaction
  """
  array_remove: String

  """
  Decrements property value by provided value. It's secure atomic operation executed in separate transaction
  """
  decrement: Float

  """
  Increments property value by provided value. It's secure atomic operation executed in separate transaction
  """
  increment: Float
  name: String!
  value: String
  value_array: [String]
  value_boolean: Boolean
  value_float: Float
  value_int: Int
  value_json: JSONPayload
  value_upload: ValueUploadInput
}

"""
Model Property Name
"""
scalar PropertyName

input PropertySort {
  name: String!
  order: SortOrderEnum!
}

enum PropertyTargetType {
  """
  ModelSchema
  """
  ModelSchema
  User
  UserProfileSchema
}

enum PropertyTypeEnum {
  """
  address
  """
  address

  """
  array of strings, will be deprecated in the future as current implementation prevents arrays of other types
  """
  array

  """
  binary
  """
  binary

  """
  boolean
  """
  boolean

  """
  date
  """
  date

  """
  datetime
  """
  datetime

  """
  decimal
  """
  decimal

  """
  file
  """
  file

  """
  float
  """
  float

  """
  geojson
  """
  geojson

  """
  integer
  """
  integer

  """
  photo
  """
  photo

  """
  string
  """
  string

  """
  deprecated, please use string
  """
  text

  """
  time
  """
  time

  """
  upload
  """
  upload
}

type PropertyUpload {
  """
  extension extracted from the url, downcased; for example jpg, pdf etc.
  """
  extension: String

  """
  file name extracted from the url
  """
  file_name: String

  """
  url pointing to the file in CDN
  """
  url: String

  """
  hash where key is a version name and value is the url to the cdn; populated if
  the upload file is an image and versions were specified
  """
  versions(
    """
    specified only those versions which you want to be returned
    """
    names: [String!]
  ): HashObject
}

enum PropertyUploadACL {
  private
  public
}

enum PropertyUploadContentDisposition {
  attachment
  inline
}

input PropertyUploadContentLengthInput {
  gte: Int = 0
  lte: Int!
}

input PropertyUploadEncryptionGPGInput {
  """
  Create ASCII armored output.  The default is to create the binary OpenPGP format.
  """
  armor: Boolean

  """
  Public key to be used to encrypt the file
  """
  key: GPGKey!
}

input PropertyUploadEncryptionInput {
  """
  Encrypt using GnuPG Public Key
  """
  gpg: PropertyUploadEncryptionGPGInput
}

enum PropertyUploadFit {
  """
  Embed within both provided dimensions.
  """
  contain

  """
  Crop to cover both provided dimensions
  """
  cover

  """
  Ignore the aspect ratio of the input and stretch to both provided dimensions.
  """
  fill

  """
  Preserving aspect ratio, resize the image to be as large as possible while
  ensuring its dimensions are less than or equal to both those specified.
  """
  inside

  """
  Preserving aspect ratio, resize the image to be as small as possible while
  ensuring its dimensions are greater than or equal to both those specified.
  Some of these values are based on the object-fit CSS property.
  """
  outside
}

enum PropertyUploadFormat {
  avif
  jpeg
  png
  webp
}

input PropertyUploadManipulateInput {
  """
  value representing the sigma of the Gaussian mask, where sigma = 1 + radius / 2
  """
  blur: ImageBlur

  """
  color for flatten
  """
  flatten: CssColor = "#000000"

  """
  Convert to 8-bit greyscale; 256 shades of grey.
  """
  greyscale: Boolean = false
}

input PropertyUploadOptionsInput {
  acl: PropertyUploadACL = public
  cache_control: String = "max-age=315576000, public"
  content_disposition: PropertyUploadContentDisposition = inline

  """
  file size limitation in KiB. ex. [gte: 1, lte: 1024] allows file size from 1KiB to 1 MiB 
  """
  content_length: PropertyUploadContentLengthInput

  """
  defines a version of the uploaded image - for example you might want to resize
  it for performance reason, compress etc. Max number of versions is 10
  """
  versions: [PropertyUploadVersionInput!]
}

input PropertyUploadOutputInput {
  format: PropertyUploadFormat

  """
  Defines the quality of the image; used to automatically compress the image; 0
  - lowest quality, 100 - highest quality. Defaults: PNG: 80, WEBP: 80, JPEG: 85, AVIF: 60
  """
  quality: ImageQuality
}

enum PropertyUploadPosition {
  bottom
  center
  left
  left_bottom
  left_top
  right
  right_bottom
  right_top
  top
}

type PropertyUploadPresignedUrl {
  """
  Direct s3 upload endpoint to which you can upload files. Make sure you include upload_url_payload with the request
  """
  upload_url: String

  """
  Payload you need to provide for upload_url
  """
  upload_url_payload: HashObject
}

input PropertyUploadResizeInput {
  """
  background color when using a fit of containDefault: #000000
  """
  background: CssColor
  fit: PropertyUploadFit = cover

  """
  max height of an image. If left undefined, will depend on other parameters to determine size (like: width)
  """
  height: Int

  """
  position to use when fit is cover or contain
  """
  position: PropertyUploadPosition

  """
  max width of an image. If left undefined, will depend on other parameters to determine size (like: height) 
  """
  width: Int

  """
  do not enlarge if the width or height are already less than the specified dimensions
  """
  without_enlargement: Boolean = false
}

input PropertyUploadVersionInput {
  manipulate: PropertyUploadManipulateInput

  """
  name of the version, for example thumb
  """
  name: String!
  output: PropertyUploadOutputInput
  resize: PropertyUploadResizeInput
}

input Query {
  fields: [FullTextQueryField]

  """
  Accept wildcards, ? for single character, * for more
  """
  keyword: String
  match_type: QueryMatchTypeEnum = EXACT
  operator: OperatorEnum = AND
  properties: [FullTextQueryField]

  """
  Search all fields as raw.
  """
  raw: Boolean
}

input QueryAssetsFilterInput {
  content_type: StringFilter
  created_at: DateFilter
  deleted_at: DateFilter
  file_size: RangeFilter
  id: UniqIdFilter

  """
  Filter by metadata properties
  """
  metadata: [JsonbFilter!]
  name: StringFilter
  or: [QueryAssetsFilterInput!]
  physical_file_path: StringFilter
  updated_at: DateFilter
}

input QueryCustomAttribute {
  """
  Set it when you want to exclude value/values/range from results
  """
  exclude: Boolean = false
  exists: Boolean
  name: String!
  range: Range
  value: String
  values: [String]
  values_operator: OperatorEnum = OR
}

input QueryCustomModelType {
  id: Int
  ids: [Int]
  name: String
  names: [String]
}

input QueryCustomization {
  addresses: [QueryListingLocation]
  id: ID
  name: String
  parameterized_name: String

  """
  Need to narrow profiles by profile_type
  """
  properties: [QueryCustomAttribute]
  user_id: ID
}

input QueryListing {
  addresses: [QueryListingLocation]
  created_at: DateRange
  creator: QueryUser
  creator_id: ID
  creator_ids: [ID]
  custom_attributes: [QueryCustomAttribute]
  customizations: [QueryCustomization]
  external_id: ID
  external_ids: [ID]
  has_creator: Boolean
  id: ID
  ids: [ID]
  is_deleted: Boolean
  name: String
  properties: [QueryCustomAttribute]
  slug: String
  transactable_type: QueryTransactableType

  """
  do not use this please
  """
  without_ids: [ID]
}

input QueryListingLocation {
  cities: [String]
  city: String
  country: String
  exists: Boolean

  """
  Geo search
  """
  geo_query: GeoQuery
  postcode: String
  state: String
  street: String
  suburb: String
}

"""
Match types for keyword
"""
enum QueryMatchTypeEnum {
  """
  Match any characters on start and end *foo*
  """
  CONTAINS

  """
  Match any characters on start *foo
  """
  ENDS_WITH

  """
  Match whole words
  """
  EXACT

  """
  Match and allow typo. Keywodr -> Keyword
  """
  FUZZY

  """
  Match any characters on end foo*
  """
  STARTS_WITH
}

input QueryModelSchema {
  id: Int
  ids: [Int]
  name: String
  names: [String]
}

input QueryTransactableType {
  id: Int
  ids: [Int]
  name: String
  names: [String]
}

input QueryUser {
  created_at: DateRange
  customizations: [QueryCustomization]
  email: String
  emails: [String]
  external_id: ID
  externals_id: [ID]
  first_name: String
  id: ID
  ids: [ID]
  is_deleted: Boolean = false
  last_name: String
  middle_name: String
  name: String
  profiles: [QueryUserProfile]
  slug: String
  without_ids: [ID]
}

input QueryUserProfile {
  addresses: [QueryListingLocation]
  custom_attributes: [QueryCustomAttribute]
  customizations: [QueryCustomization]

  """
  Geo search based on searchable custom_addresses
  """
  geo_query: GeoQuery
  is_deleted: Boolean

  """
  Name of the user profile type
  """
  name: String

  """
  Alias for name argument
  """
  profile_type: String

  """
  Need to narrow profiles by profile_type
  """
  properties: [QueryCustomAttribute]
}

input Range {
  gt: String
  gte: String
  lt: String
  lte: String
}

input RangeFilter {
  gt: String
  gte: String
  lt: String
  lte: String
}

type Record implements HasRecordsInterface & HasUsersInterface & PropertiesInterface & RemoteRecordsInterface & RemoteUsersInterface {
  """
  Fetch address by name; ex: address: address(name: "office_address")
  """
  address(name: String!): CustomAddrress @deprecated(reason: "use your own model for address if needed")

  """
  Fetch all addresses, optionally you can filter results by name; ex: home_address: addresses(name: "home")
  """
  addresses(name: String): [CustomAddrress!] @deprecated(reason: "use your own model for address if needed")

  """
  Fetch attachment by name; ex: sales_report: attachment(name: "sales_report")
  """
  attachment(name: String!): PrivateFile @deprecated(reason: "use property upload")

  """
  Fetch all attachments, optionally you can filter results by name; ex: sales_reports: attachments(name: "sales_report")
  """
  attachments(name: String): [PrivateFile!] @deprecated(reason: "use property upload")

  """
  timestamp of when the record was created, automatically generated by the system
  """
  created_at: JSONDate!

  """
  timestamp of when the record was soft delete, populated by delete action. It
  is also possible to manually set it via update. To undelete change it back to
  empty value, but please note that associated records would need to be manually
  undeleted as well.
  """
  deleted_at: JSONDate

  """
  Used mainly for import/export, if you want to use third party service as a source of truth
  """
  external_id: ID

  """
  ID of an object.
  """
  id: ID

  """
  Fetch image by name; ex: header: image(name: "header")
  """
  image(name: String!): Image @deprecated(reason: "use property upload")

  """
  Fetch all images, optionally you can filter results by name; ex: cat_images: images(name: "cat")
  """
  images(name: String): [Image!] @deprecated(reason: "use property upload")

  """
  List of all properties assigned to the object.
  """
  properties(select: [PropertiesFieldInput!]): HashObject

  """
  Fetch any property by name and return value as a String; ex: hair_color: property(name: "hair_color")
  """
  property(name: String!): String

  """
  Fetch any property by name and return value as an Array of Strings. ex: todo_list: property_array(name: "todo_list")
  """
  property_array(name: String!): [String!]

  """
  Fetch any property by name and return value as a Boolean; ex: price: property_boolean(name: "enabled")
  """
  property_boolean(name: String!): Boolean

  """
  Fetch any property by name and return value as a Float; ex: price: property_float(name: "price")
  """
  property_float(name: String!): Float

  """
  Fetch any property by name and return value as an Integer; ex: age: property_int(name: "age")
  """
  property_int(name: String!): Int

  """
  Fetch any property by name and return value as a JSON string.
  """
  property_json(name: String!): JSONPayload

  """
  Fetch any property by name, parse it as a JSON and return object
  """
  property_object(name: String!): HashObject

  """
  Fetch any property by name and returns upload details
  """
  property_upload(
    """
    Defines the number of seconds for which the generated url will be accessible. Must be set if acl was set to private
    """
    expires_in: Int
    name: String!
  ): PropertyUpload

  """
  Defines has-one relation with other record; ex: children: records(table:
  "child" join_on_property: "parent_id" foreign_property: "parent_id") { id }
  """
  related_record(
    filter: RecordsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    sort: [RecordsSortInput!]

    """
    Joins record [formaly customization] with record-schema-name == table
    """
    table: [String]!
  ): Record

  """
  Defines has-many relation with other records; ex: children:
  related_records(table: "children", join_on_property: "parent_id",
  foreign_property: "parent_id") { id }
  """
  related_records(
    filter: RecordsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int
    sort: [RecordsSortInput!]

    """
    Define table name which should be used as a source for related records
    """
    table: [String]!
  ): [Record!]

  """
  Defines relation with other user; ex: invited_by: related_user(join_on_property: "invited_by_id") { id }
  """
  related_user(
    filter: UsersFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    """
    join_on_property: String = "user_id"
    sort: [UsersSortInput!]
  ): User

  """
  Defines has-many relation with other user; ex: children:
  users(join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  related_users(
    filter: UsersFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int
    sort: [UsersSortInput!]
  ): [User!]

  """
  Defines relation object accessible over HTTP in JSON collection identified by it's ID.
  """
  remote_records(
    """
    Endpoint that will return resources for given ids in json format
    """
    endpoint: Endpoint!

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String!
  ): [Record!]

  """
  Defines relation object accessible over HTTP in JSON collection identified by it's ID.
  """
  remote_users(
    """
    Endpoint that will return resources for given ids in json format
    """
    endpoint: Endpoint!

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String!
  ): [User!]

  """
  Name of the Table to which it belongs
  """
  table: String

  """
  ID of the Table to which it belongs
  """
  table_id: ID!

  """
  timestamp of when the record was updated, automatically generated by the system
  """
  updated_at: JSONDate!

  """
  Id of the User who created and owns the Record
  """
  user_id: ID
}

type RecordCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [Record!]
  total_entries: Int!
  total_pages: Int!
}

type RecordCreate {
  id: ID!

  """
  Name of the Table to which it belongs
  """
  table: String!
}

input RecordInputType {
  attachments: [AtachmentInputType]
  created_at: JSONDate
  deleted_at: JSONDate
  external_id: ID
  id: ID
  images: [ImageInputType]
  properties: [PropertyInputType]
  records: [RecordsInputType]
  table: String
  updated_at: JSONDate
  user_id: ID
}

input RecordsCreateInputType {
  created_at: JSONDate
  deleted_at: JSONDate
  external_id: ID
  properties: PropertiesObject
  table: String
  updated_at: JSONDate
}

input RecordsFilterInput {
  created_at: DateFilter
  deleted_at: DateFilter
  external_id: StringFilter

  """
  Fulltext search
  """
  fulltext: Query
  id: UniqIdFilter

  """
  join arguments with OR operator
  """
  or: [RecordsFilterInput!]
  properties: [PropertyFilterInput!]

  """
  filter by related records
  """
  related_records: [RelatedRecordsFilterInput!]
  related_users: [RelatedUsersFilterInput!]

  """
  Name of the Table to which records should belong
  """
  table: StringFilter

  """
  pOS ID of the Table to which records should belong
  """
  table_id: UniqIdFilter
  updated_at: DateFilter
  user_id: UniqIdFilter
}

input RecordsInputType {
  table: String
  values: RecordInputType
}

input RecordsSortInput {
  created_at: StandardSort
  deleted_at: StandardSort
  external_id: StandardSort
  id: StandardSort
  properties: [PropertySort!]
  random_sort: Boolean
  table_id: StandardSort
  updated_at: StandardSort
}

input RelatedModelsFilterInput {
  filter: ModelsFilterInput
  join: JoinModelCollection
}

input RelatedRecordsFilterInput {
  filter: RecordsFilterInput
  join: JoinRecordCollection!
}

input RelatedUsersFilterInput {
  filter: UsersFilterInput
  join: JoinModelCollection
}

interface RelationOnDemandInterface {
  """
  Defines belongs-to relation with other model; ex: parent: model(model_name:
  "parent", join_on_property: "parent_id") { id }
  """
  model(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_name: String
  ): ListingsCustomization @deprecated(reason: "use `related_model`")

  """
  Defines has-many relation with other model; ex: children: models(model_name:
  "child", join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  models(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_name: [String]
  ): [ListingsCustomization!] @deprecated(reason: "use `related_models`")

  """
  Defines belongs-to relation with other model; ex: parent: model(model_name:
  "parent", join_on_property: "parent_id") { id }
  """
  related_model(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_schema_name: String
  ): ListingsCustomization

  """
  Defines has-many relation with other model, returns maximum of 10000 records
  at once; ex: children: models(model_name: "child", join_on_property:
  "parent_id", foreign_property: "parent_id") { id }
  """
  related_models(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_schema_name: [String]
  ): [ListingsCustomization!]

  """
  Defines relation with other user, returns maximum of 10000 records at once;
  ex: invited_by: user(join_on_property: "invited_by_id") { id }
  """
  related_user(foreign_property: String = "id", join_on_property: String = "user_id"): User

  """
  Defines relation with other user; ex: invited_by: user(join_on_property: "invited_by_id") { id }
  """
  user(foreign_property: String = "id", join_on_property: String = "user_id"): User @deprecated(reason: "use `related_users`")
}

interface RemoteModelInterface {
  """
  Defines relation object accessible over HTTP in JSON collection identified by it's ID.
  """
  remote_model(
    """
    Endpoint that will return resources for given ids in json format
    """
    endpoint: Endpoint!

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String!
  ): Customization
}

interface RemoteRecordsInterface {
  """
  Defines relation object accessible over HTTP in JSON collection identified by it's ID.
  """
  remote_records(
    """
    Endpoint that will return resources for given ids in json format
    """
    endpoint: Endpoint!

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String!
  ): [Record!]
}

interface RemoteUsersInterface {
  """
  Defines relation object accessible over HTTP in JSON collection identified by it's ID.
  """
  remote_users(
    """
    Endpoint that will return resources for given ids in json format
    """
    endpoint: Endpoint!

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String!
  ): [User!]
}

type Response {
  body: String

  """
  Hash of headers returned by the server
  """
  headers: HashObject

  """
  Standard HTTP status code
  """
  status: Int!
}

type Result {
  """
  hash with calculated difference of what has changed
  """
  changes: HashObject

  """
  Updated model, assuming submited form was for resource model
  """
  model: Model

  """
  Create/Updated transactable, assuming submitted form was for resource Transactable
  """
  transactable: Transactable @deprecated(reason: "use model")

  """
  Updated user, assuming submited form was for resource User
  """
  user: User
}

type RootMutation {
  """
  Creates an Activity
  """
  activity_create(payload: ActivityStreamsPayload!): ActivityStreamsActivity @doc(category: "Activity feeds")

  """
  Delete all activities and clean up ALL feeds
  """
  activity_delete_all(confirm: Boolean = false): [ID] @doc(category: "Activity feeds")

  """
  add activity to feeds
  """
  activity_publish(
    """
    e.i. User, UserPrivate, AuditLog, Images, Posts
    """
    feed_type: String!
    ids: [ID]!
    uuid: ID!
  ): JSONDate @doc(category: "Activity feeds")

  """
  Clean up feeds from selected activities
  """
  activity_unpublish(
    """
    search for activities related to the record ( {"id": "<record_id>"}) and then cleanup all feeds from found activities
    """
    record_id: ID

    """
    search for activities related to the Object and then cleanup all feeds from found activities
    """
    related_to_object: ActiveRecordReference

    """
    remove from feeds activity with UUID
    """
    uuid: ID
  ): [ID] @doc(category: "Activity feeds")

  """
  Clean up ALL feeds
  """
  activity_unpublish_all(confirm: Boolean = false): [ID] @doc(category: "Activity feeds")

  """
  Creates api call notification
  """
  admin_api_call_notification_create(api_call_notification: ApiCallNotificationInputType!): ApiCallNotification @doc(category: "Admin")

  """
  Deletes api call notification
  """
  admin_api_call_notification_delete(
    """
    deprecated, please use physical_file_path
    """
    id: ID
    physical_file_path: String
  ): ApiCallNotification @doc(category: "Admin")

  """
  Updates api call notification
  """
  admin_api_call_notification_update(
    api_call_notification: UpdateApiCallNotificationInputType!

    """
    deprecated, please use physical_file_path
    """
    id: ID
    physical_file_path: String
  ): ApiCallNotification @doc(category: "Admin")

  """
  Remove an asset including the physical file. There is no way to revert this operation, use with caution.
  """
  admin_asset_delete(physical_file_path: String!): Asset @doc(category: "Admin")

  """
  Removes all assets that match the filter.
  """
  admin_asset_delete_all(filter: MutationAssetsFilterInput!): String @doc(category: "Admin")

  """
  Updates asset and physically move the file to the new location
  """
  admin_asset_update(
    asset: AssetUpdateInput!

    """
    Identifier of a file which you want to update
    """
    physical_file_path: String!
  ): Asset @doc(category: "Admin")

  """
  Creates asset
  """
  admin_assets_create(assets: [AssetInput!]!): AssetsCreateMutationPayload @doc(category: "Admin")

  """
  Asynchronously generates report of the current s3 state. Returns ID, to be used in `admin_assets_listing` query. 
  """
  admin_assets_listing_create: AssetsListingIdentifier! @doc(category: "Admin")

  """
  Presign assets urls for given path
  """
  admin_assets_presign_urls(paths: [AssetPresignInput!]!): AssetsPresignUrlsMutationPayload @doc(category: "Admin")

  """
  Creates authorization policy
  """
  admin_authorization_policy_create(authorization_policy: AuthorizationPolicyInputType!): AuthorizationPolicy @doc(category: "Admin")

  """
  Delete authorization policy
  """
  admin_authorization_policy_delete(
    """
    deprecated, please use physical_file_path
    """
    id: ID
    physical_file_path: String
  ): AuthorizationPolicy @doc(category: "Admin")

  """
  Update authorization policy
  """
  admin_authorization_policy_update(
    authorization_policy: UpdateAuthorizationPolicyInputType!

    """
    deprecated, please use physical_file_path
    """
    id: ID
    physical_file_path: String
  ): AuthorizationPolicy @doc(category: "Admin")

  """
  Delete background job
  """
  admin_background_job_delete(id: ID!): BackgroundJob @doc(category: "Admin")

  """
  Retries failed background job
  """
  admin_background_job_retry(id: ID!): BackgroundJob @doc(category: "Admin")

  """
  Creates email_notification schema
  """
  admin_email_notification_create(email_notification: EmailNotificationInputType!): EmailNotification @doc(category: "Admin")

  """
  Creates email_notification schema
  """
  admin_email_notification_delete(
    """
    deprecated, please use physical_file_path
    """
    id: ID
    physical_file_path: String
  ): EmailNotification @doc(category: "Admin")

  """
  Deletes email notifications matching the filter
  """
  admin_email_notification_delete_all(
    """
    Filter for matching email notifications to delete
    """
    filter: EmailNotificationsFilterInput!
  ): ObjectCount @doc(category: "Admin")

  """
  Creates email_notification schema
  """
  admin_email_notification_update(
    email_notification: UpdateEmailNotificationInputType!

    """
    deprecated, please use physical_file_path
    """
    id: ID
    physical_file_path: String
  ): EmailNotification @doc(category: "Admin")

  """
  Updates all email notifications matching the filter
  """
  admin_email_notification_update_all(
    email_notification: UpdateEmailNotificationInputType!

    """
    Filter for matching email notifications to update
    """
    filter: EmailNotificationsFilterInput!
  ): ObjectCount @doc(category: "Admin")

  """
  Creates field
  """
  admin_field_create(field: StandalonePropertyInputType!): Property @deprecated(reason: "Use admin_property_create") @doc(category: "Deprecated")

  """
  Creates field
  """
  admin_field_delete(id: ID!): Property @deprecated(reason: "Use admin_property_delete") @doc(category: "Deprecated")

  """
  Creates field
  """
  admin_field_update(field: UpdateStandalonePropertyInputType!, id: ID!): Property @deprecated(reason: "Use admin_property_update") @doc(category: "Deprecated")

  """
  Creates form_configuration schema
  """
  admin_form_configuration_create(form_configuration: FormConfigurationInputType!): FormConfiguration @deprecated(reason: "Use admin_form_create") @doc(category: "Deprecated")

  """
  Deletes form_configuration schema
  """
  admin_form_configuration_delete(id: ID!): FormConfiguration @deprecated(reason: "Use admin_form_delete") @doc(category: "Deprecated")

  """
  Updates form_configuration schema
  """
  admin_form_configuration_update(form_configuration: UpdateFormConfigurationInputType!, id: ID!): FormConfiguration @deprecated(reason: "Use admin_form_update") @doc(category: "Deprecated")

  """
  Creates form
  """
  admin_form_create(form: FormInput!): Form @deprecated(reason: "Use page with mutation") @doc(category: "Deprecated")

  """
  Delete form
  """
  admin_form_delete(
    """
    deprecated, please use physical_file_path
    """
    id: ID
    physical_file_path: String
  ): Form @deprecated(reason: "Use page with mutation") @doc(category: "Deprecated")

  """
  Delete multiple forms
  """
  admin_form_delete_all(filter: FormsFilterInput!): ObjectCount @deprecated(reason: "Use page with mutation") @doc(category: "Deprecated")

  """
  Update form
  """
  admin_form_update(
    form: UpdateFormInput!

    """
    deprecated, please use physical_file_path
    """
    id: ID
    physical_file_path: String
  ): Form @deprecated(reason: "Use page with mutation") @doc(category: "Deprecated")

  """
  Update multiple forms
  """
  admin_form_update_all(filter: FormsFilterInput!, form: UpdateFormInput!): ObjectCount @deprecated(reason: "Use page with mutation") @doc(category: "Deprecated")

  """
  Creates graphql
  """
  admin_graphql_create(graphql: GraphqlInputType!): GraphQL @doc(category: "Admin")

  """
  Deletes graphql
  """
  admin_graphql_delete(physical_file_path: String!): GraphQL @doc(category: "Admin")

  """
  Updates graphql
  """
  admin_graphql_update(graphql: UpdateGraphqlInputType!, physical_file_path: String!): GraphQL @doc(category: "Admin")

  """
  Creates liquid layout
  """
  admin_liquid_layout_create(liquid_layout: LiquidLayoutInputType!): LiquidLayout @doc(category: "Admin")

  """
  Deletes liquid layout
  """
  admin_liquid_layout_delete(
    """
    deprecated, please use physical_file_path
    """
    id: ID
    physical_file_path: String
  ): LiquidLayout @doc(category: "Admin")

  """
  Deletes multiple liquid layouts
  """
  admin_liquid_layout_delete_all(
    filter: LiquidLayoutsFilterInput!

    """
    Set to true if you want it to run synchronously
    """
    sync: Boolean = false
  ): ObjectCount @doc(category: "Admin")

  """
  Updates liquid layout
  """
  admin_liquid_layout_update(
    """
    deprecated, please use physical_file_path
    """
    id: ID
    liquid_layout: UpdateLiquidLayoutInputType!
    physical_file_path: String
  ): LiquidLayout @doc(category: "Admin")

  """
  Updates multiple liquid layouts
  """
  admin_liquid_layout_update_all(filter: LiquidLayoutsFilterInput!, liquid_layout: UpdateLiquidLayoutInputType!): ObjectCount @doc(category: "Admin")

  """
  Creates liquid partial
  """
  admin_liquid_partial_create(liquid_partial: LiquidPartialInputType!): LiquidPartial @doc(category: "Admin")

  """
  Deletes liquid partial
  """
  admin_liquid_partial_delete(
    """
    deprecated, please use physical_file_path
    """
    id: ID
    physical_file_path: String
  ): LiquidPartial @doc(category: "Admin")

  """
  Deletes multiple liquid partials
  """
  admin_liquid_partial_delete_all(
    filter: LiquidPartialsFilterInput!

    """
    Set to true if you want it to run synchronously
    """
    sync: Boolean = false
  ): ObjectCount @doc(category: "Admin")

  """
  Updates liquid partial
  """
  admin_liquid_partial_update(
    """
    deprecated, please use physical_file_path
    """
    id: ID
    liquid_partial: UpdateLiquidPartialInputType!
    physical_file_path: String
  ): LiquidPartial @doc(category: "Admin")

  """
  Updates multiple liquid partials
  """
  admin_liquid_partial_update_all(filter: LiquidPartialsFilterInput!, liquid_partial: UpdateLiquidPartialInputType!): ObjectCount @doc(category: "Admin")

  """
  Creates model schema
  """
  admin_model_schema_create(model_schema: ModelSchemaInputType!): ModelSchema @doc(category: "Admin")

  """
  Deletes model schema
  """
  admin_model_schema_delete(
    """
    deprecated, please use physical_file_path
    """
    id: ID
    physical_file_path: String
  ): ModelSchema @doc(category: "Admin")

  """
  Updates model schema
  """
  admin_model_schema_update(
    """
    deprecated, please use physical_file_path
    """
    id: ID
    model_schema: UpdateModelSchemaInputType!
    physical_file_path: String
  ): ModelSchema @doc(category: "Admin")

  """
  Creates page
  """
  admin_page_create(page: PageInputType!): Page @doc(category: "Admin")

  """
  Deletes page
  """
  admin_page_delete(
    """
    deprecated, please use physical_file_path
    """
    id: ID
    physical_file_path: String
  ): Page @doc(category: "Admin")

  """
  Updates page
  """
  admin_page_update(
    """
    deprecated, please use physical_file_path
    """
    id: ID
    page: UpdatePageInputType!
    physical_file_path: String
  ): Page @doc(category: "Admin")

  """
  Updates multiple pages
  """
  admin_page_update_all(filter: PageFilterInput!, page: UpdatePageInputType!): ObjectCount! @doc(category: "Admin")

  """
  Remove all pages, beware there is no coming back!
  """
  admin_pages_delete_all(
    filter: PageFilterInput!

    """
    Set to true if you want it to run synchronously
    """
    sync: Boolean = false
  ): ObjectCount! @doc(category: "Admin")

  """
  Creates property
  """
  admin_property_create(property: StandalonePropertyInputType!): Property @doc(category: "Admin")

  """
  Creates property
  """
  admin_property_delete(id: ID!): Property @doc(category: "Admin")

  """
  Creates property
  """
  admin_property_update(id: ID!, property: UpdateStandalonePropertyInputType!): Property @doc(category: "Admin")

  """
  Creates sms_notification schema
  """
  admin_sms_notification_create(sms_notification: SmsNotificationInputType!): SmsNotification @doc(category: "Admin")

  """
  Deletes sms_notification schema
  """
  admin_sms_notification_delete(id: ID, physical_file_path: String): SmsNotification @doc(category: "Admin")

  """
  Updates sms_notification schema
  """
  admin_sms_notification_update(id: ID, physical_file_path: String, sms_notification: UpdateSmsNotificationInputType!): SmsNotification @doc(category: "Admin")

  """
  Creates table
  """
  admin_table_create(table: TableInputType!): Table @doc(category: "Admin")

  """
  Deletes table
  """
  admin_table_delete(physical_file_path: String!): Table @doc(category: "Admin")

  """
  Updates table
  """
  admin_table_update(physical_file_path: String!, table: UpdateTableInputType!): Table @doc(category: "Admin")

  """
  Creates transactable schema
  """
  admin_transactable_schema_create(transactable_schema: TransactableSchemaInputType!): TransactableSchema @deprecated(reason: "Use records instead of transactables") @doc(category: "Deprecated")

  """
  Deletes transactable schema
  """
  admin_transactable_schema_delete(id: ID!): TransactableSchema @deprecated(reason: "Use records instead of transactables") @doc(category: "Deprecated")

  """
  Updates transactable schema
  """
  admin_transactable_schema_update(id: ID!, transactable_schema: UpdateTransactableSchemaInputType!): TransactableSchema @deprecated(reason: "Use records instead of transactables") @doc(category: "Deprecated")

  """
  Creates translation
  """
  admin_translation_create(translation: TranslationInputType!): Translation @deprecated(reason: "Please use admin_translation_set") @doc(category: "Deprecated")

  """
  Deletes translation
  """
  admin_translation_delete(
    key: String!

    """
    for example en, de etc.
    """
    locale: String!
  ): Translation @deprecated(reason: "Please use admin_translation_set") @doc(category: "Deprecated")

  """
  Creates the translation if the key/locale pair does not exist or updates existing translation
  """
  admin_translation_set(translation: TranslationInputType!): Translation @doc(category: "Admin")

  """
  Sets the whole JSON branch, either by merging it to the existing translations or by overwriting the whole branch
  """
  admin_translation_set_json(
    strategy: TranslationJsonStrategy!

    """
    json with translation tree which should be set
    """
    translation: TranslationJsonInputType!
  ): TranslationJson @doc(category: "Admin")

  """
  Unsets the translation key for a given locale
  """
  admin_translation_unset(
    key: String!

    """
    for example en, de etc.
    """
    locale: String!
  ): Translation @doc(category: "Admin")

  """
  Updates translation. If translation does not exist, it will be created.
  """
  admin_translation_update(
    key: String!

    """
    for example en, de etc.
    """
    locale: String!
    translation: UpdateTranslationInputType!
  ): Translation @deprecated(reason: "Please use admin_translation_unset") @doc(category: "Deprecated")

  """
  Creates user_profile schema
  """
  admin_user_profile_schema_create(user_profile_schema: UserProfileSchemaInputType!): UserProfileSchema @deprecated(reason: "Use records instead of user_profiles") @doc(category: "Deprecated")

  """
  Deletes user_profile schema
  """
  admin_user_profile_schema_delete(
    """
    deprecated, please use physical_file_path
    """
    id: ID
    physical_file_path: String
  ): UserProfileSchema @deprecated(reason: "Use records instead of user_profiles") @doc(category: "Deprecated")

  """
  Updates user_profile schema
  """
  admin_user_profile_schema_update(
    """
    deprecated, please use physical_file_path
    """
    id: ID
    physical_file_path: String
    user_profile_schema: UpdateUserProfileSchemaInputType!
  ): UserProfileSchema @deprecated(reason: "Use records instead of user_profiles") @doc(category: "Deprecated")
  api_call_send(
    """
    Variables that will be accesible in liquid
    """
    data: HashObject
    options: ApiCallSendOptions

    """
    Template defined in app/api_calls
    """
    template: NotificationTemplateInput
  ): ApiCallSendPayload

  """
  Presign upload url for direct s3 upload
  """
  attachment_presign_url(options: AttachmentPresignUrlInput): AttachmentPresignedUploadUrl! @deprecated(reason: "Custom attachments were replaced with property upload") @doc(category: "Deprecated")

  """
  Broadcast to a channel and room
  """
  channel_send_message(channel_name: String!, payload: JSONPayload!, room_id: String!): String @doc(category: "WebSockets")
  constant_set(
    """
    Name of the constant you want to set
    """
    name: String!

    """
    Value of the constant, which will be securely store
    """
    value: String!
  ): EncryptedConstant! @doc(category: "Data")
  constant_unset(
    """
    Name of the constant you want to unset
    """
    name: String!
  ): EncryptedConstant @doc(category: "Data")

  """
  Creates a CustomAttachment
  """
  custom_attachment_create(
    custom_attachment: CustomAttachmentInputType!

    """
    deprecated, use form_name
    """
    form_configuration_name: String

    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String
  ): CustomAttachment @deprecated(reason: "Custom attachments were replaced with property upload") @doc(category: "Deprecated")

  """
  Remove a custom attachment
  """
  custom_attachment_delete(
    """
    deprecated, use form_name
    """
    form_configuration_name: String

    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String
    id: ID!
  ): CustomAttachment @deprecated(reason: "Custom attachments were replaced with property upload") @doc(category: "Deprecated")

  """
  Updates a CustomAttachment
  """
  custom_attachment_update(
    custom_attachment: UpdateCustomAttachmentInputType!

    """
    deprecated, use form_name
    """
    form_configuration_name: String

    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String
    id: ID!
  ): CustomAttachment @deprecated(reason: "Custom attachments were replaced with property upload") @doc(category: "Deprecated")

  """
  Creates a CustomImage
  """
  custom_image_create(
    custom_image: NewCustomImageInputType!

    """
    deprecated, use form_name
    """
    form_configuration_name: String

    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String
  ): CustomImage @deprecated(reason: "Custom images were replaced with property upload") @doc(category: "Deprecated")

  """
  Remove a custom image
  """
  custom_image_delete(
    """
    deprecated, use form_name
    """
    form_configuration_name: String

    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String
    id: ID!
  ): CustomImage @deprecated(reason: "Custom images were replaced with property upload") @doc(category: "Deprecated")

  """
  Updates a CustomImage
  """
  custom_image_update(
    custom_image: CustomImageInputType!

    """
    deprecated, use form_name
    """
    form_configuration_name: String

    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String
    id: ID!
  ): CustomImage @deprecated(reason: "Custom images were replaced with property upload") @doc(category: "Deprecated")
  customization_create(
    customization: CustomizationInputType

    """
    deprecated, use form_name
    """
    form_configuration_name: String

    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String
    model: CustomizationInputType
  ): Customization! @deprecated(reason: "Use records instead of customizations") @doc(category: "Deprecated")

  """
  Remove a customization
  """
  customization_delete(
    """
    deprecated, use form_name
    """
    form_configuration_name: String

    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String
    id: ID!
  ): Customization! @deprecated(reason: "use model_delete") @doc(category: "Deprecated")

  """
  Updates a customization
  """
  customization_update(
    customization: CustomizationInputType

    """
    deprecated, use form_name
    """
    form_configuration_name: String

    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String
    id: ID!
    model: CustomizationInputType
  ): Customization! @deprecated(reason: "Use records instead of customizations") @doc(category: "Deprecated")

  """
  Remove all models, beware there is no coming back!
  """
  customizations_delete_all(
    """
    Deprecated, use all_model_schemas
    """
    all_custom_model_types: Boolean

    """
    Mark this if you really want to remove all models
    """
    all_model_schemas: Boolean

    """
    Deprecated, use model_schema_name
    """
    custom_model_type_name: String
    filter: ModelsFilterInput
    model_schema_name: String

    """
    Set to true if you want it to run synchronously
    """
    sync: Boolean = false
  ): ObjectCount! @deprecated(reason: "use models_delete_all") @doc(category: "Deprecated")

  """
  Schedules data export of either models, users or both, similarly to pos-cli,
  with the difference it is capable of additional filtering and sorting. Returns
  ID of an export task, which can be queries same way as pos-cli does its check.
  Generated CSVs are compatible with pos-cli data import.
  """
  data_export(
    """
    Encrypt the content
    """
    encryption: PropertyUploadEncryptionInput

    """
    deprecated, use records
    """
    models: DataExportModelsInput

    """
    provide at least empty hash if you want records to be exported
    """
    records: DataExportRecordsInput
    split_files: Boolean = true

    """
    provide at least empty hash if you want users to be exported
    """
    users: DataExportUsersInput
  ): DataExport! @doc(category: "Import/Export")

  """
  Removes document from the search index.
  """
  documents_delete_rc(
    id: ID!

    """
    Index name
    """
    search_index: String!
  ): HashObject @doc(category: "Data")

  """
  Insert the document into the search index. If the document already exists in
  the index, the document will be updated instead.
  """
  documents_insert_rc(
    """
    JSON document to be put into the <index_name> index
    """
    document: HashObject!
    id: ID

    """
    Index name
    """
    search_index: String!
  ): HashObject @doc(category: "Data")

  """
  Email will be queued to send
  """
  email_send(
    """
    Variables that will be accesible in liquild
    """
    data: HashObject

    """
    Template defined in app/emails
    """
    template: NotificationTemplateInput
  ): NotificationSendEmailPayload

  """
  Creates a embedding
  """
  embedding_create_rc(embedding: EmbeddingCreateInputType!): Embedding! @doc(category: "Data")

  """
  Remove an embedding
  """
  embedding_delete_rc(id: ID!): Embedding! @doc(category: "Data")

  """
  Updates an embedding
  """
  embedding_update_rc(embedding: EmbeddingUpdateInputType!, id: ID!): Embedding! @doc(category: "Data")
  form_submit(
    """
    Values for fields defined in associated form. Might include "id" key which
    will identify the resource in case id argument is blank.
    """
    fields: HashObject!

    """
    Name of the form which should be submitted
    """
    form_name: String!

    """
    id of a resource to be updated; can also be provided as "id" key in "fields"
    hash (if both are present, this argument takes precedence).
    """
    id: ID
  ): FormSubmitPayload @deprecated(reason: "Use page with mutation") @doc(category: "Deprecated")

  """
  Generate presigned url where you can upload image. Include image processing.
  """
  image_presign_url(options: ImagePresignUrlInput): ImagePresignedUploadUrl! @deprecated(reason: "Custom images were replaced with property upload")
  import_models(
    """
    Remap ids, when disabled all ids needs to be an Integer
    """
    _id_remap: Boolean = true

    """
    Rebuilds index for full text search queries
    """
    _index_rebuild: Boolean = true
    models: [CustomizationImport!]!
  ): ImportCustomizationsMutationPayload @doc(category: "Import/Export")
  import_transactables(
    """
    Remap ids, when disabled all ids needs to be an Integer
    """
    _id_remap: Boolean = true

    """
    Rebuilds index for full text search queries
    """
    _index_rebuild: Boolean = true
    transactables: [TransactableImport!]!
  ): ImportTransactablesMutationPayload @deprecated(reason: "use Models instead of Transactables")
  import_users(
    """
    Remap ids, when disabled all ids needs to be an Integer
    """
    _id_remap: Boolean = true

    """
    Rebuilds index for full text search queries
    """
    _index_rebuild: Boolean = true
    users: [UserImport!]!
  ): ImportUsersMutationPayload @doc(category: "Import/Export")

  """
  Check JWT token and Sign In User
  """
  jwt_decode_and_set_session(jwt_algorithm: JwtAlgorithm = HS256, jwt_token: String!): User @deprecated(reason: "User query users.jwt_token and session tag") @doc(category: "Deprecated")

  """
  Creates a MarketplaceLogEntryMutation
  """
  log(message: Any!, type: LogEntryType!): LogEntry @deprecated(reason: "Use log tag") @doc(category: "Deprecated")
  model_create(
    customization: CustomizationInputType

    """
    deprecated, use form_name
    """
    form_configuration_name: String

    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String
    model: CustomizationInputType
  ): Model! @deprecated(reason: "Use records instead of models") @doc(category: "Deprecated")

  """
  Remove a customization
  """
  model_delete(
    """
    deprecated, use form_name
    """
    form_configuration_name: String

    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String
    id: ID!
  ): Model! @deprecated(reason: "Use records instead of models") @doc(category: "Deprecated")

  """
  Updates a customization
  """
  model_update(
    customization: CustomizationInputType

    """
    deprecated, use form_name
    """
    form_configuration_name: String

    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String
    id: ID!
    model: CustomizationInputType
  ): Model! @deprecated(reason: "Use records instead of models") @doc(category: "Deprecated")

  """
  Remove all models, beware there is no coming back!
  """
  models_delete_all(
    """
    Deprecated, use all_model_schemas
    """
    all_custom_model_types: Boolean

    """
    Mark this if you really want to remove all models
    """
    all_model_schemas: Boolean

    """
    Deprecated, use model_schema_name
    """
    custom_model_type_name: String
    filter: ModelsFilterInput
    model_schema_name: String

    """
    Set to true if you want it to run synchronously
    """
    sync: Boolean = false
  ): ObjectCount! @deprecated(reason: "Use records instead of models") @doc(category: "Deprecated")

  """
  Update all models matching filter conditions; use only for small result set,
  for larger amount of results use import feature
  """
  models_update_all(
    filter: ModelsFilterInput
    model: CustomizationInputType!
    model_schema_name: String!

    """
    Set to true if you want it to run synchronously
    """
    sync: Boolean = false
  ): ObjectCount! @deprecated(reason: "Use records instead of models") @doc(category: "Deprecated")

  """
  Presign upload url for direct s3 upload
  """
  presigned_upload_url(options: PresignUrlInput): PresignedUploadUrl! @deprecated(reason: "use property_upload_presign_url or attachment_presign_url") @doc(category: "Deprecated")

  """
  Generate presigned url where you can upload image. Include image processing.
  """
  property_upload_presigned_url(
    """
    Set to true if you want to include a content type in the POST request to S3.
    Useful in some cases where the default provided by S3 will not do, like for
    example for SVG files
    """
    include_content_type: Boolean = false

    """
    deprecated, use table
    """
    model_schema_name: String

    """
    Presign url options
    """
    presign_url: PresignUrl

    """
    name of the property of type upload
    """
    property_name: String!

    """
    Name of the Table schema to which the property belomgs. Must be blank if property is defined directly in user.yml
    """
    table: String

    """
    Must be set to true if property is defined directly in user.yml and not in a Model Schema
    """
    user: Boolean = false
  ): PropertyUploadPresignedUrl!

  """
  Creates a record
  """
  record_create(
    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String
    record: RecordInputType!
  ): Record! @doc(category: "Data")

  """
  Remove a record
  """
  record_delete(
    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String
    id: ID!
    table: String
  ): Model! @doc(category: "Data")

  """
  Updates a record
  """
  record_update(
    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String
    id: ID!
    record: RecordInputType!
  ): Record! @doc(category: "Data")

  """
  Creates multiple records at once
  """
  records_create_rc(records: [RecordsCreateInputType!]!): [RecordCreate!]! @doc(category: "Data")

  """
  Remove all records, beware there is no coming back!
  """
  records_delete_all(
    """
    Mark this if you really want to remove records across all tables
    """
    any_table: Boolean
    filter: RecordsFilterInput

    """
    Set to true if you want it to run synchronously
    """
    sync: Boolean = false
    table: String
  ): ObjectCount! @doc(category: "Data")

  """
  Update all records 
  """
  records_update_all(
    filter: RecordsFilterInput
    record: RecordInputType!

    """
    Set to true if you want it to run synchronously
    """
    sync: Boolean = false
    table: String!
  ): ObjectCount! @doc(category: "Data")

  """
  Adds a field to session
  """
  session_create_field(name: String!, value: Any!): HashObject

  """
  Adds a field to session
  """
  session_delete_field(name: String!): HashObject

  """
  Sms will be queued to send
  """
  sms_send(
    """
    Variables that will be accesible in liquid
    """
    data: HashObject

    """
    Template defined in app/api_calls
    """
    template: NotificationTemplateInput
  ): SmsSendPayload
  transactable_create(form_configuration_name: String, transactable: TransactableInputType!): Transactable! @deprecated(reason: "use Models instead of Transactables") @doc(category: "Deprecated")
  transactable_delete(form_configuration_name: String, id: ID!): Transactable! @deprecated(reason: "use Models instead of Transactables") @doc(category: "Deprecated")
  transactable_update(form_configuration_name: String, id: ID!, transactable: TransactableInputType!): Transactable! @deprecated(reason: "use Models instead of Transactables") @doc(category: "Deprecated")
  transactables_delete_all(
    """
    Mark this if you really want to remove all transactables
    """
    all_transactable_types: Boolean
    transactable_type_name: String
  ): ObjectCount! @deprecated(reason: "use Models instead of Transactables") @doc(category: "Deprecated")
  update_models(models: [ModelUpdate!]!): UpdateCustomizationsMutationPayload @deprecated(reason: "Use records instead of models") @doc(category: "Deprecated")
  update_users(users: [UserUpdate!]!): UpdateUsersMutationPayload @deprecated(reason: "Use user_update or users_update_all") @doc(category: "Deprecated")

  """
  Creates user
  """
  user_create(
    """
    deprecated, use form_name
    """
    form_configuration_name: String

    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String
    id: ID
    user: UserInputType!
  ): User @doc(category: "Data")

  """
  Deletes a user
  """
  user_delete(
    """
    deprecated, use form_name
    """
    form_configuration_name: String

    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String
    id: ID!
  ): User @doc(category: "Data")

  """
  Deletes a secret OTP token for a user
  """
  user_otp_delete_token(
    """
    OTP name, leave blank for default
    """
    otp_name: String = null
    user_id: ID!
  ): UserOtpDeleteTokenInformation

  """
  Refreshes the secret OTP token(s) for a user
  """
  user_otp_secret_refresh(
    """
    OTP name, leave blank for default
    """
    otp_name: String = null
    user_id: ID!
  ): UserOtpSecretRefreshInformation
  user_profile_delete(
    """
    deprecated, use form_name
    """
    form_configuration_name: String

    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String
    profile_type: String!
    user_id: ID!
  ): Profile! @deprecated(reason: "Use records instead of user_profiles") @doc(category: "Deprecated")

  """
  Remove all user profiles, beware there is no coming back!
  """
  user_profiles_delete_all(
    """
    Mark this if you really want to remove all user_profiles
    """
    all_user_profile_types: Boolean

    """
    User whose user profiles you want to delete
    """
    user_id: Int
    user_profile_type_name: String
  ): ObjectCount! @deprecated(reason: "Use records instead of user_profiles") @doc(category: "Deprecated")

  """
  Sign In User
  """
  user_session_create(
    email: String

    """
    deprecated, use form_name
    """
    form_configuration_name: String

    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String
    password: String!
    remember_me: String = "1"
  ): User @deprecated(reason: "Use sign_in tag") @doc(category: "Deprecated")

  """
  Sign Out User
  """
  user_session_destroy(
    """
    deprecated, use form_name
    """
    form_configuration_name: String

    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String
  ): HashObject @deprecated(reason: "Use session tag") @doc(category: "Deprecated")

  """
  Updates current_user
  """
  user_update(
    """
    deprecated, use form_name
    """
    form_configuration_name: String

    """
    name of the form which whitelist attributes which can be saved. All
    notifications and callbacks associated with the form will be triggered. if
    left blank, all attributes will be allowed
    """
    form_name: String

    """
    when not provided we try to use current_user
    """
    id: ID
    user: UserInputType!
  ): User @doc(category: "Data")

  """
  Remove all users, beware there is no coming back!
  """
  users_delete_all(
    """
    If filter options are not specified, this must be checked
    """
    all_users: Boolean
    filter: UsersFilterInput

    """
    Set to true if you want it to run synchronously
    """
    sync: Boolean = false
  ): ObjectCount! @doc(category: "Data")

  """
  Update all users matching filter conditions; use only for small result set,
  for larger amount of results use import feature
  """
  users_update_all(
    """
    If filter options are not specified, this must be checked
    """
    all_users: Boolean
    filter: UsersFilterInput

    """
    Set to true if you want it to run synchronously
    """
    sync: Boolean = false
    user: UserInputType!
  ): ObjectCount! @doc(category: "Data")
}

"""
Root query for schema
"""
type RootQuery {
  activities(ids: [ID], page: Int = 1, per_page: Int = 20, sort: [ActivitiesSortInput!], uuids: [String]): ActivityStreamsActivityCollection @doc(category: "Activity feeds")
  admin_api_call_notifications(filter: ApiCallNotificationsFilterInput, page: Int = 1, per_page: Int = 20, sort: [ApiCallNotificationsSortInput!]): ApiCallNotificationCollection! @doc(category: "Admin")
  admin_assets(filter: QueryAssetsFilterInput, page: Int = 1, per_page: Int = 20, sort: [AssetsSortInput!]): AssetCollection! @doc(category: "Admin")

  """
  Returns an asset listing for the instance.
  """
  admin_assets_listing(id: ID!): AssetsListing! @doc(category: "Admin")
  admin_authorization_policies(filter: AuthorizationPoliciesFilterInput, page: Int = 1, per_page: Int = 20, sort: [AuthorizationPoliciesSortInput!]): AuthorizationPolicyCollection! @doc(category: "Admin")
  admin_background_jobs(
    filter: BackgroundJobsFilterInput

    """
    Maximum 50
    """
    page: Int = 1

    """
    Maximum 100
    """
    per_page: Int = 20

    """
    Deprecated
    """
    sort: [BackgroundJobsSortInput!]
  ): BackgroundJobCollection!
  admin_email_notifications(filter: EmailNotificationsFilterInput, page: Int = 1, per_page: Int = 20, sort: [EmailNotificationsSortInput!]): EmailNotificationCollection! @doc(category: "Admin")
  admin_form_configurations(filter: FormConfigurationsFilterInput, page: Int = 1, per_page: Int = 20, sort: [FormConfigurationsSortInput!]): FormConfigurationCollection! @deprecated(reason: "use admin_forms") @doc(category: "Deprecated")
  admin_forms(filter: FormsFilterInput, page: Int = 1, per_page: Int = 20, sort: [FormsSortInput!]): FormCollection! @doc(category: "Deprecated")
  admin_graphql(filter: GraphqlFilterInput, page: Int = 1, per_page: Int = 20, sort: [GraphqlSortInput!]): GraphQueryCollection! @doc(category: "Admin")
  admin_liquid_layouts(filter: LiquidLayoutsFilterInput, page: Int = 1, per_page: Int = 20, sort: [LiquidLayoutsSortInput!]): LiquidLayoutCollection! @doc(category: "Admin")
  admin_liquid_partials(filter: LiquidPartialsFilterInput, page: Int = 1, per_page: Int = 20, sort: [LiquidPartialsSortInput!]): LiquidPartialCollection! @doc(category: "Admin")
  admin_model_schemas(filter: ModelSchemasFilterInput, page: Int = 1, per_page: Int = 20, sort: [ModelSchemasSortInput!]): ModelSchemaCollection! @doc(category: "Admin")
  admin_pages(
    """
    deprecated use filter: { metadata: { exclude: $exclude }}
    """
    exclude: Boolean
    filter: PageFilterInput

    """
    deprecated use filter: { metadata: { has_key: $key }}
    """
    has_key: String

    """
    deprecated use filter: { metadata: { contains: $text }}
    """
    metadata: String

    """
    deprecated use filter: { metadata: { attribute: { key: $name, value: $value }}}
    """
    name: String
    page: Int = 1
    per_page: Int = 20
    sort: [PagesSortInput!]

    """
    deprecated use filter: { metadata: { attribute: { key: $key, value: $value }}}
    """
    value: String
  ): PageCollection! @doc(category: "Admin")

  """
  Get mapping for specified index
  """
  admin_search_index_rc(
    """
    Index name
    """
    search_index: String!
  ): HashObject
  admin_sent_notifications(filter: SentNotificationsFilterInput, page: Int = 1, per_page: Int = 20, sort: [SentNotificationsSortInput!]): SentNotificationCollection! @doc(category: "Admin")
  admin_sms_notifications(filter: SmsNotificationsFilterInput, page: Int = 1, per_page: Int = 20, sort: [SmsNotificationsSortInput!]): SmsNotificationCollection! @doc(category: "Admin")
  admin_tables(filter: TablesFilterInput, page: Int = 1, per_page: Int = 20, sort: [TablesSortInput!]): TableCollection! @doc(category: "Admin")
  admin_third_party_integrations(filter: ThirdPartyIntegrationsFilterInput, page: Int = 1, per_page: Int = 20, sort: [ThirdPartyIntegrationsSortInput!]): ThirdPartyIntegrationCollection! @doc(category: "Admin")
  admin_transactable_schemas(filter: TransactableSchemasFilterInput, page: Int = 1, per_page: Int = 20, sort: [TransactableSchemasSortInput!]): TransactableSchemaCollection! @doc(category: "Admin")
  admin_user_profile_schemas(filter: UserProfileSchemasFilterInput, page: Int = 1, per_page: Int = 20, sort: [UserProfileSchemasSortInput!]): UserProfileSchemaCollection! @doc(category: "Admin")
  admin_versions(filter: VersionFilterInput, page: Int = 1, per_page: Int = 20, sort: [VersionSortInput!]): VersionCollection! @doc(category: "Admin")
  cms_discovery(types: [CMSItemType]): CMSItemDefinitionCollection @deprecated(reason: "Use admin_* queries") @doc(category: "Deprecated")
  cms_items(page: Int = 1, per_page: Int, type: CMSItemType!): CMSItemPayloadCollection @deprecated(reason: "Use admin_* queries") @doc(category: "Deprecated")
  constant(filter: EncryptedConstantFilterInput): EncryptedConstant @deprecated(reason: "Use constants") @doc(category: "Deprecated")
  constants(filter: EncryptedConstantsFilterInput, page: Int = 1, per_page: Int = 20, sort: [EncryptedConstantsSortInput!]): EncryptedConstantCollection! @doc(category: "Data")
  current_user: User @doc(category: "Data")
  custom_attribute_definition(name: String!): CustomAttributeDefinition @deprecated(reason: "Use admin_* queries") @doc(category: "Deprecated")
  customization(id: ID, name: String): Customization @deprecated(reason: "Use models instead.") @doc(category: "Deprecated")
  customizations(
    aggregations: [ListingAggregation]
    created_at: DateRange

    """
    deprecated: use model_schema
    """
    custom_model_type: QueryCustomModelType
    customizable_id: ID
    customizable_ids: [ID]
    customizable_type: String
    external_id: ID
    external_ids: [ID]
    id: ID
    ids: [ID]
    is_deleted: Boolean = false
    model_schema: QueryModelSchema

    """
    Name of the Model Schema
    """
    name: String

    """
    Array of names of the Model Schema
    """
    names: [String]
    page: Int = 1
    per_page: Int = 20
    properties: [QueryCustomAttribute]

    """
    Fulltext search
    """
    query: Query
    sort: [SortOrder]
    updated_at: DateRange
    user_id: ID
    user_ids: [ID]

    """
    Array of ids to exclude from results
    """
    without_ids: [ID]

    """
    Array of names of the Model Schema which will be excluded from results
    """
    without_names: [String]
  ): ListingsCustomizationCollection! @deprecated(reason: "Use records instead") @doc(category: "Deprecated")

  """
  Exported data packages
  """
  data_exports(filter: DataExportsFilterInput, page: Int = 1, per_page: Int = 20, sort: [DataExportsSortInput!]): DataExportCollection! @doc(category: "Import/Export")

  """
  Search documents with fulltext search query or filter by arguments.
  """
  documents_rc(
    aggregations: [ListingAggregation]
    filter: [IndexSearchFilterInput!]
    page: Int = 1
    per_page: Int!

    """
    Fulltext search
    """
    query: IndexSearchQuery

    """
    Index name
    """
    search_index: String!
    sort: [IndexSearchSortInput!]
  ): IndexSearchCollection! @doc(category: "Data")

  """
  Returns collection of all Embeddings in the system.
  """
  embeddings_rc(filter: EmbeddingsFilterInput, page: Int = 1, per_page: Int!, sort: [EmbeddingsSortInput!]): EmbeddingCollection! @doc(category: "Data")
  feeds: [ActivityStreamsFeed] @doc(category: "Activity feeds")
  handlers(page: Int = 1, per_page: Int = 20): ActivityStreamsHandlerCollection @doc(category: "Activity feeds")
  images(filter: ImagesFilterInput, page: Int = 1, per_page: Int!, sort: [ImagesSortInput!]): CustomImageCollection! @deprecated(reason: "Use property upload") @doc(category: "Deprecated")
  instance: Instance @deprecated(reason: "Not needed") @doc(category: "Deprecated")
  listings(
    aggregations: [ListingAggregation]

    """
    Geo search Deprecetad
    """
    geo_query: GeoQuery
    listing: QueryListing
    page: Int = 1
    per_page: Int = 20

    """
    Fulltext search
    """
    query: Query
    sort: [SortOrder]
  ): ListingCollection! @deprecated(reason: "Use Record instead of Transactables") @doc(category: "Deprecated")
  login_providers: [String] @deprecated(reason: "Not needed") @doc(category: "Deprecated")
  model(id: ID, name: String): Customization @deprecated(reason: "Use models instead") @doc(category: "Deprecated")

  """
  Returns collection of all Models in the system, including soft deleted items.
  """
  models(filter: ModelsFilterInput, page: Int = 1, per_page: Int!, sort: [ModelsSortInput!]): ModelCollection! @deprecated(reason: "Use records") @doc(category: "Deprecated")
  pages(
    """
    deprecated use filter: { metadata: { exclude: $exclude }}
    """
    exclude: Boolean
    filter: PageFilterInput

    """
    deprecated use filter: { metadata: { has_key: $key }}
    """
    has_key: String

    """
    deprecated use filter: { metadata: { contains: $text }}
    """
    metadata: String

    """
    deprecated use filter: { metadata: { attribute: { key: $name, value: $value }}}
    """
    name: String
    page: Int = 1
    per_page: Int = 20
    sort: [PagesSortInput!]

    """
    deprecated use filter: { metadata: { attribute: { key: $key, value: $value }}}
    """
    value: String
  ): PageCollection! @deprecated(reason: "use admin_pages") @doc(category: "Deprecated")
  people(
    aggregations: [ListingAggregation]

    """
    Geo search
    """
    geo_query: GeoQuery
    page: Int = 1
    per_page: Int = 20

    """
    Fulltext search
    """
    query: Query
    sort: [SortOrder]
    user: QueryUser
  ): UserListingCollection! @deprecated(reason: "Use users") @doc(category: "Deprecated")

  """
  Returns collection of all Records in the system.
  """
  records(filter: RecordsFilterInput, page: Int = 1, per_page: Int!, sort: [RecordsSortInput!]): RecordCollection! @doc(category: "Data")

  """
  Returns collection of remote Records.
  """
  remote_records(
    """
    Endpoint that will return resources for given ids in json format
    """
    endpoint: Endpoint!
    filter: RecordsFilterInput
    page: Int = 1
    per_page: Int!
    sort: [RecordsSortInput!]
  ): RecordCollection! @doc(category: "Data")
  remote_users(
    """
    Endpoint that will return resources for given ids in json format
    """
    endpoint: Endpoint!
    filter: UsersFilterInput
    page: Int = 1
    per_page: Int!
    sort: [UsersSortInput!]
  ): UserCollection! @doc(category: "Data")
  request: HTTPRequestContext @deprecated(reason: "Not needed") @doc(category: "Deprecated")
  streams(
    feed_id: ID

    """
    Deprecated use feed_id
    """
    feed_name: String
    feed_type: String!
    page: Int = 1
    per_page: Int = 20
    reset_last_read: Boolean = true
  ): ActivityStreamsActivityStreamCollection @doc(category: "Activity feeds")
  transactable(
    creator_id: ID
    id: ID

    """
    Slug of the transactable
    """
    slug: String
  ): Transactable! @deprecated(reason: "Not needed") @doc(category: "Deprecated")
  transactable_type(
    id: ID

    """
    Name of Transactable Type
    """
    name: String
  ): TransactableType @deprecated(reason: "Not needed; use ModelSchema instead of TransactableType") @doc(category: "Deprecated")
  transactable_types(
    """
    List of ids
    """
    ids: [ID]

    """
    List of names
    """
    names: [String]
  ): [TransactableType] @deprecated(reason: "Not needed; use ModelSchema instead of TransactableType") @doc(category: "Deprecated")
  transactables(page: Int = 1, per_page: Int = 20): TransactableCollection! @deprecated(reason: "Use Records instead of Transactables") @doc(category: "Deprecated")

  """
  Finds non deleted users based on arguments provided
  """
  user(email: String, external_id: String, id: ID, is_deleted: Boolean, slug: String): User @deprecated(reason: "Use users") @doc(category: "Deprecated")
  users(filter: UsersFilterInput, page: Int = 1, per_page: Int!, sort: [UsersSortInput!]): UserCollection! @doc(category: "Data")
}

enum SelectPropertyTypeEnum {
  """
  """
  array

  """
  """
  boolean

  """
  """
  float

  """
  """
  int

  """
  """
  json

  """
  """
  object

  """
  """
  string
}

"""
Sent Notification(api call, email, sms)
"""
type SentNotification implements AdminNonDeployableSharedAttributesInterface {
  content: String
  created_at: JSONDate!
  id: ID!
  notification_id: ID!
  notification_type: NotificationTypeEnum!
  options: HashObject
  updated_at: JSONDate!
}

type SentNotificationCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [SentNotification!]
  total_entries: Int!
  total_pages: Int!
}

input SentNotificationsFilterInput {
  content: StringFilter
  created_at: DateFilter
  id: UniqIdFilter
  notification_id: UniqIdFilter
  notification_type: NotificationTypeFilter
  or: [SentNotificationsFilterInput!]
  updated_at: DateFilter
}

input SentNotificationsSortInput {
  created_at: StandardSort
  id: StandardSort
  updated_at: StandardSort
}

"""
Sms Notification
"""
type SmsNotification implements AdminSharedAttributesInterface {
  """
  liquid code to evaluate to valid text. If sms is triggered via form
  configuration, You have access to "form" variable, with data specified in the configuration.
  """
  content: String
  created_at: JSONDate!

  """
  liquid code which should evaluate to integer. Delays invoking the job by
  specified number of minutes. Useful to invoke code at certain point in time,
  for example 1 hour before something etc. To calculate proper number you can
  use time_diff filter.
  """
  delay_by: String

  """
  form configurations which trigger the email
  """
  form_configurations: [FormConfiguration!] @deprecated(reason: "use forms")

  """
  forms which trigger the email
  """
  forms: [Form!]
  id: ID!
  metadata: HashObject

  """
  name of the sms, which is used in form_configurations or mutation to trigger it
  """
  name: String!

  """
  defines the physical path of the file
  """
  physical_file_path: String

  """
  liquid code to evaluate to valid mobile number with country code, for example
  +1 541 754 3010.  Useful filter to build valid mobile number is
  "$to_mobile_number".
  """
  to: String!

  """
  liquid code which should evaluate to true if the sms should be sent
  """
  trigger_condition: String
  updated_at: JSONDate!
}

type SmsNotificationCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [SmsNotification!]
  total_entries: Int!
  total_pages: Int!
}

input SmsNotificationInputType {
  """
  liquid code to evaluate to valid form html. If sms is triggered via form
  configuration, You have access to "form" variable, with data specified in configuration.
  """
  content: String

  """
  liquid code which should evaluate to integer. Delays invoking the job by
  specified number of minutes. Useful to invoke code at certain point in time,
  for example 1 hour before something etc. To calculate proper number you can
  use time_diff filter.
  """
  delay_by: String = "0"

  """
  deprecated, use form_ids
  """
  form_configuration_ids: [ID]

  """
  ids of forms which should trigger the sms
  """
  form_ids: [ID]
  metadata: HashObject

  """
  deprecated - derived from physical_file_path;name of the sms, which is used in forms or mutation to trigger it
  """
  name: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/smses/my_sms_notification
  """
  physical_file_path: String!

  """
  liquid code to evaluate to valid mobile number with country code, for example
  +1 541 754 3010.     Useful filter to build valid mobile number is
  "$to_mobile_number".
  """
  to: String

  """
  liquid code which should evaluate to true if the sms should be sent
  """
  trigger_condition: String = "true"
}

input SmsNotificationsFilterInput {
  callback: StringFilter
  content: StringFilter
  created_at: DateFilter

  """
  Deprecated - use delay_by
  """
  delay: StringFilter
  delay_by: StringFilter
  id: UniqIdFilter

  """
  Filter by metadata properties
  """
  metadata: [JsonbFilter!]
  name: StringFilter
  or: [SmsNotificationsFilterInput!]
  physical_file_path: StringFilter
  to: StringFilter
  trigger_condition: StringFilter
  updated_at: DateFilter
}

input SmsNotificationsSortInput {
  created_at: StandardSort
  id: StandardSort
  metadata: [JsonbSort!]
  name: StandardSort
  physical_file_path: StandardSort
  updated_at: StandardSort
}

"""
Autogenerated return type of SmsSend.
"""
type SmsSendPayload {
  errors: [BaseError!]! @deprecated(reason: "Not needed")
  is_scheduled_to_send: Boolean!
}

input SortByChildField {
  """
  Child type, for ex. transactable
  """
  child_type: String

  """
  Sort by this field, example: "id".
  """
  field_name: String
}

input SortByDistance {
  """
  Sort by this field, example: "geo_location"
  """
  field_name: String!

  """
  Reference point, usually current location
  """
  reference_point: GeoPoint!
  unit: DistanceUnit = km
}

input SortByFieldOrder {
  """
  Sort by this field, example: "id".
  """
  field_name: String!

  """
  Sort by provided values, example: [109, 903].
  Full example: If { field_name: "id", values: [109, 903] }, Object#109 will be
  1st, Object#903 will be 2nd, and then the rest.
  """
  values: [String]!
}

input SortOrder {
  child_field: SortByChildField

  """
  Sort by distance to geo point
  """
  distance: SortByDistance

  """
  Sort by given field by provided values
  """
  field: SortByFieldOrder

  """
  Sort by field
  """
  name: String
  order: String = "asc"

  """
  Sort by distance to geo point based on custom_addresses
  """
  profile_distance: SortByDistance

  """
  To sort by profile property use `properties.` prefix, ex. `profile_field: "properties.color"`
  """
  profile_field: String

  """
  Sort by profile property`
  """
  profile_property: String

  """
  Name of the user profile type
  """
  profile_type: String

  """
  Sort by property field
  """
  property_name: String
}

enum SortOrderEnum {
  """
  for strings: `a,b,c`, for numbers: `1,2,3`
  """
  ASC

  """
  for strings: `z,x,y`, for numbers: `99,98,97`
  """
  DESC
}

input SpamProtectionInput {
  hcaptcha: HashObject
  recaptcha_v2: HashObject
  recaptcha_v3: SpamProtectionRecaptchaV3Input
}

input SpamProtectionInputType {
  recaptcha_v2: HashObject
  recaptcha_v3: SpamProtectionRecaptchaV3InputType
}

input SpamProtectionRecaptchaV3Input {
  action: String!
  minimum_score: Float
}

input SpamProtectionRecaptchaV3InputType {
  action: String!
  minimum_score: Float
}

input StandalonePropertyInputType {
  """
  Type of the property
  """
  attribute_type: PropertyTypeEnum = string

  """
  Defines a relationship with other model schema or the user schema. Used during importing/exporting data.
  """
  belongs_to: String

  """
  Default value for new objects
  """
  default_value: String
  metadata: HashObject

  """
  Name of the property
  """
  name: String!

  """
  Provides options for type upload - defines for exmple whether newly upload file should be public etc
  """
  options: PropertyUploadOptionsInput

  """
  Id of the schema to which this property definition belongs. For target_type User set to null.
  """
  target_id: ID

  """
  Type of the schema to which this property definition belongs
  """
  target_type: PropertyTargetType!
}

input StandardSort {
  order: SortOrderEnum!

  """
  Order by specific values
  """
  order_by_values: [String!]
}

input StringFilter {
  """
  matches string within other string
  """
  contains: String
  ends_with: String

  """
  deprecated, use "value" instead
  """
  exact: String
  not_contains: String
  not_ends_with: String
  not_starts_with: String
  not_value: String
  not_value_in: [String!]
  starts_with: String
  value: String
  value_in: [String!]
}

"""
Table definition (old ModelSchema)
"""
type Table implements AdminPropertiesInterface & AdminSharedAttributesInterface {
  created_at: JSONDate!

  """
  Deprecated, use properties instead.
  """
  fields: [Property!]! @deprecated(reason: "Use properties")
  id: ID!
  metadata: HashObject
  name: String!
  parameterized_name: String!

  """
  defines the physical path of the file
  """
  physical_file_path: String

  """
  List of properties attributes to be included in the results
  """
  properties: [Property!]!
  records_count_rc: Int!
  updated_at: JSONDate!
}

type TableCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [Table!]
  total_entries: Int!
  total_pages: Int!
}

input TableInputType {
  metadata: HashObject

  """
  defines where the table definition will be available after pull; for example schema/my_model.yml
  """
  physical_file_path: String!
  properties: [NestedPropertyInputType]
}

input TablesFilterInput {
  created_at: DateFilter
  id: UniqIdFilter

  """
  Filter by metadata properties
  """
  metadata: [JsonbFilter!]
  name: StringFilter
  or: [TablesFilterInput!]
  parameterized_name: StringFilter
  physical_file_path: StringFilter
  updated_at: DateFilter
}

input TablesSortInput {
  created_at: StandardSort
  id: StandardSort
  metadata: [JsonbSort!]
  name: StandardSort
  parameterized_name: StandardSort
  physical_file_path: StandardSort
  updated_at: StandardSort
}

"""
Third Party Integration
"""
type ThirdPartyIntegration {
  created_at: JSONDate!
  id: ID!
  settings: HashObject!
  type: String!
  updated_at: JSONDate!
}

type ThirdPartyIntegrationCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [ThirdPartyIntegration!]
  total_entries: Int!
  total_pages: Int!
}

input ThirdPartyIntegrationsFilterInput {
  created_at: DateFilter
  id: UniqIdFilter
  or: [ThirdPartyIntegrationsFilterInput!]
  type: StringFilter
  updated_at: DateFilter
}

input ThirdPartyIntegrationsSortInput {
  created_at: StandardSort
  id: StandardSort
  type: StandardSort
  updated_at: StandardSort
}

type Transactable implements RelationOnDemandInterface {
  created_at: JSONDate
  creator: User
  creator_id: ID
  custom_address(name: String!): CustomAddrress
  custom_image(name: String!): [ListingImage]

  """
  Fetch any customization by name or id; ex: hair_color: customization(name: "hair_color")
  """
  customizations(id: ID, name: String, user_id: ID): [Customization!]
  external_id: ID
  id: ID!
  is_deleted: Boolean

  """
  Defines belongs-to relation with other model; ex: parent: model(model_name:
  "parent", join_on_property: "parent_id") { id }
  """
  model(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_name: String
  ): ListingsCustomization @deprecated(reason: "use `related_model`")

  """
  Defines has-many relation with other model; ex: children: models(model_name:
  "child", join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  models(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_name: [String]
  ): [ListingsCustomization!] @deprecated(reason: "use `related_models`")
  name: String

  """
  Fetch any Property by name; ex: hair_color: property(name: "hair_color")
  """
  property(name: String!): String
  property_array(name: String!): [String!]!

  """
  Defines belongs-to relation with other model; ex: parent: model(model_name:
  "parent", join_on_property: "parent_id") { id }
  """
  related_model(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_schema_name: String
  ): ListingsCustomization

  """
  Defines has-many relation with other model, returns maximum of 10000 records
  at once; ex: children: models(model_name: "child", join_on_property:
  "parent_id", foreign_property: "parent_id") { id }
  """
  related_models(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_schema_name: [String]
  ): [ListingsCustomization!]

  """
  Defines relation with other user, returns maximum of 10000 records at once;
  ex: invited_by: user(join_on_property: "invited_by_id") { id }
  """
  related_user(foreign_property: String = "id", join_on_property: String = "user_id"): User
  slug: String!
  updated_at: JSONDate

  """
  Defines relation with other user; ex: invited_by: user(join_on_property: "invited_by_id") { id }
  """
  user(foreign_property: String = "id", join_on_property: String = "user_id"): User @deprecated(reason: "use `related_users`")
}

type TransactableCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [Transactable!]
  total_entries: Int!
  total_pages: Int!
}

input TransactableImport {
  addresses: [AddressImport!]
  attachments: [AttachmentsImport!]
  created_at: ISO8601DateTime
  creator_id: ID!

  """
  ID will be changed after import, relations will be preseved
  """
  id: ID!
  images: [ImagesImport!]
  name: String

  """
  ex. {"color": "red"}
  """
  properties: HashObject
  slug: String!
  type_name: String!
  updated_at: ISO8601DateTime
}

input TransactableInputType {
  creator_id: ID
  currency: String
  description: String
  name: String
  properties: [CustomAttributeInputType]
  quantity: Int
  slug: String
  state_event: String
  transactable_type_name: String
}

"""
Schema for transactable (old name was TransactableType). Deprecated, use ModelSchema
"""
type TransactableSchema implements AdminPropertiesInterface & AdminSharedAttributesInterface {
  created_at: JSONDate!

  """
  Deprecated, use properties instead.
  """
  fields: [Property!]! @deprecated(reason: "Use properties")
  id: ID!
  metadata: HashObject
  name: String!
  parameterized_name: String!

  """
  defines the physical path of the file
  """
  physical_file_path: String

  """
  List of properties attributes to be included in the results
  """
  properties: [Property!]!
  updated_at: JSONDate!
}

type TransactableSchemaCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [TransactableSchema!]
  total_entries: Int!
  total_pages: Int!
}

input TransactableSchemaInputType {
  """
  deprecated, use properties
  """
  fields: [NestedPropertyInputType]
  name: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/transactable_types/my_transactable
  """
  physical_file_path: String!
  properties: [NestedPropertyInputType]
}

input TransactableSchemasFilterInput {
  created_at: DateFilter
  id: UniqIdFilter
  name: StringFilter
  or: [TransactableSchemasFilterInput!]
  parameterized_name: StringFilter
  updated_at: DateFilter
}

input TransactableSchemasSortInput {
  created_at: StandardSort
  id: StandardSort
  name: StandardSort
  parameterized_name: StandardSort
  updated_at: StandardSort
}

type TransactableType {
  id: ID!
  name: String!
}

"""
Translation
"""
type Translation {
  created_at: JSONDate!
  id: ID!
  key: String!
  locale: String!
  updated_at: JSONDate!
  value: String!
}

input TranslationInputType {
  key: String!

  """
  for example en, de etc.
  """
  locale: String!
  value: String!
}

"""
TranslationJson
"""
type TranslationJson {
  deleted_records: Int!
  key: String!
  locale: String!
  strategy: TranslationJsonStrategy!
  upserted_records: Int!
  value_json: HashObject!
}

input TranslationJsonInputType {
  """
  path to the translation branch which should be set
  """
  key: String!

  """
  for example en, de etc.
  """
  locale: String!

  """
  json with translation tree which should be set
  """
  value_json: HashObject!
}

"""
Strategy how to set Translation JSON
"""
enum TranslationJsonStrategy {
  """
  Will do the deep merge with existing translations, nothing will be deleted
  """
  merge

  """
  It will remove all existing translations for the given key prefix and replace them with provided values
  """
  overwrite
}

input UniqIdFilter {
  not_value_in: [ID!]
  range: IdRangeFilter
  value: ID
  value_in: [ID!]
}

input UpdateApiCallNotificationInputType {
  """
  liquid code which can be used to process the response from the endpoint. You have access to "response" variable.
  """
  callback: String

  """
  liquid code to evaluate to whatever you want to send as a request body, for example a JSON.
  """
  content: String

  """
  liquid code which should evaluate to integer. Delays invoking the job by
  specified number of minutes. Useful to invoke code at certain point in time,
  for example 1 hour before something etc. To calculate proper number you can
  use time_diff filter.
  """
  delay_by: String = "0"

  """
  ids of form configurations which should trigger the api call
  """
  form_configuration_ids: [ID]

  """
  Deprecated, use request_headers
  """
  headers: HashObject
  metadata: HashObject

  """
  name of the api call, which is used in form_configurations or mutation to trigger it
  """
  name: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/notifications/api_call_notifications/my_api_call_notification
  """
  physical_file_path: String
  request_headers: HashObject

  """
  Liquid code which should evaluate to valid request type: Get, Post, Put,
  Patch, Delete, Head or if you want to send binary files: Post_Multipart,
  Put_Multipart, Patch_Multipart
  """
  request_type: String

  """
  liquid code to evaluate to valid endpoint for the request.
  """
  to: String

  """
  liquid code which should evaluate to true if the api call should be sent
  """
  trigger_condition: String = "true"
}

input UpdateAuthorizationPolicyInputType {
  content: String
  flash_alert: String
  metadata: HashObject
  name: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/authorization_policies/my_policy
  """
  physical_file_path: String
  redirect_to: String
}

input UpdateCustomAttachmentInputType {
  custom_attribute_name: String

  """
  URL to image that was uploaded to s3 presigned url
  """
  direct_url: String
  owner_id: ID
  owner_type: String
  page_slug: String
  uploader_id: ID
}

"""
Autogenerated return type of UpdateCustomizationsMutation.
"""
type UpdateCustomizationsMutationPayload {
  ids: [ID!]!
}

input UpdateEmailNotificationInputType {
  """
  json of the form { "file_name.jpg": { "url": "http://example.com/file.jpg" } }
  which defines email attachments. Liquid will be processed.
  """
  attachments: String

  """
  liquid code to evaluate to valid, comma separated blind carbon copy list, for example "john@example.com, jane@example.com"
  """
  bcc: String

  """
  liquid code to evaluate to valid, comma separated carbon copy list, for example "john@example.com, jane@example.com"
  """
  cc: String

  """
  liquid code to evaluate to valid form html. If email is triggered via form
  configuration, You have access to "form" variable, with data specified in configuration.
  """
  content: String

  """
  liquid code which should evaluate to integer. Delays invoking the job by
  specified number of minutes. Useful to invoke code at certain point in time,
  for example 1 hour before something etc. To calculate proper number you can
  use time_diff filter.
  """
  delay_by: String = "0"

  """
  ids of forms which should trigger the email
  """
  form_configuration_ids: [ID]

  """
  email address from which you would like to send the email, for example notifications@mydomain.com
  """
  from: String

  """
  name of the liquid layout to which the content should be injected
  """
  layout: String

  """
  deprecated, use layout
  """
  layout_path: String
  metadata: HashObject

  """
  name of the email, which is used in forms or mutation to trigger it
  """
  name: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/emails/my_email_notification
  """
  physical_file_path: String

  """
  email address to which users should reply, for example support@mydomain.com
  """
  reply_to: String

  """
  liquid code to evaluate to text
  """
  subject: String

  """
  liquid code to evaluate to valid, comma separated recipient list, for example "john@example.com, jane@example.com"
  """
  to: String

  """
  liquid code which should evaluate to true if the email should be sent
  """
  trigger_condition: String = "true"
}

input UpdateFormConfigurationInputType {
  """
  Same as callback, but invoked asynchronously. Recommended for performance reason.
  """
  async_callback_actions: String

  """
  liquid code which should evaluate to float. Delays invoking the job by
  specified number of minutes. Useful to invoke code at certain point in time,
  for example 1 hour before something etc. To calculate proper number you can
  use time_diff filter.
  """
  async_callback_delay: String = "0"

  """
  Defines max number of retrying attempts in case of an error. Usually you do not want to change it.
  """
  async_callback_max_attempts: Int = 1

  """
  defines the invocaction priority, the higher the quicker timeout
  """
  async_callback_priority: AsyncCallbackPriority = default

  """
  ids of authorization policies which should be checked
  """
  authorization_policy_ids: [ID]

  """
  liquid code to be invoked after persisting input to DB. If possible, use async callback actions instead
  """
  callback_actions: String

  """
  whitelist of attributes which can be persisted in the DB. On server side
  (callbacks, emails etc) you have access to submited values via form variable
  (for exapmple configuration: properties: my_var is accessible via
  form.properties.my_var )
  """
  configuration: HashObject = {}

  """
  liquid code which has to evaluate to JSON. This extends/overwrites user
  submitted input via form, before validation. Most useful to store in DB
  sensitive data which you do not want user to modify, for example
  context.current_user.id
  """
  default_payload: String

  """
  liquid code which should evaluate to message which you want to display to user
  upon validation errors. Output is available via context.flash_alert
  """
  flash_alert: String

  """
  liquid code which should evaluate to message which you want to display to user
  after successful form submission. Output is available via context.flash_notice
  """
  flash_notice: String

  """
  liquid code to evaluate to valid form html. You have access to form_builder variable and form tag.
  """
  liquid_body: String
  metadata: HashObject
  name: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/form_configurations/my_form_configuration
  """
  physical_file_path: String

  """
  liquid code which should evaluate to valid path or url to which user should be
  redirected after successful form submission.
  """
  redirect_to: String
  resource: String

  """
  defines who can submit the form. If set to anyone, please make sure to provide authorization_policies
  """
  resource_owner: String

  """
  strategy to protect against spam attacks.
  """
  spam_protection: SpamProtectionInputType = null
}

input UpdateFormInput {
  """
  Same as callback, but invoked asynchronously. Recommended for performance reason.
  """
  async_callback_actions: String

  """
  liquid code which should evaluate to float. Delays invoking the job by
  specified number of minutes. Useful to invoke code at certain point in time,
  for example 1 hour before something etc. To calculate proper number you can
  use time_diff filter.
  """
  async_callback_delay: String

  """
  Defines max number of retrying attempts in case of an error. Usually you do not want to change it.
  """
  async_callback_max_attempts: Int

  """
  defines the invocaction priority, the higher the quicker timeout
  """
  async_callback_priority: AsyncCallbackPriority

  """
  ids of authorization policies which should be checked
  """
  authorization_policy_ids: [ID!]

  """
  liquid code to be invoked after persisting input to DB. If possible, use async callback actions instead
  """
  callback_actions: String

  """
  whitelist of attributes which can be persisted in the DB. On server side
  (callbacks, emails etc) you have access to submited values via form variable
  (for exapmple configuration: properties: my_var is accessible via
  form.properties.my_var )
  """
  configuration: HashObject

  """
  liquid code which has to evaluate to JSON. This extends/overwrites user
  submitted input via form, before validation. Most useful to store in DB
  sensitive data which you do not want user to modify, for example
  context.current_user.id
  """
  default_payload: String

  """
  liquid code which should evaluate to message which you want to display to user
  upon validation errors. Output is available via context.flash_alert
  """
  flash_alert: String

  """
  liquid code which should evaluate to message which you want to display to user
  after successful form submission. Output is available via context.flash_notice
  """
  flash_notice: String

  """
  liquid code to evaluate to valid form html. You have access to form_builder variable and form tag.
  """
  liquid_body: String
  metadata: HashObject
  name: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/forms/my_form
  """
  physical_file_path: String

  """
  liquid code which should evaluate to valid path or url to which user should be
  redirected after successful form submission.
  """
  redirect_to: String
  resource: String

  """
  defines who can submit the form. If set to anyone, please make sure to provide authorization_policies
  """
  resource_owner: String

  """
  Response headers for the form
  """
  response_headers: String

  """
  strategy to protect against spam attacks.
  """
  spam_protection: SpamProtectionInput
}

input UpdateGraphqlInputType {
  body: String
  metadata: HashObject
  path: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/views/partials/my_partial
  """
  physical_file_path: String
}

input UpdateLiquidLayoutInputType {
  body: String
  format: PageFormat = html
  metadata: HashObject
  path: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/views/layouts/my_layout
  """
  physical_file_path: String
}

input UpdateLiquidPartialInputType {
  body: String
  format: PageFormat = html
  metadata: HashObject
  path: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/views/partials/my_partial
  """
  physical_file_path: String
}

input UpdateModelSchemaInputType {
  """
  deprecated, use properties
  """
  fields: [NestedPropertyInputType]
  metadata: HashObject
  name: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/custom_model_types/my_model
  """
  physical_file_path: String
  properties: [NestedPropertyInputType]
}

input UpdatePageInputType {
  """
  ids of authorization policies which should be checked
  """
  authorization_policy_ids: [ID]
  content: String
  deleted_at: JSONDate
  dynamic_cache_expire: Int
  dynamic_cache_key: String
  dynamic_cache_layout: Boolean
  format: PageFormat
  handler: PageHandler

  """
  name of the liquid layout to which the content should be injected
  """
  layout: String

  """
  deprecated, use layout
  """
  layout_name: String

  """
  max nesting of the url to be resolved by this slug. For example slug "abc"
  with max_deep_level 2 will resolve /abc, abc/1, abc/2, but will NOT resolve
  abc/2/something.
  """
  max_deep_level: Int
  metadata: HashObject

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/views/pages/my-page
  """
  physical_file_path: String
  redirect_code: PageRedifectCode
  redirect_to: String
  request_method: PageRequestMethod
  response_headers: HashObject
  searchable: Boolean

  """
  slug will not be automatically if you modify physical_file_path, as this
  operation is dangerous. After changing the slug you might want to ensure the
  SEO will not be hurt by creeating Page with the old slug and setting the
  redirect_to property to the new path.
  """
  slug: String
  static_cache_expire: Int
}

input UpdateSmsNotificationInputType {
  """
  liquid code to evaluate to valid form html. If sms is triggered via form
  configuration, You have access to "form" variable, with data specified in configuration.
  """
  content: String

  """
  liquid code which should evaluate to integer. Delays invoking the job by
  specified number of minutes. Useful to invoke code at certain point in time,
  for example 1 hour before something etc. To calculate proper number you can
  use time_diff filter.
  """
  delay_by: String = "0"

  """
  deprecated, use form_ids
  """
  form_configuration_ids: [ID]
  metadata: HashObject

  """
  name of the sms, which is used in forms or mutation to trigger it
  """
  name: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/smses/my_sms_notification
  """
  physical_file_path: String

  """
  liquid code to evaluate to valid mobile number with country code, for example
  +1 541 754 3010.     Useful filter to build valid mobile number is
  "$to_mobile_number".
  """
  to: String

  """
  liquid code which should evaluate to true if the sms should be sent
  """
  trigger_condition: String = "true"
}

input UpdateStandalonePropertyInputType {
  """
  Type of the property
  """
  attribute_type: PropertyTypeEnum

  """
  Defines a relationship with other model schema or the user schema. Used during importing/exporting data.
  """
  belongs_to: String

  """
  Default value for new objects
  """
  default_value: String
  metadata: HashObject

  """
  Name of the property
  """
  name: String

  """
  Provides options for type upload - defines for exmple whether newly upload file should be public etc
  """
  options: PropertyUploadOptionsInput

  """
  Id of the schema to which this property definition belongs. For target_type User set to null.
  """
  target_id: ID

  """
  Type of the schema to which this property definition belongs
  """
  target_type: PropertyTargetType
}

input UpdateTableInputType {
  metadata: HashObject
  name: String

  """
  defines where the table definition will be available after pull; for example schema/my_model.yml
  """
  physical_file_path: String
  properties: [NestedPropertyInputType]
}

input UpdateTransactableSchemaInputType {
  """
  deprecated, use properties
  """
  fields: [NestedPropertyInputType]
  name: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/transactable_types/my_transactable
  """
  physical_file_path: String
  properties: [NestedPropertyInputType]
}

input UpdateTranslationInputType {
  key: String

  """
  for example en, de etc.
  """
  locale: String
  value: String
}

input UpdateUserProfileSchemaInputType {
  """
  deprecated, use properties
  """
  fields: [NestedPropertyInputType]
  metadata: HashObject
  name: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/user_profile_types/my_user_profile
  """
  physical_file_path: String
  properties: [NestedPropertyInputType]
}

"""
Autogenerated return type of UpdateUsersMutation.
"""
type UpdateUsersMutationPayload {
  ids: [ID!]!
}

enum UploadType {
  """
  Attachment
  """
  attachment

  """
  Image
  """
  image
}

type User implements HasModelsInterface & HasRecordsInterface & LegacyCustomAttributeInterface & PropertiesInterface & RemoteRecordsInterface & RemoteUsersInterface {
  """
  Fetch address by name; ex: address: address(name: "office_address")
  """
  address(name: String!): CustomAddrress @deprecated(reason: "use your own model for address if needed")

  """
  Fetch all addresses, optionally you can filter results by name; ex: home_address: addresses(name: "home")
  """
  addresses(name: String): [CustomAddrress!] @deprecated(reason: "use your own model for address if needed")

  """
  Fetch attachment by name; ex: sales_report: attachment(name: "sales_report")
  """
  attachment(name: String!): PrivateFile @deprecated(reason: "use property upload")

  """
  Fetch all attachments, optionally you can filter results by name; ex: sales_reports: attachments(name: "sales_report")
  """
  attachments(name: String): [PrivateFile!] @deprecated(reason: "use property upload")

  """
  Validate user credentials
  """
  authenticate: Authenticate!

  """
  stores information about user integrations with authentication providers like auth0, facebook, twitter etc
  """
  authentications: [Authentication!]

  """
  used for twilio click-to-call integraation to verify phone number
  """
  communication: Communication @deprecated(reason: "use records")

  """
  timestamp of when the record was created, automatically generated by the system
  """
  created_at: JSONDate

  """
  Fetch address by name; ex: address: custom_address(name: "office_address")
  """
  custom_address(name: String!): CustomAddrress @deprecated(reason: "Use address")

  """
  Fetch all addresses, optionaly you can filter results by name; ex: home: custom_addresses(name: "home")
  """
  custom_addresses(name: String): [CustomAddrress!] @deprecated(reason: "Use addresses")

  """
  Fetch attachment by name; ex: sales_report: custom_attachment(name: "sales_report")
  """
  custom_attachment(name: String!): PrivateFile @deprecated(reason: "Use attachment")

  """
  Fetch all attachments, optionally you can filter results by name; ex:
  sales_reports: custom_attachments(name: "sales_report")
  """
  custom_attachments(name: String): [PrivateFile!] @deprecated(reason: "Use attachments")

  """
  Fetch image by name; ex: header: custom_image(name: "header")
  """
  custom_image(name: String!): Image @deprecated(reason: "Use image")

  """
  Fetch all images, optionaly you can filter results by name; ex: cat_images: custom_images(name: "cat")
  """
  custom_images(name: String): [Image!] @deprecated(reason: "Use images")
  customizations(
    """
    model schema name
    """
    name: String

    """
    ID of user that created customization
    """
    user_id: ID
  ): [Customization!]

  """
  timestamp of when the record was soft delete, populated by delete action. It
  is also possible to manually set it via update. To undelete change it back to
  empty value, but please note that associated records would need to be manually
  undeleted as well.
  """
  deleted_at: JSONDate
  email: String!
  encrypted_password: String

  """
  Used mainly for import/export, if you want to use third party service as a source of truth
  """
  external_id: String
  first_name: String

  """
  ID of an object.
  """
  id: ID

  """
  Fetch image by name; ex: header: image(name: "header")
  """
  image(name: String!): Image @deprecated(reason: "use property upload")

  """
  Fetch all images, optionally you can filter results by name; ex: cat_images: images(name: "cat")
  """
  images(name: String): [Image!] @deprecated(reason: "use property upload")

  """
  JWT token that can be used for authentication
  """
  jwt_token(algorithm: JwtAlgorithm = HS256): String

  """
  Used by translations to set the language of currently logged in user
  """
  language: String
  last_name: String
  middle_name: String

  """
  Defines has-one relation with other model, e.g: children: models(model_name:
  "child" join_on_property: "parent_id" foreign_property: "parent_id") { id }
  """
  model(
    filter: ModelsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with model-schema-name == model_name
    """
    model_name: [String]!
    sort: [ModelsSortInput!]
  ): Model @deprecated(reason: "use `related_record`")

  """
  Defines has-many relation with other model; ex: children: models(model_name:
  "child", join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  models(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int

    """
    Joins model [formaly customization] with model-schema-name == model_name
    """
    model_name: [String]!
    sort: [ModelsSortInput!]
  ): [Model!] @deprecated(reason: "use `related_records`")
  name: String

  """
  Two factor authentication with TOTP(time based one time password)
  """
  otp(otp_name: String = null): Otp!

  """
  get custom OTP token names
  """
  otp_tokens: [String!]!
  profile(profile_type: String!): Profile @deprecated(reason: "use profiles")

  """
  associated user profiles, which can be used as user role or namespace for certain group of user properties
  """
  profiles(profile_type: String): [Profile!]!

  """
  List of all properties assigned to the object.
  """
  properties(select: [PropertiesFieldInput!]): HashObject

  """
  Fetch any property by name and return value as a String; ex: hair_color: property(name: "hair_color")
  """
  property(name: String!): String

  """
  Fetch any property by name and return value as an Array of Strings. ex: todo_list: property_array(name: "todo_list")
  """
  property_array(name: String!): [String!]

  """
  Fetch any property by name and return value as a Boolean; ex: price: property_boolean(name: "enabled")
  """
  property_boolean(name: String!): Boolean

  """
  Fetch any property by name and return value as a Float; ex: price: property_float(name: "price")
  """
  property_float(name: String!): Float

  """
  Fetch any property by name and return value as an Integer; ex: age: property_int(name: "age")
  """
  property_int(name: String!): Int

  """
  Fetch any property by name and return value as a JSON string.
  """
  property_json(name: String!): JSONPayload

  """
  Fetch any property by name, parse it as a JSON and return object
  """
  property_object(name: String!): HashObject

  """
  Fetch any property by name and returns upload details
  """
  property_upload(
    """
    Defines the number of seconds for which the generated url will be accessible. Must be set if acl was set to private
    """
    expires_in: Int
    name: String!
  ): PropertyUpload

  """
  Defines has-one relation with other model; ex: children: models(model_name:
  "child" join_on_property: "parent_id" foreign_property: "parent_id") { id }
  """
  related_model(
    filter: ModelsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with model-schema-name == model_schema_name
    """
    model_schema_name: [String]!
    sort: [ModelsSortInput!]
  ): Model @deprecated(reason: "use `related_record`")

  """
  Defines has-many relation with other model; ex: children:
  related_models(model_schema_name: "child", join_on_property: "parent_id",
  foreign_property: "parent_id") { id }
  """
  related_models(
    filter: ModelsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int

    """
    Joins model [formaly customization] with model-schema-name == model_schema_name
    """
    model_schema_name: [String]!
    sort: [ModelsSortInput!]
  ): [Model!] @deprecated(reason: "use `related_records`")

  """
  Defines has-one relation with other record; ex: children: records(table:
  "child" join_on_property: "parent_id" foreign_property: "parent_id") { id }
  """
  related_record(
    filter: RecordsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    sort: [RecordsSortInput!]

    """
    Joins record [formaly customization] with record-schema-name == table
    """
    table: [String]!
  ): Record

  """
  Defines has-many relation with other records; ex: children:
  related_records(table: "children", join_on_property: "parent_id",
  foreign_property: "parent_id") { id }
  """
  related_records(
    filter: RecordsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int
    sort: [RecordsSortInput!]

    """
    Define table name which should be used as a source for related records
    """
    table: [String]!
  ): [Record!]

  """
  Defines relation with other user; ex: invited_by: related_user(join_on_property: "invited_by_id") { id }
  """
  related_user(
    filter: ModelsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    """
    join_on_property: String = "user_id"
    sort: [UsersSortInput!]
  ): User

  """
  Defines has-many relation with other user; ex: children:
  users(join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  related_users(
    filter: ModelsFilterInput

    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int
    sort: [UsersSortInput!]
  ): [User!]

  """
  Defines relation object accessible over HTTP in JSON collection identified by it's ID.
  """
  remote_records(
    """
    Endpoint that will return resources for given ids in json format
    """
    endpoint: Endpoint!

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String!
  ): [Record!]

  """
  Defines relation object accessible over HTTP in JSON collection identified by it's ID.
  """
  remote_users(
    """
    Endpoint that will return resources for given ids in json format
    """
    endpoint: Endpoint!

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String!
  ): [User!]

  """
  To be used in the url instead of id for SEO purposes. Must be unique. By
  default generated based on first-name and last-mame
  """
  slug: String!

  """
  determined based on authentications. For example, if user connects FB account,
  this will make API call to FB and check, if any of his friends have account on your Site
  """
  social_friends(page: Int = 1, per_page: Int = 20): UserCollection @deprecated(reason: "use api calls")

  """
  A token valid for desired number of hours, which you can use to authorize the
  user in third party application. To do it, include it in a header with name
  UserTemporaryToken. You can also manually verify the token with users{
  authenticate { temporary_token(..) } } query. Token will be invalidated on
  password change.
  """
  temporary_token(
    """
    Number of hours after which the token expire
    """
    expires_in: Float = 48.0

    """
    deprecated, use expires_in
    """
    valid_for: Int
  ): String
  transactables: [Transactable!] @deprecated(reason: "use records")

  """
  timestamp of when the record was updated, automatically generated by the system
  """
  updated_at: JSONDate

  """
  Defines relation with other user; ex: invited_by: user(join_on_property: "invited_by_id") { id }
  """
  user(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    """
    join_on_property: String = "user_id"
    sort: [UsersSortInput!]
  ): User @deprecated(reason: "use `related_user`")

  """
  Defines has-many relation with other user; ex: children:
  users(join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  users(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!
    limit: Int
    sort: [UsersSortInput!]
  ): [User!] @deprecated(reason: "use `related_users`")
}

type UserCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [User!]
  total_entries: Int!
  total_pages: Int!
}

input UserImport {
  created_at: JSONDate
  email: String!
  encrypted_password: String
  external_id: ID
  first_name: String

  """
  ID will be stored as external_id, relations will be preseved. We generate it when empty.
  """
  id: ID
  last_name: String
  middle_name: String
  name: String
  password: String
  profiles: [UserProfileImportType!] = []

  """
  ex. {"color": "red"}
  """
  properties: HashObject
  slug: String!
  updated_at: JSONDate
}

input UserInputType {
  authentications: [AuthenticationInputType]
  custom_attachments: [AtachmentInputType]
  custom_images: [ImageInputType]
  deleted_at: JSONDate
  email: String
  external_id: ID
  first_name: String
  last_name: String
  middle_name: String
  name: String
  password: String
  profiles: [UserProfileInputType]
  properties: [CustomAttributeInputType]
  slug: String
}

type UserListing implements ListingCustomAttributeInterface & ListingsMetadata & RelationOnDemandInterface & RemoteModelInterface {
  authentications: [Authentication!]
  communication: ListingsCommunication
  created_at: JSONDate

  """
  Fetch address by name; ex: address: custom_address(name: "office_address")
  """
  custom_address(name: String!): ListingAddress

  """
  Fetch all addresses, optionaly you can filter results by name; ex: home: custom_addresses(name: "home")
  """
  custom_addresses(name: String): [ListingAddress!]

  """
  Fetch attachment by name; ex: sales_report: custom_attachment(name: "sales_report")
  """
  custom_attachment(name: String!): ListingsPrivateFile
  custom_attachments(name: String): [ListingsPrivateFile!]

  """
  Fetch image by name; ex: header: custom_image(name: "header")
  """
  custom_image(name: String!): ListingImage

  """
  Fetch all images, optionaly you can filter results by name; ex: cat_images: custom_images(name: "cat")
  """
  custom_images(name: String): [ListingImage!]
  customizations(name: String, properties: [QueryCustomAttribute], user_id: ID): [ListingsCustomization!]
  deleted_at: JSONDate
  email: String!
  external_id: ID
  first_name: String
  id: ID!
  language: String
  last_name: String
  middle_name: String

  """
  Defines belongs-to relation with other model; ex: parent: model(model_name:
  "parent", join_on_property: "parent_id") { id }
  """
  model(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_name: String
  ): ListingsCustomization @deprecated(reason: "use `related_model`")

  """
  Defines has-many relation with other model; ex: children: models(model_name:
  "child", join_on_property: "parent_id", foreign_property: "parent_id") { id }
  """
  models(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_name: [String]
  ): [ListingsCustomization!] @deprecated(reason: "use `related_models`")
  name: String!
  profile(profile_type: String!): ListingUserProfile
  profiles: [ListingUserProfile!]

  """
  List of all properties assigned to the object.
  """
  properties: HashObject

  """
  Fetch any custom attribute by name; ex: hair_color: property(name: "hair_color")
  """
  property(name: String!): String

  """
  Fetch any property of Array type by name, it returns Array in contrast to
  "property" which returns String; ex: todo_list: property_array(name: "todo_list")
  """
  property_array(name: String!): [String!]

  """
  Fetch any property of JSON type by name, it returns JSON in contrast to
  "property" which returns String; ex: todo_list: property_json(name: "todo_list")
  """
  property_json(name: String!): JSONPayload

  """
  Defines belongs-to relation with other model; ex: parent: model(model_name:
  "parent", join_on_property: "parent_id") { id }
  """
  related_model(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String = "id"

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_schema_name: String
  ): ListingsCustomization

  """
  Defines has-many relation with other model, returns maximum of 10000 records
  at once; ex: children: models(model_name: "child", join_on_property:
  "parent_id", foreign_property: "parent_id") { id }
  """
  related_models(
    """
    Load resources with foreign_property == join_on_property
    """
    foreign_property: String!

    """
    Load resources with foreign_property == join_on_property
    """
    join_on_property: String!

    """
    Joins model [formaly customization] with custom-model-type-name == model_name
    """
    model_schema_name: [String]
  ): [ListingsCustomization!]

  """
  Defines relation with other user, returns maximum of 10000 records at once;
  ex: invited_by: user(join_on_property: "invited_by_id") { id }
  """
  related_user(foreign_property: String = "id", join_on_property: String = "user_id"): User

  """
  Defines relation object accessible over HTTP in JSON collection identified by it's ID.
  """
  remote_model(
    """
    Endpoint that will return resources for given ids in json format
    """
    endpoint: Endpoint!

    """
    Load remote resource with id == join_on_property
    """
    join_on_property: String!
  ): Customization
  slug: String

  """
  when sorting by distance - field contains distance to target location
  """
  sort_score: [Int] @deprecated(reason: "not supported everywhere")
  temporary_token(
    """
    Number of hours before the token expires, default 48 hours
    """
    expires_in: Float

    """
    deprecated use expires_in
    """
    valid_for: Int
  ): String
  updated_at: JSONDate

  """
  Defines relation with other user; ex: invited_by: user(join_on_property: "invited_by_id") { id }
  """
  user(foreign_property: String = "id", join_on_property: String = "user_id"): User @deprecated(reason: "use `related_users`")
}

type UserListingCollection {
  aggregations: Aggregations!
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  page: Int! @deprecated(reason: "use current_page")
  per_page: Int!
  results: [UserListing!]
  size: Int!
  total_entries: Int!
  total_pages: Int!
}

type UserOtpDeleteTokenInformation {
  otp_name: String
  status: String!

  """
  ID of the user
  """
  user_id: ID!
}

type UserOtpSecretRefreshInformation {
  otp_name: String
  status: String!

  """
  ID of the user
  """
  user_id: ID!
}

input UserProfileImportType {
  addresses: [AddressImport!]
  attachments: [AttachmentsImport!]

  """
  ID will be stored as external_id, relations will be preseved. We generate it when empty.
  """
  id: ID
  images: [ImagesImport!]

  """
  ex. {"color": "red"}
  """
  properties: HashObject
  type_name: String!
}

input UserProfileInputType {
  name: String
  values: DefaultProfileInputType
}

"""
Schema for user profile (old name was UserProfileType)
"""
type UserProfileSchema implements AdminPropertiesInterface & AdminSharedAttributesInterface {
  created_at: JSONDate!

  """
  Deprecated, use properties instead.
  """
  fields: [Property!]! @deprecated(reason: "Use properties")
  id: ID!
  metadata: HashObject
  name: String!
  parameterized_name: String!

  """
  defines the physical path of the file
  """
  physical_file_path: String

  """
  List of properties attributes to be included in the results
  """
  properties: [Property!]!
  updated_at: JSONDate!
}

type UserProfileSchemaCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [UserProfileSchema!]
  total_entries: Int!
  total_pages: Int!
}

input UserProfileSchemaInputType {
  """
  deprecated, use properties
  """
  fields: [NestedPropertyInputType]
  metadata: HashObject

  """
  deprecated - derived from physical_file_path
  """
  name: String

  """
  defines where the file definition will be available after pull; should start
  with the module name follow by private/public scope, for example
  manual/public/user_profile_types/my_user_profile
  """
  physical_file_path: String!
  properties: [NestedPropertyInputType]
}

input UserProfileSchemasFilterInput {
  created_at: DateFilter
  id: UniqIdFilter

  """
  Filter by metadata properties
  """
  metadata: [JsonbFilter!]
  name: StringFilter
  or: [UserProfileSchemasFilterInput!]
  parameterized_name: StringFilter
  physical_file_path: StringFilter
  updated_at: DateFilter
}

input UserProfileSchemasSortInput {
  created_at: StandardSort
  id: StandardSort
  metadata: [JsonbSort!]
  name: StandardSort
  parameterized_name: StandardSort
  physical_file_path: StandardSort
  updated_at: StandardSort
}

input UserProfileUpdateType {
  addresses: [AddressImport!]
  attachments: [AttachmentsImport!]

  """
  ID must match existing object id
  """
  id: ID!
  images: [ImagesImport!]

  """
  ex. {"color": "red"}
  """
  properties: HashObject
  type_name: String!
}

input UserPropertyInput {
  property_name: String!
}

input UserUpdate {
  created_at: JSONDate
  email: String!
  external_id: ID
  first_name: String

  """
  ID must match existing object id
  """
  id: ID!
  last_name: String
  middle_name: String
  name: String
  profiles: [UserProfileUpdateType!] = []
  slug: String!
  updated_at: JSONDate
}

input UsersFilterInput {
  created_at: DateFilter
  deleted_at: DateFilter
  email: StringFilter
  external_id: UniqIdFilter
  first_name: StringFilter
  id: UniqIdFilter
  last_name: StringFilter
  name: StringFilter

  """
  join arguments with OR operator
  """
  or: [UsersFilterInput!]
  profiles: [ProfileFilterInput!]
  properties: [PropertyFilterInput!]

  """
  deprecated, use related_records; filter by related models
  """
  related_models: [RelatedModelsFilterInput!]

  """
  filter by related records
  """
  related_records: [RelatedRecordsFilterInput!]
  related_users: [RelatedUsersFilterInput!]
  slug: StringFilter
  updated_at: DateFilter
}

input UsersSortInput {
  created_at: StandardSort
  deleted_at: StandardSort
  email: StandardSort
  external_id: StandardSort
  first_name: StandardSort
  id: StandardSort
  last_name: StandardSort
  name: StandardSort
  profile_properties: [PropertySort!]
  properties: [PropertySort!]
  slug: StandardSort
  updated_at: StandardSort
}

"""
Represents data for an upload.
"""
input ValueUploadInput {
  """
  Whether the file will be private or not - default private
  """
  acl: PropertyUploadACL = private

  """
  Cache-Control header for the file
  """
  cache_control: String

  """
  Data for the upload, required unless is url provided
  """
  content: String

  """
  Content-Disposition header for the file, for example "attachment; filename=foo.bar;"
  """
  content_disposition: String

  """
  Content-Type header for the file, for example "text/csv; charset=UTF-8"
  """
  content_type: String

  """
  Encrypt the content
  """
  encryption: PropertyUploadEncryptionInput

  """
  Files will be stored in <table name>/<property name>/<file_path>. If you do
  not provide file_path, then we will use <uuid>/<property_name>. If you
  override this, BE CAREFUL TO NOT OVERRIDE YOUR OWN FILES AND GENERATE UNIQUE
  PATH PER RECORD
  """
  file_path: String

  """
  Url to external file, which will be downloaded and uploaded to file_path,
  required unless content is provided. Will take precedence over content argument.
  """
  remote_url: String

  """
  Generate file synchronously
  """
  synchronous: Boolean = false

  """
  Type of the upload. If set to image, versions will be automatically fetched based on the property configuration
  """
  type: ValueUploadInputTypeEnum!
}

"""
Type for upload data
"""
enum ValueUploadInputTypeEnum {
  """
  Image upload, generate versions
  """
  image

  """
  Data for a PDF upload
  """
  pdf

  """
  Data for a plain upload, without any processing
  """
  plain
}

enum VectorDistanceEnum {
  """
  euclidean distance between vectors
  """
  euclidean
}

input VectorDistanceSort {
  embedding: [Float!]
  order: VectorDistanceEnum!
}

"""
Version of object change from the last 7 days.
"""
type Version {
  """
  timestamp when the event happened
  """
  created_at: JSONDate!
  event: VersionAction!
  id: ID!

  """
  id of an object which has been created/updated/deleted
  """
  item_id: ID!

  """
  type of an object which has been created/updated/deleted
  """
  item_type: VersionItemType!

  """
  json representation of a resource prior to the action; null for create action
  """
  resource: HashObject

  """
  most of the time ID of a User who performed the event. Can be something else if action was taken by pOS support team
  """
  whodunnit: String
}

enum VersionAction {
  """
  create
  """
  create

  """
  destroy
  """
  destroy

  """
  update
  """
  update
}

type VersionCollection {
  current_page: Int!
  has_next_page: Boolean!
  has_previous_page: Boolean!
  per_page: Int!
  results: [Version!]
  total_entries: Int!
  total_pages: Int!
}

input VersionFilterInput {
  created_at: DateFilter
  event: StringFilter
  id: UniqIdFilter
  item_id: UniqIdFilter
  item_type: StringFilter
  or: [VersionFilterInput!]
  updated_at: DateFilter
  whodunnit: StringFilter
}

input VersionInput {
  manipulate: VersionManipulateInput

  """
  name of the version, for example thumb
  """
  name: String!
  output: VersionOutputInput
  resize: VersionResizeInput
}

enum VersionItemType {
  """
  Model
  """
  Customization

  """
  User
  """
  User

  """
  UserProfile
  """
  UserProfile
}

input VersionManipulateInput {
  """
  value representing the sigma of the Gaussian mask, where sigma = 1 + radius / 2
  """
  blur: ImageBlur

  """
  color for flatten
  """
  flatten: CssColor = "#000000"

  """
  Convert to 8-bit greyscale; 256 shades of grey.
  """
  greyscale: Boolean = false
}

input VersionOutputInput {
  format: ImageFormat

  """
  Defines the quality of the image; used to automatically compress the image; 0
  - lowest quality, 100 - highest quality. Defaults: PNG: 80, WEBP: 80, JPEG: 85
  """
  quality: ImageQuality
}

input VersionResizeInput {
  """
  background color when using a fit of containDefault: #000000
  """
  background: CssColor
  fit: ImageResizeFit = cover

  """
  max height of an image. If left undefined, will depend on other parameters to determine size (like: width)
  """
  height: Int

  """
  position to use when fit is cover or contain
  """
  position: ImageResizePosition

  """
  max width of an image. If left undefined, will depend on other parameters to determine size (like: height) 
  """
  width: Int

  """
  do not enlarge if the width or height are already less than the specified dimensions
  """
  without_enlargement: Boolean = false
}

input VersionSortInput {
  created_at: StandardSort
  event: StandardSort
  id: StandardSort
  item_id: StandardSort
  item_type: StandardSort
  updated_at: StandardSort
  whodunnit: StandardSort
}
