Skip to content

Commit 3d1a444

Browse files
RogersRogers
authored andcommitted
* refactor requirements module
* tiny clean up
1 parent a8aeaac commit 3d1a444

File tree

2 files changed

+156
-153
lines changed

2 files changed

+156
-153
lines changed

lib/build_errors_abstract.rb

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
# frozen_string_literal: true
2+
3+
class BuildErrors
4+
def self.build_errors(requirements, obj=nil)
5+
subclasses_errors = ObjectSpace.each_object(Class).select { |klass| klass < self }
6+
7+
errors = []
8+
subclasses_errors.each do |subclass_error|
9+
errors << subclass_error.invalid_requirements(requirements, obj=obj)
10+
end
11+
return errors
12+
end
13+
14+
def self.invalid_requirements(requirements, obj=nil)
15+
raise NotImplementedError, "Must be implemented in a subclass"
16+
end
17+
end
18+
19+
class InvalidCustomFields < BuildErrors
20+
def self.invalid_requirements(requirements, obj=nil)
21+
user_fields = requirements['user_fields']
22+
organization_fields = requirements['organization_fields']
23+
return if user_fields.nil? && organization_fields.nil?
24+
[].tap do |errors|
25+
[user_fields, organization_fields].compact.each do |field_group|
26+
field_group.each do |identifier, fields|
27+
next if fields.include? 'key'
28+
errors << ValidationError.new(:missing_required_fields,
29+
field: 'key',
30+
identifier: identifier)
31+
end
32+
end
33+
end
34+
end
35+
end
36+
37+
class InvalidCustomObjects < BuildErrors
38+
def self.invalid_requirements(requirements, obj=nil)
39+
custom_objects = requirements[ZendeskAppsSupport::AppRequirement::CUSTOM_OBJECTS_KEY]
40+
return if custom_objects.nil?
41+
42+
[].tap do |errors|
43+
unless custom_objects.key?(ZendeskAppsSupport::AppRequirement::CUSTOM_OBJECTS_TYPE_KEY)
44+
errors << ValidationError.new(:missing_required_fields,
45+
field: ZendeskAppsSupport::AppRequirement::CUSTOM_OBJECTS_TYPE_KEY,
46+
identifier: ZendeskAppsSupport::AppRequirement::CUSTOM_OBJECTS_KEY)
47+
end
48+
49+
valid_schema = {
50+
ZendeskAppsSupport::AppRequirement::CUSTOM_OBJECTS_TYPE_KEY => %w[key schema],
51+
ZendeskAppsSupport::AppRequirement::CUSTOM_OBJECTS_RELATIONSHIP_TYPE_KEY => %w[key source target]
52+
}
53+
54+
valid_schema.keys.each do |requirement_type|
55+
(custom_objects[requirement_type] || []).each do |requirement|
56+
obj.send(:validate_custom_objects_keys, requirement.keys,
57+
valid_schema[requirement_type], requirement_type, errors)
58+
end
59+
end
60+
end
61+
end
62+
end
63+
64+
class InvalidRequirementsTypes < BuildErrors
65+
def self.invalid_requirements(requirements, obj=nil)
66+
invalid_types = requirements.keys - ZendeskAppsSupport::AppRequirement::TYPES
67+
unless invalid_types.empty?
68+
ValidationError.new(:invalid_requirements_types,
69+
invalid_types: invalid_types.join(', '),
70+
count: invalid_types.length)
71+
end
72+
end
73+
end
74+
75+
class InvalidChannelIntegrations < BuildErrors
76+
def self.invalid_requirements(requirements, obj=nil)
77+
channel_integrations = requirements['channel_integrations']
78+
return unless channel_integrations
79+
[].tap do |errors|
80+
if channel_integrations.size > 1
81+
errors << ValidationError.new(:multiple_channel_integrations)
82+
end
83+
channel_integrations.each do |identifier, fields|
84+
next if fields.include? 'manifest_url'
85+
errors << ValidationError.new(:missing_required_fields,
86+
field: 'manifest_url',
87+
identifier: identifier)
88+
end
89+
end
90+
end
91+
end
92+
93+
class InvalidWebhooks < BuildErrors
94+
def self.invalid_requirements(requirements, obj=nil)
95+
webhook_requirements = requirements[ZendeskAppsSupport::AppRequirement::WEBHOOKS_KEY]
96+
97+
return if webhook_requirements.nil?
98+
99+
webhook_requirements.map do |identifier, requirement|
100+
obj.send(:validate_webhook_keys, identifier, requirement)
101+
end.flatten
102+
end
103+
end
104+
105+
class ExcessiveCustomObjectsRequirements < BuildErrors
106+
def self.invalid_requirements(requirements, obj=nil)
107+
custom_objects = requirements[ZendeskAppsSupport::AppRequirement::CUSTOM_OBJECTS_KEY]
108+
return unless custom_objects
109+
110+
count = custom_objects.values.flatten.size
111+
if count > obj::MAX_CUSTOM_OBJECTS_REQUIREMENTS
112+
ValidationError.new(:excessive_custom_objects_requirements, max: obj::MAX_CUSTOM_OBJECTS_REQUIREMENTS,
113+
count: count)
114+
end
115+
end
116+
end
117+
118+
class ExcessiveRequirements < BuildErrors
119+
def self.invalid_requirements(requirements, obj=nil)
120+
count = requirements.values.map do |req|
121+
req.is_a?(Hash) ? req.values : req
122+
end.flatten.size
123+
ValidationError.new(:excessive_requirements, max: obj::MAX_REQUIREMENTS, count: count) if count > obj::MAX_REQUIREMENTS
124+
end
125+
end
126+
127+
class MissingRequiredFields < BuildErrors
128+
def self.invalid_requirements(requirements, obj=nil)
129+
[].tap do |errors|
130+
requirements.each do |requirement_type, requirement|
131+
next if %w[channel_integrations custom_objects webhooks].include? requirement_type
132+
requirement.each do |identifier, fields|
133+
next if fields.nil? || fields.include?('title')
134+
errors << ValidationError.new(:missing_required_fields,
135+
field: 'title',
136+
identifier: identifier)
137+
end
138+
end
139+
end
140+
end
141+
end
142+
143+
class InvalidTargetTypes < BuildErrors
144+
def self.invalid_requirements(requirements, obj=nil)
145+
invalid_target_types = %w[http_target url_target_v2]
146+
147+
requirements['targets']&.map do |_identifier, requirement|
148+
if invalid_target_types.include?(requirement['type'])
149+
ValidationError.new(:invalid_requirements_types,
150+
invalid_types: "targets -> #{requirement['type']}",
151+
count: 1)
152+
end
153+
end
154+
end
155+
end

