Create MM team for GitLab group
This commit is contained in:
parent
e90ec73f65
commit
297dc70158
|
|
@ -21,6 +21,7 @@ class Group < Namespace
|
||||||
has_many :shared_projects, through: :project_group_links, source: :project
|
has_many :shared_projects, through: :project_group_links, source: :project
|
||||||
has_many :notification_settings, dependent: :destroy, as: :source
|
has_many :notification_settings, dependent: :destroy, as: :source
|
||||||
has_many :labels, class_name: 'GroupLabel'
|
has_many :labels, class_name: 'GroupLabel'
|
||||||
|
has_one :chat_team, dependent: :destroy
|
||||||
|
|
||||||
validate :avatar_type, if: ->(user) { user.avatar.present? && user.avatar_changed? }
|
validate :avatar_type, if: ->(user) { user.avatar.present? && user.avatar_changed? }
|
||||||
validate :visibility_level_allowed_by_projects
|
validate :visibility_level_allowed_by_projects
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,11 @@ module Groups
|
||||||
@group.name ||= @group.path.dup
|
@group.name ||= @group.path.dup
|
||||||
@group.save
|
@group.save
|
||||||
@group.add_owner(current_user)
|
@group.add_owner(current_user)
|
||||||
|
|
||||||
|
if params[:create_chat_team] && Gitlab.config.mattermost.enabled
|
||||||
|
Mattermost::CreateTeamWorker.perform_async(@group.id, current_user.id)
|
||||||
|
end
|
||||||
|
|
||||||
@group
|
@group
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,11 @@
|
||||||
|
|
||||||
= render 'shared/visibility_level', f: f, visibility_level: default_group_visibility, can_change_visibility_level: true, form_model: @group
|
= render 'shared/visibility_level', f: f, visibility_level: default_group_visibility, can_change_visibility_level: true, form_model: @group
|
||||||
|
|
||||||
|
.form-group
|
||||||
|
= f.label :create_chat_team, "Create Mattermost Team", class: 'control-label'
|
||||||
|
.col-sm-10
|
||||||
|
= f.check_box :chat_team
|
||||||
|
|
||||||
.form-group
|
.form-group
|
||||||
.col-sm-offset-2.col-sm-10
|
.col-sm-offset-2.col-sm-10
|
||||||
= render 'shared/group_tips'
|
= render 'shared/group_tips'
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
module Mattermost
|
||||||
|
class CreateTeamWorker
|
||||||
|
include Sidekiq::Worker
|
||||||
|
include DedicatedSidekiqQueue
|
||||||
|
|
||||||
|
def perform(group_id, current_user_id, options = {})
|
||||||
|
@group = Group.find(group_id)
|
||||||
|
current_user = User.find(current_user_id)
|
||||||
|
|
||||||
|
options = team_params.merge(options)
|
||||||
|
|
||||||
|
# The user that creates the team will be Team Admin
|
||||||
|
response = Mattermost::Team.new(current_user).create(options)
|
||||||
|
|
||||||
|
ChatTeam.create!(namespace: @group, name: response['name'], team_id: response['id'])
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def team_params
|
||||||
|
{
|
||||||
|
name: @group.path[0..59],
|
||||||
|
display_name: @group.name[0..59],
|
||||||
|
type: @group.public? ? 'O' : 'I' # Open vs Invite-only
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
class CreateChatTeams < ActiveRecord::Migration
|
||||||
|
include Gitlab::Database::MigrationHelpers
|
||||||
|
|
||||||
|
DOWNTIME = false
|
||||||
|
|
||||||
|
def change
|
||||||
|
create_table :chat_teams do |t|
|
||||||
|
t.integer :namespace_id, index: true
|
||||||
|
t.string :team_id
|
||||||
|
t.string :name
|
||||||
|
|
||||||
|
t.timestamps null: false
|
||||||
|
end
|
||||||
|
|
||||||
|
add_foreign_key :chat_teams, :namespaces, on_delete: :cascade
|
||||||
|
end
|
||||||
|
end
|
||||||
11
db/schema.rb
11
db/schema.rb
|
|
@ -171,6 +171,16 @@ ActiveRecord::Schema.define(version: 20170214111112) do
|
||||||
add_index "chat_names", ["service_id", "team_id", "chat_id"], name: "index_chat_names_on_service_id_and_team_id_and_chat_id", unique: true, using: :btree
|
add_index "chat_names", ["service_id", "team_id", "chat_id"], name: "index_chat_names_on_service_id_and_team_id_and_chat_id", unique: true, using: :btree
|
||||||
add_index "chat_names", ["user_id", "service_id"], name: "index_chat_names_on_user_id_and_service_id", unique: true, using: :btree
|
add_index "chat_names", ["user_id", "service_id"], name: "index_chat_names_on_user_id_and_service_id", unique: true, using: :btree
|
||||||
|
|
||||||
|
create_table "chat_teams", force: :cascade do |t|
|
||||||
|
t.integer "namespace_id"
|
||||||
|
t.string "team_id"
|
||||||
|
t.string "name"
|
||||||
|
t.datetime "created_at", null: false
|
||||||
|
t.datetime "updated_at", null: false
|
||||||
|
end
|
||||||
|
|
||||||
|
add_index "chat_teams", ["namespace_id"], name: "index_chat_teams_on_namespace_id", using: :btree
|
||||||
|
|
||||||
create_table "ci_application_settings", force: :cascade do |t|
|
create_table "ci_application_settings", force: :cascade do |t|
|
||||||
t.boolean "all_broken_builds"
|
t.boolean "all_broken_builds"
|
||||||
t.boolean "add_pusher"
|
t.boolean "add_pusher"
|
||||||
|
|
@ -1330,6 +1340,7 @@ ActiveRecord::Schema.define(version: 20170214111112) do
|
||||||
add_index "web_hooks", ["project_id"], name: "index_web_hooks_on_project_id", using: :btree
|
add_index "web_hooks", ["project_id"], name: "index_web_hooks_on_project_id", using: :btree
|
||||||
|
|
||||||
add_foreign_key "boards", "projects"
|
add_foreign_key "boards", "projects"
|
||||||
|
add_foreign_key "chat_teams", "namespaces", on_delete: :cascade
|
||||||
add_foreign_key "issue_metrics", "issues", on_delete: :cascade
|
add_foreign_key "issue_metrics", "issues", on_delete: :cascade
|
||||||
add_foreign_key "label_priorities", "labels", on_delete: :cascade
|
add_foreign_key "label_priorities", "labels", on_delete: :cascade
|
||||||
add_foreign_key "label_priorities", "projects", on_delete: :cascade
|
add_foreign_key "label_priorities", "projects", on_delete: :cascade
|
||||||
|
|
|
||||||
|
|
@ -153,7 +153,7 @@ module Mattermost
|
||||||
yield
|
yield
|
||||||
rescue HTTParty::Error => e
|
rescue HTTParty::Error => e
|
||||||
raise Mattermost::ConnectionError.new(e.message)
|
raise Mattermost::ConnectionError.new(e.message)
|
||||||
rescue Errno::ECONNREFUSED
|
rescue Errno::ECONNREFUSED => e
|
||||||
raise Mattermost::ConnectionError.new(e.message)
|
raise Mattermost::ConnectionError.new(e.message)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,12 @@
|
||||||
module Mattermost
|
module Mattermost
|
||||||
class Team < Client
|
class Team < Client
|
||||||
|
# Returns **all** teams for an admin
|
||||||
def all
|
def all
|
||||||
session_get('/api/v3/teams/all')
|
session_get('/api/v3/teams/all')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def create(params)
|
||||||
|
session_post('/api/v3/teams/create', body: params.to_json)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe ChatTeam, type: :model do
|
||||||
|
# Associations
|
||||||
|
it { is_expected.to belong_to(:group) }
|
||||||
|
|
||||||
|
# Fields
|
||||||
|
it { is_expected.to respond_to(:name) }
|
||||||
|
it { is_expected.to respond_to(:team_id) }
|
||||||
|
end
|
||||||
|
|
@ -13,6 +13,7 @@ describe Group, models: true do
|
||||||
it { is_expected.to have_many(:shared_projects).through(:project_group_links) }
|
it { is_expected.to have_many(:shared_projects).through(:project_group_links) }
|
||||||
it { is_expected.to have_many(:notification_settings).dependent(:destroy) }
|
it { is_expected.to have_many(:notification_settings).dependent(:destroy) }
|
||||||
it { is_expected.to have_many(:labels).class_name('GroupLabel') }
|
it { is_expected.to have_many(:labels).class_name('GroupLabel') }
|
||||||
|
it { is_expected.to have_one(:chat_team) }
|
||||||
|
|
||||||
describe '#members & #requesters' do
|
describe '#members & #requesters' do
|
||||||
let(:requester) { create(:user) }
|
let(:requester) { create(:user) }
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe Mattermost::CreateTeamWorker do
|
||||||
|
let(:group) { create(:group, path: 'path', name: 'name') }
|
||||||
|
let(:admin) { create(:admin) }
|
||||||
|
|
||||||
|
describe '.perform' do
|
||||||
|
subject { described_class.new.perform(group.id, admin.id) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow_any_instance_of(Mattermost::Team).
|
||||||
|
to receive(:create).
|
||||||
|
with(name: "path", display_name: "name", type: "O").
|
||||||
|
and_return('name' => 'my team', 'id' => 'sjfkdlwkdjfwlkfjwf')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'creates a new chat team' do
|
||||||
|
expect { subject }.to change { ChatTeam.count }.from(0).to(1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
Loading…
Reference in New Issue