Files
libredesk/internal/conversation/drafts.go
T
Abhinav Raut a502039e59 perf: WS push for conv list, store/cache cleanups, ad-hoc UI polish
Convs and messages now push the full list-row payload to perm-authorized agents on create/assign/message, so livechat returning customers bubble up instantly without waiting for the timer refresh. Background list refresh bumped 30s ->  60s as a drift safety net.
2026-05-22 20:47:36 +05:30

85 lines
2.8 KiB
Go

package conversation
import (
"context"
"encoding/json"
"strings"
"time"
"github.com/abhinavxd/libredesk/internal/conversation/models"
"github.com/abhinavxd/libredesk/internal/envelope"
)
func (m *Manager) UpsertConversationDraft(conversationID, userID int, content string, meta json.RawMessage) (models.ConversationDraft, error) {
var draft models.ConversationDraft
content = rewriteInlineImagesToCID(content)
if err := m.q.UpsertConversationDraft.Get(&draft, conversationID, userID, content, meta); err != nil {
m.lo.Error("error upserting conversation draft", "conversation_id", conversationID, "user_id", userID, "error", err)
return draft, envelope.NewError(envelope.GeneralError, m.i18n.T("globals.messages.somethingWentWrong"), nil)
}
draft.Content = m.resolveDraftInlineCIDs(draft.Content)
return draft, nil
}
func (m *Manager) GetAllUserDrafts(userID int) ([]models.ConversationDraft, error) {
var drafts = make([]models.ConversationDraft, 0)
if err := m.q.GetAllUserDrafts.Select(&drafts, userID); err != nil {
m.lo.Error("error fetching user drafts", "user_id", userID, "error", err)
return nil, envelope.NewError(envelope.GeneralError, m.i18n.T("globals.messages.somethingWentWrong"), nil)
}
for i := range drafts {
drafts[i].Content = m.resolveDraftInlineCIDs(drafts[i].Content)
}
return drafts, nil
}
// DeleteConversationDraft deletes a draft for a conversation by ID or UUID.
func (m *Manager) DeleteConversationDraft(conversationID int, uuid string, userID int) error {
var uuidParam any
if uuid != "" {
uuidParam = uuid
}
if _, err := m.q.DeleteConversationDraft.Exec(conversationID, uuidParam, userID); err != nil {
m.lo.Error("error deleting conversation draft", "conversation_id", conversationID, "uuid", uuid, "user_id", userID, "error", err)
return envelope.NewError(envelope.GeneralError, m.i18n.T("globals.messages.somethingWentWrong"), nil)
}
return nil
}
// DeleteStaleDrafts deletes drafts older than the specified retention period.
func (m *Manager) DeleteStaleDrafts(ctx context.Context, retentionPeriod time.Duration) error {
cutoff := time.Now().Add(-retentionPeriod)
res, err := m.q.DeleteStaleDrafts.ExecContext(ctx, cutoff)
if err != nil {
m.lo.Error("error deleting stale drafts", "error", err)
return err
}
rowsAffected, _ := res.RowsAffected()
if rowsAffected > 0 {
m.lo.Info("deleted stale drafts", "count", rowsAffected)
}
return nil
}
func (m *Manager) resolveDraftInlineCIDs(content string) string {
cids := extractInlineContentIDs(content)
for _, cid := range cids {
uuid := strings.TrimPrefix(cid, "ldsk-")
if uuid == "" {
continue
}
media, err := m.mediaStore.Get(0, uuid)
if err != nil {
continue
}
content = strings.ReplaceAll(content, "cid:"+cid, m.mediaStore.GetURL(media.UUID, media.ContentType, media.Filename))
}
return content
}