lib/zendesk_apps_support/validations/requirements.rb

Lines changed: 1 addition & 153 deletions
Original file line numberDiff line numberDiff line change
@@ -1,158 +1,6 @@
11
# frozen_string_literal: true
22

3-
class BuildErrors
4-
def self.build_errors(requirements, obj=nil)
5-
subclasses_errors = ObjectSpace.each_object(Class).select { |klass| klass < self }
6-
7-
errors = []
8-
subclasses_errors.each do |subclasse_error|
9-
errors << subclasse_error.invalid_requirements(requirements, obj=obj)
10-
end
11-
return errors
12-
end
13-
14-
def invalid_requirements(requirements, obj=nil)
15-
raise NotImplementedError, "Must be implemented in a subclass"
16-
end
17-
end
18-
19-
class InvalidCustomFields < BuildErrors
20-
def self.invalid_requirements(requirements, obj=nil)
21-
user_fields = requirements['user_fields']
22-
organization_fields = requirements['organization_fields']
23-
return if user_fields.nil? && organization_fields.nil?
24-
[].tap do |errors|
25-
[user_fields, organization_fields].compact.each do |field_group|
26-
field_group.each do |identifier, fields|
27-
next if fields.include? 'key'
28-
errors << ValidationError.new(:missing_required_fields,
29-
field: 'key',
30-
identifier: identifier)
31-
end
32-
end
33-
end
34-
end
35-
end
36-
37-
class InvalidCustomObjects < BuildErrors
38-
def self.invalid_requirements(requirements, obj=nil)
39-
custom_objects = requirements[ZendeskAppsSupport::AppRequirement::CUSTOM_OBJECTS_KEY]
40-
return if custom_objects.nil?
41-
42-
[].tap do |errors|
43-
unless custom_objects.key?(ZendeskAppsSupport::AppRequirement::CUSTOM_OBJECTS_TYPE_KEY)
44-
errors << ValidationError.new(:missing_required_fields,
45-
field: ZendeskAppsSupport::AppRequirement::CUSTOM_OBJECTS_TYPE_KEY,
46-
identifier: ZendeskAppsSupport::AppRequirement::CUSTOM_OBJECTS_KEY)
47-
end
48-
49-
valid_schema = {
50-
ZendeskAppsSupport::AppRequirement::CUSTOM_OBJECTS_TYPE_KEY => %w[key schema],
51-
ZendeskAppsSupport::AppRequirement::CUSTOM_OBJECTS_RELATIONSHIP_TYPE_KEY => %w[key source target]
52-
}
53-
54-
valid_schema.keys.each do |requirement_type|
55-
(custom_objects[requirement_type] || []).each do |requirement|
56-
obj.send(:validate_custom_objects_keys, requirement.keys,
57-
valid_schema[requirement_type], requirement_type, errors)
58-
end
59-
end
60-
end
61-
end
62-
end
63-
64-
class InvalidRequirementsTypes < BuildErrors
65-
def self.invalid_requirements(requirements, obj=nil)
66-
invalid_types = requirements.keys - ZendeskAppsSupport::AppRequirement::TYPES
67-
unless invalid_types.empty?
68-
ValidationError.new(:invalid_requirements_types,
69-
invalid_types: invalid_types.join(', '),
70-
count: invalid_types.length)
71-
end
72-
end
73-
end
74-
75-
class InvalidChannelIntegrations < BuildErrors
76-
def self.invalid_requirements(requirements, obj=nil)
77-
channel_integrations = requirements['channel_integrations']
78-
return unless channel_integrations
79-
[].tap do |errors|
80-
if channel_integrations.size > 1
81-
errors << ValidationError.new(:multiple_channel_integrations)
82-
end
83-
channel_integrations.each do |identifier, fields|
84-
next if fields.include? 'manifest_url'
85-
errors << ValidationError.new(:missing_required_fields,
86-
field: 'manifest_url',
87-
identifier: identifier)
88-
end
89-
end
90-
end
91-
end
92-
93-
class InvalidWebhooks < BuildErrors
94-
def self.invalid_requirements(requirements, obj=nil)
95-
webhook_requirements = requirements[ZendeskAppsSupport::AppRequirement::WEBHOOKS_KEY]
96-
97-
return if webhook_requirements.nil?
98-
99-
webhook_requirements.map do |identifier, requirement|
100-
obj.send(:validate_webhook_keys, identifier, requirement)
101-
end.flatten
102-
end
103-
end
104-
105-
class ExcessiveCustomObjectsRequirements < BuildErrors
106-
def self.invalid_requirements(requirements, obj=nil)
107-
custom_objects = requirements[ZendeskAppsSupport::AppRequirement::CUSTOM_OBJECTS_KEY]
108-
return unless custom_objects
109-
110-
count = custom_objects.values.flatten.size
111-
if count > obj::MAX_CUSTOM_OBJECTS_REQUIREMENTS
112-
ValidationError.new(:excessive_custom_objects_requirements, max: obj::MAX_CUSTOM_OBJECTS_REQUIREMENTS,
113-
count: count)
114-
end
115-
end
116-
end
117-
118-
class ExcessiveRequirements < BuildErrors
119-
def self.invalid_requirements(requirements, obj=nil)
120-
count = requirements.values.map do |req|
121-
req.is_a?(Hash) ? req.values : req
122-
end.flatten.size
123-
ValidationError.new(:excessive_requirements, max: obj::MAX_REQUIREMENTS, count: count) if count > obj::MAX_REQUIREMENTS
124-
end
125-
end
126-
127-
class MissingRequiredFields < BuildErrors
128-
def self.invalid_requirements(requirements, obj=nil)
129-
[].tap do |errors|
130-
requirements.each do |requirement_type, requirement|
131-
next if %w[channel_integrations custom_objects webhooks].include? requirement_type
132-
requirement.each do |identifier, fields|
133-
next if fields.nil? || fields.include?('title')
134-
errors << ValidationError.new(:missing_required_fields,
135-
field: 'title',
136-
identifier: identifier)
137-
end
138-
end
139-
end
140-
end
141-
end
142-
143-
class InvalidTargetTypes < BuildErrors
144-
def self.invalid_requirements(requirements, obj=nil)
145-
invalid_target_types = %w[http_target url_target_v2]
146-
147-
requirements['targets']&.map do |_identifier, requirement|
148-
if invalid_target_types.include?(requirement['type'])
149-
ValidationError.new(:invalid_requirements_types,
150-
invalid_types: "targets -> #{requirement['type']}",
151-
count: 1)
152-
end
153-
end
154-
end
155-
end
3+
require 'build_errors_abstract'
1564

1575
module ZendeskAppsSupport
1586
module Validations

0 commit comments

Comments
 (0)