chore: import clean Agent Desk snapshot (3/7)

This commit is contained in:
2026-10-16 11:58:36 +00:00
parent 89c5231c4c
commit fe4a99cf4b
127 changed files with 29641 additions and 0 deletions

View File

@@ -0,0 +1,85 @@
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)
}