Skip to content
代码片段 群组 项目
提交 cdc02a47 编辑于 作者: Adam Hegyi's avatar Adam Hegyi
浏览文件

Merge branch 'sh-clean-up-orphaned-member-invites' into 'master'

Clean up orphaned invited members

See merge request gitlab-org/gitlab!96505
No related branches found
No related tags found
无相关合并请求
# frozen_string_literal: true
class AddTemporaryIndexForOrphanedInvitedMembers < Gitlab::Database::Migration[2.0]
disable_ddl_transaction!
TMP_INDEX_NAME = 'tmp_idx_orphaned_invited_members'
def up
add_concurrent_index('members', :id, where: query_condition, name: TMP_INDEX_NAME)
end
def down
remove_concurrent_index_by_name('members', TMP_INDEX_NAME) if index_exists_by_name?('members', TMP_INDEX_NAME)
end
private
def query_condition
'invite_token IS NULL and invite_accepted_at IS NOT NULL AND user_id IS NULL'
end
end
# frozen_string_literal: true
class OrphanedInvitedMembersCleanup < Gitlab::Database::Migration[2.0]
disable_ddl_transaction!
restrict_gitlab_migration gitlab_schema: :gitlab_main
def up
# rubocop:disable Style/SymbolProc
membership.where(query_condition).each_batch(of: 100) do |relation|
relation.delete_all
end
# rubocop:enable Style/SymbolProc
end
def down
# This migration is irreversible
end
private
def membership
@membership ||= define_batchable_model('members')
end
def query_condition
'invite_token IS NULL and invite_accepted_at IS NOT NULL AND user_id IS NULL'
end
end
# frozen_string_literal: true
class RemoveTemporaryIndexForOrphanedInvitedMembers < Gitlab::Database::Migration[2.0]
disable_ddl_transaction!
TMP_INDEX_NAME = 'tmp_idx_orphaned_invited_members'
def up
remove_concurrent_index_by_name('members', TMP_INDEX_NAME) if index_exists_by_name?('members', TMP_INDEX_NAME)
end
def down
add_concurrent_index('members', :id, where: query_condition, name: TMP_INDEX_NAME)
end
private
def query_condition
'invite_token IS NULL and invite_accepted_at IS NOT NULL AND user_id IS NULL'
end
end
aa0b767ad0e38500e0eef83d5c8306054952363166f8cc2076ce48feeac1b0e1
\ No newline at end of file
badc3556e1dea545bbf8b55fb33065f45598df9b3fda74bffd28e89d7485e0b4
\ No newline at end of file
85e401f0920c6eb13b6756f191ccdf70494ca40f8133f05bbd5f23ba295b115d
\ No newline at end of file
# frozen_string_literal: true
require 'spec_helper'
require_migration!
RSpec.describe OrphanedInvitedMembersCleanup, :migration do
describe '#up', :aggregate_failures do
it 'removes accepted members with no associated user' do
user = create_user!('testuser1')
create_member(invite_token: nil, invite_accepted_at: 1.day.ago)
record2 = create_member(invite_token: nil, invite_accepted_at: 1.day.ago, user_id: user.id)
record3 = create_member(invite_token: 'foo2', invite_accepted_at: nil)
record4 = create_member(invite_token: 'foo3', invite_accepted_at: 1.day.ago)
migrate!
expect(table(:members).all.pluck(:id)).to match_array([record2.id, record3.id, record4.id])
end
end
private
def create_user!(name)
email = "#{name}@example.com"
table(:users).create!(
name: name,
email: email,
username: name,
projects_limit: 0
)
end
def create_member(**extra_attributes)
defaults = {
access_level: 10,
source_id: 1,
source_type: "Project",
notification_level: 0,
type: 'ProjectMember'
}
table(:members).create!(defaults.merge(extra_attributes))
end
end
0% 加载中 .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册