Files
houston-be/internal/processor/action/incident_update_title_action.go
2023-04-10 17:30:28 +05:30

110 lines
4.2 KiB
Go

package action
import (
"fmt"
"github.com/slack-go/slack"
"github.com/slack-go/slack/socketmode"
"go.uber.org/zap"
"houston/internal/processor/action/view"
"houston/pkg/postgres/service/incident"
)
type IncidentUpdateTitleAction struct {
client *socketmode.Client
logger *zap.Logger
incidentService *incident.Service
}
func NewIncidentUpdateTitleAction(client *socketmode.Client, logger *zap.Logger, incidentService *incident.Service) *IncidentUpdateTitleAction {
return &IncidentUpdateTitleAction{
client: client,
logger: logger,
incidentService: incidentService,
}
}
func (itp *IncidentUpdateTitleAction) IncidentUpdateTitleRequestProcess(callback slack.InteractionCallback, request *socketmode.Request) {
result, err := itp.incidentService.FindIncidentByChannelId(callback.Channel.ID)
if err != nil {
itp.logger.Error("FindIncidentByChannelId error",
zap.String("incident_slack_channel_id", callback.Channel.ID), zap.String("channel", callback.Channel.Name),
zap.String("user_id", callback.User.ID), zap.Error(err))
return
} else if result == nil {
itp.logger.Error("IncidentEntity not found ",
zap.String("incident_slack_channel_id", callback.Channel.ID), zap.String("channel", callback.Channel.Name),
zap.String("user_id", callback.User.ID), zap.Error(err))
return
}
modalRequest := view.BuildIncidentUpdateTitleModal(callback.Channel, result.Title)
_, err = itp.client.OpenView(callback.TriggerID, modalRequest)
if err != nil {
itp.logger.Error("houston slackbot openview command for IncidentUpdateTitleRequestProcess failed.",
zap.String("trigger_id", callback.TriggerID), zap.String("channel_id", callback.Channel.ID), zap.Error(err))
return
}
var payload interface{}
itp.client.Ack(*request, payload)
}
func (itp *IncidentUpdateTitleAction) IncidentUpdateTitle(callback slack.InteractionCallback, request *socketmode.Request, channel slack.Channel, user slack.User) {
incidentEntity, err := itp.incidentService.FindIncidentByChannelId(callback.View.PrivateMetadata)
if err != nil {
itp.logger.Error("FindIncidentByChannelId error",
zap.String("incident_slack_channel_id", channel.ID), zap.String("channel", channel.Name),
zap.String("user_id", user.ID), zap.Error(err))
return
} else if incidentEntity == nil {
itp.logger.Error("IncidentEntity not found ",
zap.String("incident_slack_channel_id", callback.Channel.ID), zap.String("channel", callback.Channel.Name),
zap.String("user_id", callback.User.ID), zap.Error(err))
return
}
incidentTitle := buildUpdateIncidentTitleRequest(callback.View.State.Values)
incidentEntity.Title = incidentTitle
incidentEntity.UpdatedBy = user.ID
err = itp.incidentService.UpdateIncident(incidentEntity)
if err != nil {
itp.logger.Error("IncidentUpdateTitle error",
zap.String("incident_slack_channel_id", channel.ID), zap.String("channel", channel.Name),
zap.String("user_id", user.ID), zap.Error(err))
return
}
msgOption := slack.MsgOptionText(fmt.Sprintf("<@%s> > set title to %s", user.ID, incidentEntity.Title), false)
_, _, errMessage := itp.client.PostMessage(callback.View.PrivateMetadata, msgOption)
if errMessage != nil {
itp.logger.Error("post response failed for IncidentUpdateTitle", zap.Error(errMessage))
return
}
result, err := itp.incidentService.FindIncidentSeverityTeamJoin(incidentEntity.SlackChannel)
if err != nil {
itp.logger.Error("query failed for FindIncidentSeverityTeamJoin", zap.Error(errMessage))
return
}
msgOption = slack.MsgOptionText(fmt.Sprintf("set the channel topic: %s : %s %s | %s", result.TeamName, result.SeverityName, incidentEntity.IncidentName, incidentEntity.Title), false)
_, _, errMessage = itp.client.PostMessage(callback.View.PrivateMetadata, msgOption)
if errMessage != nil {
itp.logger.Error("post response failed for IncidentUpdateTitle", zap.Error(errMessage))
return
}
var payload interface{}
itp.client.Ack(*request, payload)
}
func buildUpdateIncidentTitleRequest(blockActions map[string]map[string]slack.BlockAction) string {
var requestMap = make(map[string]string, 0)
for _, actions := range blockActions {
for actionID, a := range actions {
if a.Type == "plain_text_input" {
requestMap[actionID] = a.Value
}
}
}
return requestMap["incident_title"]
}