From 3d1a44472838b2ca223b0164ced9ce7db8860c49 Mon Sep 17 00:00:00 2001 From: Rogers Date: Fri, 19 May 2023 19:58:56 -0500 Subject: [PATCH] * refactor requirements module * tiny clean up --- lib/build_errors_abstract.rb | 155 ++++++++++++++++++ .../validations/requirements.rb | 154 +---------------- 2 files changed, 156 insertions(+), 153 deletions(-) create mode 100644 lib/build_errors_abstract.rb diff --git a/lib/build_errors_abstract.rb b/lib/build_errors_abstract.rb new file mode 100644 index 00000000..5f92a8f7 --- /dev/null +++ b/lib/build_errors_abstract.rb @@ -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 diff --git a/lib/zendesk_apps_support/validations/requirements.rb b/lib/zendesk_apps_support/validations/requirements.rb index fed6c3b6..e1a5f7ef 100644 --- a/lib/zendesk_apps_support/validations/requirements.rb +++ b/lib/zendesk_apps_support/validations/requirements.rb @@ -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