86 lines
2.6 KiB
Go
86 lines
2.6 KiB
Go
package services
|
|
|
|
import (
|
|
"agent-desk/internal/models"
|
|
"agent-desk/internal/pkg/errorsx"
|
|
"agent-desk/internal/pkg/openidentity"
|
|
"agent-desk/internal/repositories"
|
|
"strings"
|
|
|
|
"github.com/mlogclub/simple/sqls"
|
|
)
|
|
|
|
var ConversationSatisfactionService = newConversationSatisfactionService()
|
|
|
|
func newConversationSatisfactionService() *conversationSatisfactionService {
|
|
return &conversationSatisfactionService{}
|
|
}
|
|
|
|
type conversationSatisfactionService struct{}
|
|
|
|
func (s *conversationSatisfactionService) SubmitSatisfaction(conversationID int64, externalUser openidentity.ExternalUser, score int, feedback string) (*models.ConversationSatisfaction, error) {
|
|
if score < 1 || score > 5 {
|
|
return nil, errorsx.InvalidParamI18n("error.invalidParam")
|
|
}
|
|
|
|
conversation := ConversationService.Get(conversationID)
|
|
if conversation == nil {
|
|
return nil, errorsx.InvalidParamI18n("error.e0116")
|
|
}
|
|
if !ConversationService.IsCustomerConversationOwner(conversation, externalUser) {
|
|
return nil, errorsx.ForbiddenI18n("error.e0222")
|
|
}
|
|
|
|
trimmedFeedback := strings.TrimSpace(feedback)
|
|
operatorName := strings.TrimSpace(externalUser.ExternalName)
|
|
if operatorName == "" {
|
|
operatorName = strings.TrimSpace(externalUser.ExternalID)
|
|
}
|
|
|
|
var result *models.ConversationSatisfaction
|
|
|
|
err := sqls.WithTransaction(func(ctx *sqls.TxContext) error {
|
|
existing := repositories.ConversationSatisfactionRepository.GetByConversationID(ctx.Tx, conversationID)
|
|
if existing != nil {
|
|
existing.Score = score
|
|
existing.Feedback = trimmedFeedback
|
|
existing.UpdateUserName = operatorName
|
|
if err := repositories.ConversationSatisfactionRepository.Update(ctx.Tx, existing); err != nil {
|
|
return err
|
|
}
|
|
result = existing
|
|
return nil
|
|
}
|
|
|
|
item := &models.ConversationSatisfaction{
|
|
ConversationID: conversation.ID,
|
|
Score: score,
|
|
Feedback: trimmedFeedback,
|
|
ChannelID: conversation.ChannelID,
|
|
CustomerID: conversation.CustomerID,
|
|
AssigneeID: conversation.CurrentAssigneeID,
|
|
AIAgentID: conversation.AIAgentID,
|
|
AuditFields: models.AuditFields{
|
|
CreateUserName: operatorName,
|
|
UpdateUserName: operatorName,
|
|
},
|
|
}
|
|
if err := repositories.ConversationSatisfactionRepository.Create(ctx.Tx, item); err != nil {
|
|
return err
|
|
}
|
|
result = item
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
func (s *conversationSatisfactionService) GetByConversationID(conversationID int64) *models.ConversationSatisfaction {
|
|
if conversationID <= 0 {
|
|
return nil
|
|
}
|
|
return repositories.ConversationSatisfactionRepository.GetByConversationID(sqls.DB(), conversationID)
|
|
}
|