Files
mostlymatter/server/channels/app/work_templates.go
Agniva De Sarker b200a07881 v8.0 module release (#22975)
https://mattermost.atlassian.net/browse/MM-52079

```release-note
We upgrade the module version to 8.0. The new module path is github.com/mattermost-server/server/v8.
```


Co-authored-by: Doug Lauder <wiggin77@warpmail.net>
2023-04-18 11:05:28 +05:30

190 строки
6.6 KiB
Go

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
package app
import (
"net/http"
"github.com/mattermost/mattermost-server/server/v8/channels/app/request"
"github.com/mattermost/mattermost-server/server/v8/channels/app/worktemplates"
"github.com/mattermost/mattermost-server/server/v8/model"
"github.com/mattermost/mattermost-server/server/v8/platform/shared/i18n"
)
func (a *App) GetWorkTemplateCategories(t i18n.TranslateFunc) ([]*model.WorkTemplateCategory, *model.AppError) {
categories, err := worktemplates.ListCategories()
if err != nil {
return nil, model.NewAppError("GetWorkTemplateCategories", "app.worktemplates.get_categories.app_error", nil, "", http.StatusInternalServerError).Wrap(err)
}
modelCategories := make([]*model.WorkTemplateCategory, len(categories))
for i := range categories {
modelCategories[i] = &model.WorkTemplateCategory{
ID: categories[i].ID,
Name: t(categories[i].Name),
}
}
return modelCategories, nil
}
func (a *App) GetWorkTemplates(category string, featureFlags map[string]string, t i18n.TranslateFunc) ([]*model.WorkTemplate, *model.AppError) {
templates, err := worktemplates.ListByCategory(category)
if err != nil {
return nil, model.NewAppError("GetWorkTemplates", "app.worktemplates.get_templates.app_error", nil, "", http.StatusInternalServerError).Wrap(err)
}
// filter out templates that are not enabled by feature Flag
enabledTemplates := []*model.WorkTemplate{}
for _, template := range templates {
mTemplate := template.ToModelWorkTemplate(t)
if template.FeatureFlag == nil {
enabledTemplates = append(enabledTemplates, mTemplate)
continue
}
if featureFlags[template.FeatureFlag.Name] == template.FeatureFlag.Value {
enabledTemplates = append(enabledTemplates, mTemplate)
}
}
return enabledTemplates, nil
}
func (a *App) ExecuteWorkTemplate(c *request.Context, wtcr *worktemplates.ExecutionRequest, installPlugins bool) (*WorkTemplateExecutionResult, *model.AppError) {
e := &appWorkTemplateExecutor{app: a}
return a.executeWorkTemplate(c, wtcr, e, installPlugins)
}
func (a *App) executeWorkTemplate(
c *request.Context,
wtcr *worktemplates.ExecutionRequest,
e WorkTemplateExecutor,
installPlugins bool,
) (*WorkTemplateExecutionResult, *model.AppError) {
res := &WorkTemplateExecutionResult{
ChannelWithPlaybookIDs: []string{},
ChannelIDs: []string{},
}
if wtcr.Name != "" {
if len(wtcr.Name) > model.ChannelNameMaxLength {
return res, model.NewAppError("ExecuteWorkTemplate", "app.worktemplates.execute_work_template.name_too_long", nil, "", http.StatusBadRequest)
}
}
contentByType := map[string][]model.WorkTemplateContent{
"channel": {},
"board": {},
"playbook": {},
"integration": {},
}
for _, content := range wtcr.WorkTemplate.Content {
if content.Channel != nil {
contentByType["channel"] = append(contentByType["channel"], content)
}
if content.Board != nil {
contentByType["board"] = append(contentByType["board"], content)
}
if content.Playbook != nil {
contentByType["playbook"] = append(contentByType["playbook"], content)
}
if content.Integration != nil {
contentByType["integration"] = append(contentByType["integration"], content)
}
}
firstChannelId := ""
channelIDByWorkTemplateID := map[string]string{}
for _, pbContent := range contentByType["playbook"] {
cPlaybook := pbContent.Playbook
// find associated channel
var associatedChannel *model.WorkTemplateChannel
for _, channelContent := range contentByType["channel"] {
if channelContent.Channel.Playbook == cPlaybook.ID {
associatedChannel = channelContent.Channel
break
}
}
if associatedChannel == nil {
return res, model.NewAppError("ExecuteWorkTemplate", "app.worktemplates.execute_work_template.playbooks.find_channel_error", nil, "no associated channel found for playbook", http.StatusInternalServerError)
}
channelID, err := e.CreatePlaybook(c, wtcr, cPlaybook, *associatedChannel)
if err != nil {
return res, model.NewAppError("ExecuteWorkTemplate", "app.worktemplates.execute_work_template.playbooks.create_error", nil, "", http.StatusInternalServerError).Wrap(err)
}
if firstChannelId == "" {
firstChannelId = channelID
}
res.ChannelWithPlaybookIDs = append(res.ChannelWithPlaybookIDs, channelID)
channelIDByWorkTemplateID[associatedChannel.ID] = channelID
}
// loop through all channels
for _, channelContent := range contentByType["channel"] {
cChannel := channelContent.Channel
// we only need to create a channel if there's no playbook
if cChannel.Playbook == "" {
chanID, err := e.CreateChannel(c, wtcr, cChannel)
if err != nil {
return res, model.NewAppError("ExecuteWorkTemplate", "app.worktemplates.execute_work_template.channels.create_error", nil, "", http.StatusInternalServerError).Wrap(err)
}
if firstChannelId == "" {
firstChannelId = chanID
}
res.ChannelIDs = append(res.ChannelIDs, chanID)
channelIDByWorkTemplateID[cChannel.ID] = chanID
}
}
for _, boardContent := range contentByType["board"] {
cBoard := boardContent.Board
channelID := ""
if cBoard.Channel != "" {
channel, ok := channelIDByWorkTemplateID[cBoard.Channel]
if !ok {
return res, model.NewAppError("ExecuteWorkTemplate", "app.worktemplates.execute_work_template.app_error", nil, "no associated channel found for board", http.StatusInternalServerError)
}
channelID = channel
}
_, err := e.CreateBoard(c, wtcr, cBoard, channelID)
if err != nil {
return res, model.NewAppError("ExecuteWorkTemplate", "app.worktemplates.execute_work_template.boards.create_error", nil, "", http.StatusInternalServerError).Wrap(err)
}
}
if installPlugins {
for _, integrationContent := range contentByType["integration"] {
cIntegration := integrationContent.Integration
// this can take a long time so we just start those as background tasks
go e.InstallPlugin(c, wtcr, cIntegration, firstChannelId)
}
}
for _, ch := range res.ChannelWithPlaybookIDs {
message := model.NewWebSocketEvent(model.WebsocketEventChannelCreated, "", "", c.Session().UserId, nil, "")
message.Add("channel_id", ch)
message.Add("team_id", wtcr.TeamID)
a.Publish(message)
}
for _, ch := range res.ChannelIDs {
message := model.NewWebSocketEvent(model.WebsocketEventChannelCreated, "", "", c.Session().UserId, nil, "")
message.Add("channel_id", ch)
message.Add("team_id", wtcr.TeamID)
a.Publish(message)
}
return res, nil
}
type WorkTemplateExecutionResult struct {
ChannelWithPlaybookIDs []string `json:"channel_with_playbook_ids"`
ChannelIDs []string `json:"channel_ids"`
}