module ZendeskAppsSupport::Validations::Requirements

Constants

MAX_CUSTOM_OBJECTS_REQUIREMENTS
MAX_REQUIREMENTS

Public Class Methods

call(package) click to toggle source
# File lib/zendesk_apps_support/validations/requirements.rb, line 10
def call(package)
  if package.manifest.requirements_only? && !package.has_requirements?
    return [ValidationError.new(:missing_requirements)]
  elsif !supports_requirements(package) && package.has_requirements?
    return [ValidationError.new(:requirements_not_supported)]
  elsif !package.has_requirements?
    return []
  end

  begin
    requirements = package.requirements_json
  rescue ZendeskAppsSupport::Manifest::OverrideError => e
    return [ValidationError.new(:duplicate_requirements, duplicate_keys: e.key, count: 1)]
  end

  [].tap do |errors|
    errors << invalid_requirements_types(requirements)
    errors << excessive_requirements(requirements)
    errors << excessive_custom_objects_requirements(requirements)
    errors << invalid_channel_integrations(requirements)
    errors << invalid_custom_fields(requirements)
    errors << invalid_custom_objects(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_custom_objects_requirements(requirements) click to toggle source
# File lib/zendesk_apps_support/validations/requirements.rb, line 67
def excessive_custom_objects_requirements(requirements)
  custom_objects = requirements[AppRequirement::CUSTOM_OBJECTS_KEY]
  return unless custom_objects

  count = custom_objects.values.flatten.size
  if count > MAX_CUSTOM_OBJECTS_REQUIREMENTS
    ValidationError.new(:excessive_custom_objects_requirements, max: MAX_CUSTOM_OBJECTS_REQUIREMENTS,
                                                                count: count)
  end
end
excessive_requirements(requirements) click to toggle source
# File lib/zendesk_apps_support/validations/requirements.rb, line 60
def excessive_requirements(requirements)
  count = requirements.values.map do |req|
    req.is_a?(Hash) ? req.values : req
  end.flatten.size
  ValidationError.new(:excessive_requirements, max: MAX_REQUIREMENTS, count: count) if count > MAX_REQUIREMENTS
end
invalid_channel_integrations(requirements) click to toggle source
# File lib/zendesk_apps_support/validations/requirements.rb, line 94
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)
    end
    channel_integrations.each do |identifier, fields|
      next if fields.include? 'manifest_url'
      errors << ValidationError.new(:missing_required_fields,
                                    field: 'manifest_url',
                                    identifier: identifier)
    end
  end
end
invalid_custom_fields(requirements) click to toggle source
# File lib/zendesk_apps_support/validations/requirements.rb, line 78
def invalid_custom_fields(requirements)
  user_fields = requirements['user_fields']
  organization_fields = requirements['organization_fields']
  return if user_fields.nil? && organization_fields.nil?
  [].tap do |errors|
    [user_fields, organization_fields].compact.each do |field_group|
      field_group.each do |identifier, fields|
        next if fields.include? 'key'
        errors << ValidationError.new(:missing_required_fields,
                                      field: 'key',
                                      identifier: identifier)
      end
    end
  end
end
invalid_custom_objects(requirements) click to toggle source
# File lib/zendesk_apps_support/validations/requirements.rb, line 110
def invalid_custom_objects(requirements)
  custom_objects = requirements[AppRequirement::CUSTOM_OBJECTS_KEY]
  return if custom_objects.nil?

  [].tap do |errors|
    unless custom_objects.key?(AppRequirement::CUSTOM_OBJECTS_TYPE_KEY)
      errors << ValidationError.new(:missing_required_fields,
                                    field: AppRequirement::CUSTOM_OBJECTS_TYPE_KEY,
                                    identifier: AppRequirement::CUSTOM_OBJECTS_KEY)
    end

    valid_schema = {
      AppRequirement::CUSTOM_OBJECTS_TYPE_KEY => %w[key schema],
      AppRequirement::CUSTOM_OBJECTS_RELATIONSHIP_TYPE_KEY => %w[key source target]
    }

    valid_schema.keys.each do |requirement_type|
      (custom_objects[requirement_type] || []).each do |requirement|
        validate_custom_objects_keys(requirement.keys, valid_schema[requirement_type], requirement_type, errors)
      end
    end
  end
end
invalid_requirements_types(requirements) click to toggle source
# File lib/zendesk_apps_support/validations/requirements.rb, line 134
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
missing_required_fields(requirements) click to toggle source
# File lib/zendesk_apps_support/validations/requirements.rb, line 46
def missing_required_fields(requirements)
  [].tap do |errors|
    requirements.each do |requirement_type, requirement|
      next if %w[channel_integrations custom_objects].include? requirement_type
      requirement.each do |identifier, fields|
        next if fields.nil? || fields.include?('title')
        errors << ValidationError.new(:missing_required_fields,
                                      field: 'title',
                                      identifier: identifier)
      end
    end
  end
end
supports_requirements(package) click to toggle source
# File lib/zendesk_apps_support/validations/requirements.rb, line 42
def supports_requirements(package)
  !package.manifest.marketing_only? && package.manifest.products_ignore_locations != [Product::CHAT]
end
validate_custom_objects_keys(keys, expected_keys, identifier, errors = []) click to toggle source
# File lib/zendesk_apps_support/validations/requirements.rb, line 143
def validate_custom_objects_keys(keys, expected_keys, identifier, errors = [])
  missing_keys = expected_keys - keys
  missing_keys.each do |key|
    errors << ValidationError.new(:missing_required_fields,
                                  field: key,
                                  identifier: identifier)
  end
end