feat(csat): send surveys on resolved conversations

This commit is contained in:
2026-06-05 08:30:45 +08:00
parent bda5ad590d
commit ef3a90959d
5 changed files with 384 additions and 51 deletions
@@ -201,12 +201,12 @@ type publicCsatUpdateBody struct {
Rating int `json:"rating"`
FeedbackMessage string `json:"feedback_message"`
Message struct {
SubmittedValues []map[string]any `json:"submitted_values"`
SubmittedValues any `json:"submitted_values"`
} `json:"message"`
}
func (b publicCsatUpdateBody) submittedValues() []map[string]any {
if len(b.Message.SubmittedValues) > 0 {
func (b publicCsatUpdateBody) submittedValues() any {
if b.Message.SubmittedValues != nil {
return b.Message.SubmittedValues
}
if b.Rating != 0 || b.FeedbackMessage != "" {
@@ -232,7 +232,7 @@ func (s *CsatSurveyHandlerTestSuite) TestPublicCsatShowAndUpdate_Success() {
assert.Equal(s.T(), "Rate this chat", showResp["content"])
assert.Equal(s.T(), "CSAT Inbox", showResp["inbox_name"])
body := `{"message":{"submitted_values":[{"csat_survey_response":{"rating":4,"feedback_message":"Helpful"}}]}}`
body := `{"message":{"submitted_values":{"csat_survey_response":{"rating":4,"feedback_message":"Helpful"}}}}`
wUpdate := httptest.NewRecorder()
reqUpdate, _ := http.NewRequest("PATCH", "/public/api/v1/csat_survey/"+conversation.UUID, bytes.NewBufferString(body))
reqUpdate.Header.Set("Content-Type", "application/json")
@@ -257,7 +257,22 @@ func (s *CsatSurveyHandlerTestSuite) TestPublicCsatShowAndUpdate_Success() {
s.Require().NoError(s.db.First(&storedMessage, message.ID).Error)
var attrs map[string]any
s.Require().NoError(json.Unmarshal(storedMessage.ContentAttributes, &attrs))
assert.NotEmpty(s.T(), attrs["submitted_values"])
submittedValues := attrs["submitted_values"].(map[string]any)
assert.Contains(s.T(), submittedValues, "csat_survey_response")
secondBody := `{"message":{"submitted_values":{"csat_survey_response":{"rating":2,"feedback_message":"Could be better"}}}}`
wSecondUpdate := httptest.NewRecorder()
reqSecondUpdate, _ := http.NewRequest("PATCH", "/public/api/v1/csat_survey/"+conversation.UUID, bytes.NewBufferString(secondBody))
reqSecondUpdate.Header.Set("Content-Type", "application/json")
r.ServeHTTP(wSecondUpdate, reqSecondUpdate)
assert.Equal(s.T(), http.StatusOK, wSecondUpdate.Code)
var count int64
s.Require().NoError(s.db.Model(&automation.CsatSurveyResponse{}).Where("message_id = ?", message.ID).Count(&count).Error)
assert.Equal(s.T(), int64(1), count)
s.Require().NoError(s.db.Where("message_id = ?", message.ID).First(&stored).Error)
assert.Equal(s.T(), 2, stored.Rating)
assert.Equal(s.T(), "Could be better", stored.FeedbackMessage)
}
func (s *CsatSurveyHandlerTestSuite) TestPublicCsatUpdate_LockedAfter14Days() {