summaryrefslogtreecommitdiff
path: root/db/post_migrate/20221215151822_schedule_backfill_releases_author_id.rb
blob: 4d8343ca2dd67f8ef3fa070fa62d497fca5b3d81 (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
# frozen_string_literal: true

class ScheduleBackfillReleasesAuthorId < Gitlab::Database::Migration[2.1]
  MIGRATION = 'BackfillReleasesAuthorId'
  JOB_DELAY_INTERVAL = 2.minutes
  GHOST_USER_TYPE = 5

  restrict_gitlab_migration gitlab_schema: :gitlab_main

  class User < MigrationRecord
    self.table_name = 'users'
  end

  class Release < MigrationRecord
    self.table_name = 'releases'
  end

  def up
    unless release_with_empty_author_exists?
      say "There are no releases with empty author_id, so skipping migration #{self.class.name}"
      return
    end

    create_ghost_user if ghost_user_id.nil?

    queue_batched_background_migration(
      MIGRATION,
      :releases,
      :id,
      ghost_user_id,
      job_interval: JOB_DELAY_INTERVAL
    )
  end

  def down
    delete_batched_background_migration(MIGRATION, :releases, :id, [ghost_user_id])
  end

  private

  def ghost_user_id
    User.find_by(user_type: GHOST_USER_TYPE)&.id
  end

  def create_ghost_user
    user = User.new
    user.name = 'Ghost User'
    user.username = 'ghost'
    user.email = 'ghost@example.com'
    user.user_type = GHOST_USER_TYPE
    user.projects_limit = 100000

    user.save!
  end

  def release_with_empty_author_exists?
    Release.exists?(author_id: nil)
  end
end