# 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 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