module ZendeskAppsSupport::Validations::Requirements

Constants

MAX_REQUIREMENTS

Public Class Methods

call(package) click to toggle source
# File lib/zendesk_apps_support/validations/requirements.rb, line 10
def call(package)
  requirements_file = package.files.find { |f| f.relative_path == 'requirements.json' }

  return [ValidationError.new(:missing_requirements)] unless requirements_file

  requirements_stream = requirements_file.read
  duplicates = non_unique_type_keys(requirements_stream)
  unless duplicates.empty?
    return [ValidationError.new(:duplicate_requirements, duplicate_keys: duplicates.join(', '), count: duplicates.length)]
  end

  requirements = JSON.load(requirements_stream)
  [].tap do |errors|
    errors << invalid_requirements_types(requirements)
    errors << excessive_requirements(requirements)
    errors << invalid_channel_integrations(requirements)
    errors << invalid_user_fields(requirements)
    errors << missing_required_fields(requirements)
    errors.flatten!
    errors.compact!
  end
rescue JSON::ParserError => e
  return [ValidationError.new(:requirements_not_json, errors: e)]
end

Private Class Methods

excessive_requirements(requirements) click to toggle source
# File lib/zendesk_apps_support/validations/requirements.rb, line 49
def excessive_requirements(requirements)
  requirement_count = requirements.values.map(&:values).flatten.size
  if requirement_count > MAX_REQUIREMENTS
    ValidationError.new(:excessive_requirements, max: MAX_REQUIREMENTS, count: requirement_count)
  end
end
invalid_channel_integrations(requirements) click to toggle source
# File lib/zendesk_apps_support/validations/requirements.rb, line 67
def invalid_channel_integrations(requirements)
  channel_integrations = requirements['channel_integrations']
  return unless channel_integrations
  [].tap do |errors|
    if channel_integrations.size > 1
      errors << ValidationError.new(:multiple_channel_integrations, count: channel_integrations.size)
    end
    channel_integrations.each do |identifier, fields|
      unless fields.include? 'manifest_url'
        errors << ValidationError.new(:missing_required_fields, field: 'manifest_url', identifier: identifier)
      end
    end
  end
end
invalid_requirements_types(requirements) click to toggle source
# File lib/zendesk_apps_support/validations/requirements.rb, line 82
def invalid_requirements_types(requirements)
  invalid_types = requirements.keys - ZendeskAppsSupport::AppRequirement::TYPES

  unless invalid_types.empty?
    ValidationError.new(:invalid_requirements_types, invalid_types: invalid_types.join(', '), count: invalid_types.length)
  end
end
invalid_user_fields(requirements) click to toggle source
# File lib/zendesk_apps_support/validations/requirements.rb, line 56
def invalid_user_fields(requirements)
  user_fields = requirements['user_fields']
  return unless user_fields
  [].tap do |errors|
    user_fields.each do |identifier, fields|
      next if fields.include? 'key'
      errors << ValidationError.new(:missing_required_fields, field: 'key', identifier: identifier)
    end
  end
end
missing_required_fields(requirements) click to toggle source
# File lib/zendesk_apps_support/validations/requirements.rb, line 37
def missing_required_fields(requirements)
  [].tap do |errors|
    requirements.each do |requirement_type, requirement|
      next if requirement_type == 'channel_integrations'
      requirement.each do |identifier, fields|
        next if fields.include? 'title'
        errors << ValidationError.new(:missing_required_fields, field: 'title', identifier: identifier)
      end
    end
  end
end
non_unique_type_keys(requirements) click to toggle source
# File lib/zendesk_apps_support/validations/requirements.rb, line 90
def non_unique_type_keys(requirements)
  keys = []
  duplicates = []
  parser = JSON::Stream::Parser.new do
    start_object { keys.push({}) }
    end_object { keys.pop }
    key { |k| duplicates.push(k) if keys.last.include? k; keys.last[k] = nil }
  end
  parser << requirements

  duplicates
end