99 lines
3.8 KiB
Go
99 lines
3.8 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 IncidentUpdateDescriptionAction struct {
|
|
client *socketmode.Client
|
|
logger *zap.Logger
|
|
incidentService *incident.Service
|
|
}
|
|
|
|
func NewIncidentUpdateDescriptionAction(client *socketmode.Client, logger *zap.Logger, incidentService *incident.Service) *IncidentUpdateDescriptionAction {
|
|
return &IncidentUpdateDescriptionAction{
|
|
client: client,
|
|
logger: logger,
|
|
incidentService: incidentService,
|
|
}
|
|
}
|
|
|
|
func (idp *IncidentUpdateDescriptionAction) IncidentUpdateDescriptionRequestProcess(callback slack.InteractionCallback, request *socketmode.Request) {
|
|
result, err := idp.incidentService.FindIncidentByChannelId(callback.Channel.ID)
|
|
if err != nil {
|
|
idp.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 {
|
|
idp.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.BuildIncidentUpdateDescriptionModal(callback.Channel, result.Description)
|
|
|
|
_, err = idp.client.OpenView(callback.TriggerID, modalRequest)
|
|
if err != nil {
|
|
idp.logger.Error("houston slackbot openview command for IncidentUpdateDescriptionRequestProcess failed.",
|
|
zap.String("trigger_id", callback.TriggerID), zap.String("channel_id", callback.Channel.ID), zap.Error(err))
|
|
return
|
|
}
|
|
var payload interface{}
|
|
idp.client.Ack(*request, payload)
|
|
}
|
|
|
|
func (itp *IncidentUpdateDescriptionAction) IncidentUpdateDescription(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
|
|
}
|
|
|
|
incidentDescription := buildUpdateIncidentDescriptionRequest(callback.View.State.Values)
|
|
|
|
incidentEntity.Description = incidentDescription
|
|
incidentEntity.UpdatedBy = user.ID
|
|
err = itp.incidentService.UpdateIncident(incidentEntity)
|
|
if err != nil {
|
|
itp.logger.Error("IncidentUpdateDescription 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 description to %s", user.ID, incidentEntity.Description), false)
|
|
_, _, errMessage := itp.client.PostMessage(callback.View.PrivateMetadata, msgOption)
|
|
if errMessage != nil {
|
|
itp.logger.Error("post response failed for IncidentUpdateDescription", zap.Error(errMessage))
|
|
return
|
|
}
|
|
|
|
var payload interface{}
|
|
itp.client.Ack(*request, payload)
|
|
}
|
|
|
|
func buildUpdateIncidentDescriptionRequest(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_description"]
|
|
}
|