fix edge cases in private note soft-delete

This commit is contained in:
Abhinav Raut
2026-07-08 01:00:24 +05:30
parent 43b43a82ef
commit 60ebefebdc
4 changed files with 15 additions and 21 deletions
@@ -317,7 +317,9 @@ const userStore = useUserStore()
const alertOpen = ref(false)
const deleteNote = () => {
convStore.deleteMessage(convStore.current?.uuid, props.message.uuid)
const conversationUUID = convStore.current?.uuid
if (!conversationUUID) return
convStore.deleteMessage(conversationUUID, props.message.uuid)
alertOpen.value = false
}
@@ -515,10 +515,11 @@ export const useConversationStore = defineStore('conversation', () => {
try {
const resp = await api.deleteMessage(conversationUUID, messageUUID)
const deletedText = resp.data.data.content
const existing = messages.data.getAllPagesMessages(conversationUUID).find(m => m.uuid === messageUUID)
messages.data.updateMessage(conversationUUID, messageUUID, {
content: deletedText,
text_content: deletedText,
meta: { deleted_at: new Date().toISOString() }
meta: { ...(existing?.meta || {}), deleted_at: new Date().toISOString() }
})
incrementMessageVersion()
} catch (error) {
+3 -17
View File
@@ -12,12 +12,9 @@ import (
func (m *Manager) DeletePrivateMessage(conversationUUID, messageUUID string) (string, error) {
m.lo.Info("deleting private note", "conversation_uuid", conversationUUID, "message_uuid", messageUUID)
var res struct {
MessageID int `db:"message_id"`
PreviewUpdated bool `db:"preview_updated"`
}
var previewUpdated bool
deletedPreview := m.i18n.T("conversation.privateNoteDeleted")
if err := m.q.DeletePrivateMessage.Get(&res, messageUUID, conversationUUID, deletedPreview); err != nil {
if err := m.q.DeletePrivateMessage.Get(&previewUpdated, messageUUID, conversationUUID, deletedPreview); err != nil {
if errors.Is(err, sql.ErrNoRows) {
return "", envelope.NewError(envelope.NotFoundError, m.i18n.Ts("globals.messages.notFound", "name", m.i18n.Ts("globals.terms.message")), nil)
}
@@ -30,19 +27,8 @@ func (m *Manager) DeletePrivateMessage(conversationUUID, messageUUID string) (st
"text_content": deletedPreview,
"meta": map[string]any{"deleted_at": time.Now()},
})
if res.PreviewUpdated {
if previewUpdated {
m.BroadcastConversationUpdate(conversationUUID, map[string]any{"last_message": deletedPreview})
}
media, err := m.mediaStore.GetByModel(res.MessageID, "messages")
if err != nil {
m.lo.Error("error fetching private note media to unlink", "message_id", res.MessageID, "error", err)
return deletedPreview, nil
}
for _, md := range media {
if err := m.mediaStore.Attach(md.ID, "messages", 0); err != nil {
m.lo.Error("error unlinking private note media", "media_id", md.ID, "error", err)
}
}
return deletedPreview, nil
}
+7 -2
View File
@@ -613,13 +613,18 @@ END;
WITH deleted AS (
UPDATE conversation_messages
SET content = $3, text_content = $3, updated_at = NOW(),
meta = meta || jsonb_build_object('deleted_at', NOW())
meta = COALESCE(meta, '{}'::jsonb) || jsonb_build_object('deleted_at', NOW())
WHERE uuid = $1
AND private = true
AND meta->>'deleted_at' IS NULL
AND conversation_id = (SELECT id FROM conversations WHERE uuid = $2)
RETURNING id, conversation_id, created_at
),
media_unlink AS (
UPDATE media SET model_id = 0
FROM deleted d
WHERE media.model_type = 'messages' AND media.model_id = d.id
),
preview AS (
UPDATE conversations c
SET last_message = $3, updated_at = NOW()
@@ -632,7 +637,7 @@ preview AS (
)
RETURNING c.id
)
SELECT d.id AS message_id, EXISTS (SELECT 1 FROM preview) AS preview_updated
SELECT EXISTS (SELECT 1 FROM preview) AS preview_updated
FROM deleted d;
-- name: get-message-source-ids