Welcome to mirror list, hosted at ThFree Co, Russian Federation.

20210818175949_update_integrations_trigger_type_new_on_insert.rb « migrate « db - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 2999a6fd4f6d65ed94a426aea898215a18da465e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# frozen_string_literal: true

class UpdateIntegrationsTriggerTypeNewOnInsert < ActiveRecord::Migration[6.1]
  include Gitlab::Database::SchemaHelpers

  FUNCTION_NAME = 'integrations_set_type_new'

  def up
    # Update `type_new` dynamically based on `type`.
    #
    # The old class names are in the format `AbcService`, and the new ones `Integrations::Abc`.
    create_trigger_function(FUNCTION_NAME, replace: true) do
      <<~SQL
        UPDATE integrations SET type_new = regexp_replace(NEW.type, '\\A(.+)Service\\Z', 'Integrations::\\1')
        WHERE integrations.id = NEW.id;
        RETURN NULL;
      SQL
    end
  end

  def down
    # We initially went with this static mapping since we assumed that new integrations could
    # just use the correct class name directly in `type`, but this will complicate the data migration
    # since we plan to drop `type` at some point and replace it with `type_new`, so we still need
    # to keep this column filled for all records.
    create_trigger_function(FUNCTION_NAME, replace: true) do
      <<~SQL
        WITH mapping(old_type, new_type) AS (VALUES
          ('AsanaService',                   'Integrations::Asana'),
          ('AssemblaService',                'Integrations::Assembla'),
          ('BambooService',                  'Integrations::Bamboo'),
          ('BugzillaService',                'Integrations::Bugzilla'),
          ('BuildkiteService',               'Integrations::Buildkite'),
          ('CampfireService',                'Integrations::Campfire'),
          ('ConfluenceService',              'Integrations::Confluence'),
          ('CustomIssueTrackerService',      'Integrations::CustomIssueTracker'),
          ('DatadogService',                 'Integrations::Datadog'),
          ('DiscordService',                 'Integrations::Discord'),
          ('DroneCiService',                 'Integrations::DroneCi'),
          ('EmailsOnPushService',            'Integrations::EmailsOnPush'),
          ('EwmService',                     'Integrations::Ewm'),
          ('ExternalWikiService',            'Integrations::ExternalWiki'),
          ('FlowdockService',                'Integrations::Flowdock'),
          ('HangoutsChatService',            'Integrations::HangoutsChat'),
          ('IrkerService',                   'Integrations::Irker'),
          ('JenkinsService',                 'Integrations::Jenkins'),
          ('JiraService',                    'Integrations::Jira'),
          ('MattermostService',              'Integrations::Mattermost'),
          ('MattermostSlashCommandsService', 'Integrations::MattermostSlashCommands'),
          ('MicrosoftTeamsService',          'Integrations::MicrosoftTeams'),
          ('MockCiService',                  'Integrations::MockCi'),
          ('MockMonitoringService',          'Integrations::MockMonitoring'),
          ('PackagistService',               'Integrations::Packagist'),
          ('PipelinesEmailService',          'Integrations::PipelinesEmail'),
          ('PivotaltrackerService',          'Integrations::Pivotaltracker'),
          ('PrometheusService',              'Integrations::Prometheus'),
          ('PushoverService',                'Integrations::Pushover'),
          ('RedmineService',                 'Integrations::Redmine'),
          ('SlackService',                   'Integrations::Slack'),
          ('SlackSlashCommandsService',      'Integrations::SlackSlashCommands'),
          ('TeamcityService',                'Integrations::Teamcity'),
          ('UnifyCircuitService',            'Integrations::UnifyCircuit'),
          ('YoutrackService',                'Integrations::Youtrack'),
          ('WebexTeamsService',              'Integrations::WebexTeams'),

          -- EE-only integrations
          ('GithubService',                  'Integrations::Github'),
          ('GitlabSlackApplicationService',  'Integrations::GitlabSlackApplication')
        )

        UPDATE integrations SET type_new = mapping.new_type
        FROM mapping
        WHERE integrations.id = NEW.id
          AND mapping.old_type = NEW.type;
        RETURN NULL;
      SQL
    end
  end
end