feat(sla): persist applied sla on conversations

This commit is contained in:
2026-06-05 07:16:05 +08:00
parent 4cf68d1639
commit a11bb965fa
6 changed files with 270 additions and 30 deletions
@@ -55,6 +55,7 @@ type chatwootConversationPayload struct {
Priority string `json:"priority"`
WaitingSince int64 `json:"waiting_since"`
SlaPolicyID *uint `json:"sla_policy_id"`
AppliedSLA map[string]any `json:"applied_sla,omitempty"`
}
type chatwootConversationMeta struct {
@@ -135,7 +136,7 @@ func serializeConversation(ctx context.Context, db *gorm.DB, conversation *model
}
}
return chatwootConversationPayload{
payload := chatwootConversationPayload{
Meta: serializeConversationMeta(ctx, db, conversation),
ID: conversationDisplayID(conversation),
Messages: messages,
@@ -163,6 +164,40 @@ func serializeConversation(ctx context.Context, db *gorm.DB, conversation *model
WaitingSince: int64Value(conversation.WaitingSince),
SlaPolicyID: conversation.SlaPolicyID,
}
if appliedSLA := serializeAppliedSlaForConversation(ctx, db, conversation.ID); appliedSLA != nil {
payload.AppliedSLA = appliedSLA
}
return payload
}
func serializeAppliedSlaForConversation(ctx context.Context, db *gorm.DB, conversationID uint) map[string]any {
if db == nil || conversationID == 0 {
return nil
}
var applied model.AppliedSLA
if err := db.WithContext(ctx).
Preload("SlaPolicy").
Where("conversation_id = ?", conversationID).
First(&applied).Error; err != nil {
return nil
}
return map[string]any{
"id": applied.ID,
"sla_id": applied.SlaPolicyID,
"sla_status": applied.SLAStatus,
"created_at": applied.CreatedAt.Unix(),
"updated_at": applied.UpdatedAt.Unix(),
"sla_description": applied.SlaPolicy.Description,
"sla_name": applied.SlaPolicy.Name,
"sla_first_response_time_threshold": applied.SlaPolicy.FirstResponseTimeThreshold,
"sla_next_response_time_threshold": applied.SlaPolicy.NextResponseTimeThreshold,
"sla_only_during_business_hours": applied.SlaPolicy.OnlyDuringBusinessHours,
"sla_resolution_time_threshold": applied.SlaPolicy.ResolutionTimeThreshold,
}
}
func serializeConversationMeta(ctx context.Context, db *gorm.DB, conversation *model.Conversation) chatwootConversationMeta {