Skip to content

Commit

Permalink
* refactor requirements module
Browse files Browse the repository at this point in the history
* tiny clean up
  • Loading branch information
Rogers authored and Rogers committed May 20, 2023
1 parent a8aeaac commit 3d1a444
Show file tree
Hide file tree
Showing 2 changed files with 156 additions and 153 deletions.
155 changes: 155 additions & 0 deletions lib/build_errors_abstract.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
# frozen_string_literal: true

class BuildErrors
def self.build_errors(requirements, obj=nil)
subclasses_errors = ObjectSpace.each_object(Class).select { |klass| klass < self }

errors = []
subclasses_errors.each do |subclass_error|
errors << subclass_error.invalid_requirements(requirements, obj=obj)
end
return errors
end

def self.invalid_requirements(requirements, obj=nil)
raise NotImplementedError, "Must be implemented in a subclass"
end
end

class InvalidCustomFields < BuildErrors
def self.invalid_requirements(requirements, obj=nil)
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
end

class InvalidCustomObjects < BuildErrors
def self.invalid_requirements(requirements, obj=nil)
custom_objects = requirements[ZendeskAppsSupport::AppRequirement::CUSTOM_OBJECTS_KEY]
return if custom_objects.nil?

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

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

valid_schema.keys.each do |requirement_type|
(custom_objects[requirement_type] || []).each do |requirement|
obj.send(:validate_custom_objects_keys, requirement.keys,
valid_schema[requirement_type], requirement_type, errors)
end
end
end
end
end

class InvalidRequirementsTypes < BuildErrors
def self.invalid_requirements(requirements, obj=nil)
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
end

class InvalidChannelIntegrations < BuildErrors
def self.invalid_requirements(requirements, obj=nil)
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
end

class InvalidWebhooks < BuildErrors
def self.invalid_requirements(requirements, obj=nil)
webhook_requirements = requirements[ZendeskAppsSupport::AppRequirement::WEBHOOKS_KEY]

return if webhook_requirements.nil?

webhook_requirements.map do |identifier, requirement|
obj.send(:validate_webhook_keys, identifier, requirement)
end.flatten
end
end

class ExcessiveCustomObjectsRequirements < BuildErrors
def self.invalid_requirements(requirements, obj=nil)
custom_objects = requirements[ZendeskAppsSupport::AppRequirement::CUSTOM_OBJECTS_KEY]
return unless custom_objects

count = custom_objects.values.flatten.size
if count > obj::MAX_CUSTOM_OBJECTS_REQUIREMENTS
ValidationError.new(:excessive_custom_objects_requirements, max: obj::MAX_CUSTOM_OBJECTS_REQUIREMENTS,
count: count)
end
end
end

class ExcessiveRequirements < BuildErrors
def self.invalid_requirements(requirements, obj=nil)
count = requirements.values.map do |req|
req.is_a?(Hash) ? req.values : req
end.flatten.size
ValidationError.new(:excessive_requirements, max: obj::MAX_REQUIREMENTS, count: count) if count > obj::MAX_REQUIREMENTS
end
end

class MissingRequiredFields < BuildErrors
def self.invalid_requirements(requirements, obj=nil)
[].tap do |errors|
requirements.each do |requirement_type, requirement|
next if %w[channel_integrations custom_objects webhooks].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
end

class InvalidTargetTypes < BuildErrors
def self.invalid_requirements(requirements, obj=nil)
invalid_target_types = %w[http_target url_target_v2]

requirements['targets']&.map do |_identifier, requirement|
if invalid_target_types.include?(requirement['type'])
ValidationError.new(:invalid_requirements_types,
invalid_types: "targets -> #{requirement['type']}",
count: 1)
end
end
end
end
154 changes: 1 addition & 153 deletions lib/zendesk_apps_support/validations/requirements.rb
Original file line number Diff line number Diff line change
@@ -1,158 +1,6 @@
# frozen_string_literal: true

class BuildErrors
def self.build_errors(requirements, obj=nil)
subclasses_errors = ObjectSpace.each_object(Class).select { |klass| klass < self }

errors = []
subclasses_errors.each do |subclasse_error|
errors << subclasse_error.invalid_requirements(requirements, obj=obj)
end
return errors
end

def invalid_requirements(requirements, obj=nil)
raise NotImplementedError, "Must be implemented in a subclass"
end
end

class InvalidCustomFields < BuildErrors
def self.invalid_requirements(requirements, obj=nil)
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
end

class InvalidCustomObjects < BuildErrors
def self.invalid_requirements(requirements, obj=nil)
custom_objects = requirements[ZendeskAppsSupport::AppRequirement::CUSTOM_OBJECTS_KEY]
return if custom_objects.nil?

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

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

valid_schema.keys.each do |requirement_type|
(custom_objects[requirement_type] || []).each do |requirement|
obj.send(:validate_custom_objects_keys, requirement.keys,
valid_schema[requirement_type], requirement_type, errors)
end
end
end
end
end

class InvalidRequirementsTypes < BuildErrors
def self.invalid_requirements(requirements, obj=nil)
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
end

class InvalidChannelIntegrations < BuildErrors
def self.invalid_requirements(requirements, obj=nil)
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
end

class InvalidWebhooks < BuildErrors
def self.invalid_requirements(requirements, obj=nil)
webhook_requirements = requirements[ZendeskAppsSupport::AppRequirement::WEBHOOKS_KEY]

return if webhook_requirements.nil?

webhook_requirements.map do |identifier, requirement|
obj.send(:validate_webhook_keys, identifier, requirement)
end.flatten
end
end

class ExcessiveCustomObjectsRequirements < BuildErrors
def self.invalid_requirements(requirements, obj=nil)
custom_objects = requirements[ZendeskAppsSupport::AppRequirement::CUSTOM_OBJECTS_KEY]
return unless custom_objects

count = custom_objects.values.flatten.size
if count > obj::MAX_CUSTOM_OBJECTS_REQUIREMENTS
ValidationError.new(:excessive_custom_objects_requirements, max: obj::MAX_CUSTOM_OBJECTS_REQUIREMENTS,
count: count)
end
end
end

class ExcessiveRequirements < BuildErrors
def self.invalid_requirements(requirements, obj=nil)
count = requirements.values.map do |req|
req.is_a?(Hash) ? req.values : req
end.flatten.size
ValidationError.new(:excessive_requirements, max: obj::MAX_REQUIREMENTS, count: count) if count > obj::MAX_REQUIREMENTS
end
end

class MissingRequiredFields < BuildErrors
def self.invalid_requirements(requirements, obj=nil)
[].tap do |errors|
requirements.each do |requirement_type, requirement|
next if %w[channel_integrations custom_objects webhooks].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
end

class InvalidTargetTypes < BuildErrors
def self.invalid_requirements(requirements, obj=nil)
invalid_target_types = %w[http_target url_target_v2]

requirements['targets']&.map do |_identifier, requirement|
if invalid_target_types.include?(requirement['type'])
ValidationError.new(:invalid_requirements_types,
invalid_types: "targets -> #{requirement['type']}",
count: 1)
end
end
end
end
require 'build_errors_abstract'

module ZendeskAppsSupport
module Validations
Expand Down

0 comments on commit 3d1a444

Please sign in to comment.