66 lines
1.8 KiB
Ruby
66 lines
1.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
module Integrations
|
|
class StiType < ActiveRecord::Type::String
|
|
NAMESPACED_INTEGRATIONS = Set.new(%w(
|
|
Asana Assembla Bamboo Bugzilla Buildkite Campfire Confluence CustomIssueTracker Datadog
|
|
Discord DroneCi EmailsOnPush Ewm ExternalWiki Flowdock HangoutsChat Irker Jenkins Jira Mattermost
|
|
MattermostSlashCommands MicrosoftTeams MockCi MockMonitoring Packagist PipelinesEmail Pivotaltracker
|
|
Prometheus Pushover Redmine Shimo Slack SlackSlashCommands Teamcity UnifyCircuit WebexTeams Youtrack Zentao
|
|
)).freeze
|
|
|
|
def self.namespaced_integrations
|
|
NAMESPACED_INTEGRATIONS
|
|
end
|
|
|
|
def cast(value)
|
|
new_cast(value) || super
|
|
end
|
|
|
|
def serialize(value)
|
|
new_serialize(value) || super
|
|
end
|
|
|
|
def deserialize(value)
|
|
value
|
|
end
|
|
|
|
def changed?(original_value, value, _new_value_before_type_cast)
|
|
original_value != serialize(value)
|
|
end
|
|
|
|
def changed_in_place?(original_value_for_database, value)
|
|
original_value_for_database != serialize(value)
|
|
end
|
|
|
|
private
|
|
|
|
def new_cast(value)
|
|
value = prepare_value(value)
|
|
return unless value
|
|
|
|
stripped_name = value.delete_suffix('Service')
|
|
return unless self.class.namespaced_integrations.include?(stripped_name)
|
|
|
|
"Integrations::#{stripped_name}"
|
|
end
|
|
|
|
def new_serialize(value)
|
|
value = prepare_value(value)
|
|
return unless value&.starts_with?('Integrations::')
|
|
|
|
"#{value.delete_prefix('Integrations::')}Service"
|
|
end
|
|
|
|
# Returns value cast to a `String`, or `nil` if value is `nil`.
|
|
def prepare_value(value)
|
|
return value if value.nil? || value.is_a?(String)
|
|
|
|
value.to_s
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
Gitlab::Integrations::StiType.prepend_mod
|