Commit d7062dd0 authored by Z.J. van de Weg's avatar Z.J. van de Weg

Remove Mattermost team with GitLab group

When destroying a group, now an API call is made to the Mattermost
server to request the deletion of the project. Actual team deletion on
the Mattermost side happens async, so the runtime shouldn't increase by
more than a second.
parent b92d5135
......@@ -3,4 +3,13 @@ class ChatTeam < ActiveRecord::Base
validates :namespace, uniqueness: true
belongs_to :namespace
def remove_mattermost_team(current_user)
Mattermost::Team.new(current_user).destroy(team_id: team_id)
rescue Mattermost::ClientError => e
# Either the group is not found, or the user doesn't have the proper
# access on the mattermost instance. In the first case, we're done either way
# in the latter case, we can't recover by retrying, so we just log what happened
Rails.logger.error("Mattermost team deletion failed: #{e}")
end
end
......@@ -21,6 +21,8 @@ module Groups
DestroyService.new(group, current_user).execute
end
group.chat_team&.remove_mattermost_team(current_user)
group.really_destroy!
end
end
......
---
title: Remove Mattermost team when deleting a group
merge_request: 11362
author:
......@@ -24,6 +24,10 @@ module Mattermost
json_response session.post(path, options)
end
def delete(session, path, options)
json_response session.delete(path, options)
end
def session_get(path, options = {})
with_session do |session|
get(session, path, options)
......@@ -36,6 +40,12 @@ module Mattermost
end
end
def session_delete(path, options = {})
with_session do |session|
delete(session, path, options)
end
end
def json_response(response)
json_response = JSON.parse(response.body)
......
......@@ -14,5 +14,12 @@ module Mattermost
type: type
}.to_json)
end
# The deletion is done async, so the response is fast.
# On the mattermost side, this triggers an soft deletion first, after which
# the actuall data is removed
def destroy(team_id:)
session_delete("/api/v4/teams/#{team_id}?permanent=true")
end
end
end
......@@ -35,6 +35,16 @@ describe Groups::DestroyService, services: true do
it { expect(NotificationSetting.unscoped.all).not_to include(notification_setting) }
end
context 'mattermost team' do
let!(:chat_team) { create(:chat_team, namespace: group) }
it 'destroys the team too' do
expect_any_instance_of(Mattermost::Team).to receive(:destroy)
destroy_group(group, user, async)
end
end
context 'file system' do
context 'Sidekiq inline' do
before do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment