TP-37588 | Adding support to send customer information from CRM during incident update (#118)

Adding support to send customer information from CRM during incident update
This commit is contained in:
Sriram Bhargav
2023-08-16 14:29:58 +05:30
committed by GitHub
parent 147958cc1a
commit eff9dbd5a0
6 changed files with 131 additions and 57 deletions

BIN
cmd/cmd

Binary file not shown.

View File

@@ -2,9 +2,9 @@ package util
import (
"fmt"
"github.com/slack-go/slack"
"github.com/slack-go/slack/socketmode"
request "houston/service/request"
)
func GetColorBySeverity(severityId uint) string {
@@ -57,6 +57,13 @@ func PostIncidentSeverityUpdateMessage(userId, updatedSeverity, channelId string
return errMessage
}
func PostIncidentCustomerDataUpdateMessage(metadata request.CreateIncidentMetaData, userId, channelId string, client *socketmode.Client) error {
msgOption := slack.MsgOptionText(fmt.Sprintf("<@%s> > attached customer with Id %s and phone number %s", userId,
metadata.CustomerId, metadata.PhoneNumber), false)
_, _, errMessage := client.PostMessage(channelId, msgOption)
return errMessage
}
func RemoveDuplicateStr(strSlice []string) []string {
allKeys := make(map[string]bool)
list := []string{}
@@ -67,4 +74,4 @@ func RemoveDuplicateStr(strSlice []string) []string {
}
}
return list
}
}

View File

@@ -498,43 +498,40 @@ func (i *incidentService) UpdateIncident(c *gin.Context) {
userInfo, err := i.slackbotClient.GetUserByEmail(userEmail)
if err != nil {
i.logger.Error("error in fetching user by email", zap.String("userEmail", userEmail), zap.Error(err))
c.JSON(http.StatusInternalServerError, common.ErrorResponse(err, http.StatusBadRequest, nil))
return
i.logger.Error(fmt.Sprintf("error in fetching user by email: %v, hence using user email as user Id", userEmail), zap.String("userEmail", userEmail), zap.Error(err))
userInfo = &slack.User{
ID: userEmail,
}
}
num, err := strconv.ParseUint(updateIncidentRequest.SeverityId, 10, 64)
if err != nil {
i.logger.Error("error in string to int conversion",
zap.String("SeverityId", updateIncidentRequest.SeverityId), zap.Error(err))
return
}
severityEntity, err := i.severityRepository.FindSeverityById(uint(num))
if err != nil {
i.logger.Error("error in fetching severity", zap.Any("severity", incidentEntity.SeverityId), zap.Error(err))
c.JSON(http.StatusInternalServerError, common.ErrorResponse(err, http.StatusBadRequest, nil))
return
}
err = i.UpdateSeverityId(updateIncidentRequest, userInfo.ID, severityEntity.Name, severityEntity.Sla, incidentEntity)
err = i.UpdateSeverityId(updateIncidentRequest, userInfo.ID, incidentEntity)
if err != nil {
i.logger.Error("error in updating severity", zap.Error(err))
c.JSON(http.StatusInternalServerError, common.ErrorResponse(err, http.StatusBadRequest, nil))
return
}
err = i.UpdateStatus(updateIncidentRequest, userInfo.ID, incidentEntity.SlackChannel, incidentEntity)
if err != nil {
i.logger.Error("error in updating status", zap.Error(err))
c.JSON(http.StatusInternalServerError, common.ErrorResponse(err, http.StatusBadRequest, nil))
return
}
err = i.UpdateTeamId(updateIncidentRequest, userInfo.ID, severityEntity.Name,
severityEntity.Description, incidentEntity)
err = i.UpdateTeamId(updateIncidentRequest, userInfo.ID, incidentEntity)
if err != nil {
i.logger.Error("error in updating teamId", zap.Error(err))
c.JSON(http.StatusInternalServerError, common.ErrorResponse(err, http.StatusBadRequest, nil))
return
}
err = i.UpdateMetaData(updateIncidentRequest, incidentEntity, userInfo.ID)
if err != nil {
i.logger.Error("error in updating metadata", zap.Error(err))
c.JSON(http.StatusInternalServerError, common.ErrorResponse(err, http.StatusBadRequest, nil))
return
}
incidentEntity.UpdatedAt = time.Now()
incidentEntity.UpdatedBy = userInfo.ID
i.incidentRepository.UpdateIncident(incidentEntity)
@@ -545,12 +542,11 @@ func (i *incidentService) UpdateIncident(c *gin.Context) {
if incidentStatusEntity.IsTerminalStatus && incidentEntity.SeverityId != 1 && incidentEntity.SeverityId != 2 {
i.socketModeClient.ArchiveConversation(incidentEntity.SlackChannel)
}
c.JSON(http.StatusOK, common.SuccessResponse("incident updated successfully", http.StatusOK))
c.JSON(http.StatusOK, common.SuccessResponse(incidentEntity.SlackChannel, http.StatusOK))
}
func (i *incidentService) UpdateSeverityId(
updateIncidentRequest request.UpdateIncidentRequest, userId, severityName string, sla int, incidentEntity *incident.IncidentEntity) error {
updateIncidentRequest request.UpdateIncidentRequest, userId string, incidentEntity *incident.IncidentEntity) error {
if updateIncidentRequest.SeverityId != "" {
num, err := strconv.ParseUint(updateIncidentRequest.SeverityId, 10, 64)
if err != nil {
@@ -558,14 +554,29 @@ func (i *incidentService) UpdateSeverityId(
zap.String("SeverityId", updateIncidentRequest.SeverityId), zap.Error(err))
return err
}
if incidentEntity.SeverityId != uint(num) {
incidentEntity.SeverityId = uint(num)
incidentEntity.SeverityTat = time.Now().AddDate(0, 0, sla)
errMessage := util.PostIncidentSeverityUpdateMessage(userId, severityName, incidentEntity.SlackChannel, i.socketModeClient)
if errMessage != nil {
i.logger.Error("post response failed for IncidentUpdateSeverity", zap.Error(errMessage))
severityEntity, err := i.severityRepository.FindSeverityById(uint(num))
if err != nil {
i.logger.Error("error in fetching severity", zap.Any("severity", incidentEntity.SeverityId), zap.Error(err))
return err
}
if updateIncidentRequest.SeverityId != "" {
num, err := strconv.ParseUint(updateIncidentRequest.SeverityId, 10, 64)
if err != nil {
i.logger.Error("error in string to int conversion",
zap.String("SeverityId", updateIncidentRequest.SeverityId), zap.Error(err))
return err
}
if incidentEntity.SeverityId != uint(num) {
incidentEntity.SeverityId = uint(num)
incidentEntity.SeverityTat = time.Now().AddDate(0, 0, severityEntity.Sla)
errMessage := util.PostIncidentSeverityUpdateMessage(userId, severityEntity.Name, incidentEntity.SlackChannel, i.socketModeClient)
if errMessage != nil {
i.logger.Error("post response failed for IncidentUpdateSeverity", zap.Error(errMessage))
return err
}
}
}
}
return nil
@@ -599,31 +610,78 @@ func (i *incidentService) UpdateStatus(
}
func (i *incidentService) UpdateTeamId(
updateIncidentRequest request.UpdateIncidentRequest, userId, severityName, severityDescription string,
incidentEntity *incident.IncidentEntity) error {
updateIncidentRequest request.UpdateIncidentRequest, userId string, incidentEntity *incident.IncidentEntity) error {
if updateIncidentRequest.TeamId != "" {
num, err := strconv.ParseUint(updateIncidentRequest.TeamId, 10, 64)
num, err := strconv.ParseUint(updateIncidentRequest.SeverityId, 10, 64)
if err != nil {
i.logger.Error("error in string to int conversion",
zap.String("TeamId", updateIncidentRequest.TeamId), zap.Error(err))
zap.String("SeverityId", updateIncidentRequest.SeverityId), zap.Error(err))
return err
}
if incidentEntity.TeamId != uint(num) {
incidentEntity.TeamId = uint(num)
teamEntity, err := i.teamRepository.FindTeamById(incidentEntity.TeamId)
severityEntity, err := i.severityRepository.FindSeverityById(uint(num))
if err != nil {
i.logger.Error("error in fetching severity", zap.Any("severity", incidentEntity.SeverityId), zap.Error(err))
return err
}
if updateIncidentRequest.TeamId != "" {
num, err := strconv.ParseUint(updateIncidentRequest.TeamId, 10, 64)
if err != nil {
i.logger.Error("error in fetching team by id",
i.logger.Error("error in string to int conversion",
zap.String("TeamId", updateIncidentRequest.TeamId), zap.Error(err))
return err
}
errMessage := util.PostIncidentTypeUpdateMessage(
userId, teamEntity.Name, severityName, severityDescription,
incidentEntity.IncidentName, incidentEntity.Title, incidentEntity.SlackChannel, i.socketModeClient)
if errMessage != nil {
i.logger.Error("post response failed for IncidentUpdateType", zap.Error(errMessage))
return err
if incidentEntity.TeamId != uint(num) {
incidentEntity.TeamId = uint(num)
teamEntity, err := i.teamRepository.FindTeamById(incidentEntity.TeamId)
if err != nil {
i.logger.Error("error in fetching team by id",
zap.String("TeamId", updateIncidentRequest.TeamId), zap.Error(err))
return err
}
errMessage := util.PostIncidentTypeUpdateMessage(
userId, teamEntity.Name, severityEntity.Name, severityEntity.Description,
incidentEntity.IncidentName, incidentEntity.Title, incidentEntity.SlackChannel, i.socketModeClient)
if errMessage != nil {
i.logger.Error("post response failed for IncidentUpdateType", zap.Error(errMessage))
return err
}
}
}
}
return nil
}
func (i *incidentService) UpdateMetaData(updateIncidentRequest request.UpdateIncidentRequest, incidentEntity *incident.IncidentEntity, userId string) error {
metaData := request.CreateIncidentMetaData{}
if updateIncidentRequest.MetaData != metaData {
metaData.CrmTicketCreationTime = updateIncidentRequest.MetaData.CrmTicketCreationTime
metaData.CustomerId = updateIncidentRequest.MetaData.CustomerId
metaData.PhoneNumber = updateIncidentRequest.MetaData.PhoneNumber
metaData.TicketId = updateIncidentRequest.MetaData.TicketId
metaData.AgentName = updateIncidentRequest.MetaData.AgentName
metaData.TicketGroup = updateIncidentRequest.MetaData.TicketGroup
var incidentMetadata []request.CreateIncidentMetaData
if incidentEntity.MetaData != nil {
err := json.Unmarshal(incidentEntity.MetaData, &incidentMetadata)
if err != nil {
i.logger.Error("error occurred while converting incident metadata to json", zap.Error(err))
return err
}
}
incidentMetadata = append(incidentMetadata, metaData)
var err error
incidentEntity.MetaData, err = json.Marshal(incidentMetadata)
if err != nil {
i.logger.Error("error occurred while converting incident metadata to json", zap.Error(err))
return err
}
errMessage := util.PostIncidentCustomerDataUpdateMessage(updateIncidentRequest.MetaData, userId, incidentEntity.SlackChannel, i.socketModeClient)
if errMessage != nil {
i.logger.Error("post response failed for IncidentUpdateCustomerData", zap.Error(errMessage))
return errMessage
}
}
return nil
}

View File

@@ -15,10 +15,10 @@ type CreateIncidentRequest struct {
}
type CreateIncidentMetaData struct {
CustomerId uuid.UUID `json:"customerId,omitempty"`
PhoneNumber string `json:"phoneNumber,omitempty"`
CrmTicketCreationTime *time.Time `json:"crmTicketCreationTime,omitempty"`
TicketId string `json:"ticketId,omitempty"`
TicketGroup string `json:"ticketGroup,omitempty"`
AgentName string `json:"agentName,omitempty"`
CustomerId uuid.UUID `json:"customerId"`
PhoneNumber string `json:"phoneNumber"`
CrmTicketCreationTime *time.Time `json:"crmTicketCreationTime"`
TicketId string `json:"ticketId"`
TicketGroup string `json:"ticketGroup"`
AgentName string `json:"agentName"`
}

View File

@@ -1,8 +1,9 @@
package service
type UpdateIncidentRequest struct {
Id uint `json:"id"`
Status string `json:"status,omitempty"`
TeamId string `json:"teamId,omitempty"`
SeverityId string `json:"severityId,omitempty"`
}
Id uint `json:"id"`
Status string `json:"status,omitempty"`
TeamId string `json:"teamId,omitempty"`
SeverityId string `json:"severityId,omitempty"`
MetaData CreateIncidentMetaData `json:"metaData,omitempty"`
}

View File

@@ -2,6 +2,7 @@ package service
import (
"errors"
"github.com/google/uuid"
service "houston/service/request"
"strconv"
)
@@ -24,15 +25,22 @@ func ValidatePage(pageSize, pageNumber string) (int64, int64, error) {
}
func ValidateUpdateIncidentRequest(request service.UpdateIncidentRequest, userEmail string) error {
emptyMetaData := service.CreateIncidentMetaData{}
if userEmail == "" {
return errors.New("user email header missing in update request")
}
if request.Id == 0 {
return errors.New("id should be present in update request")
}
if request.SeverityId == "" && request.Status == "" && request.TeamId == "" {
return errors.New("update request should contain atleast one field to update")
if request.SeverityId == "" && request.Status == "" && request.TeamId == "" &&
request.MetaData == emptyMetaData {
return errors.New("update request should contain at least one field to update")
}
if request.MetaData != emptyMetaData && (request.MetaData.CustomerId == uuid.Nil || request.MetaData.PhoneNumber == "" || request.MetaData.CrmTicketCreationTime == nil || request.MetaData.TicketId == "" || request.MetaData.TicketGroup == "" || request.MetaData.AgentName == "") {
return errors.New("metadata should contain customer id, phone number and crm ticket creation time")
}
return nil
}