ultisuite-backend/internal/mail/threading/reconcile.go
R3D347HR4Y cd0a80f5e8 huhu
2026-05-25 13:52:27 +02:00

45 lines
1.1 KiB
Go

package threading
import (
"context"
"github.com/jackc/pgx/v5/pgxpool"
)
// ApplyMessageThread assigns thread_id for one message and propagates to direct replies.
func ApplyMessageThread(
ctx context.Context,
db *pgxpool.Pool,
accountID, rowID, rfcMessageID, inReplyTo string,
references []string,
) error {
threadID, err := AssignThreadID(ctx, db, accountID, inReplyTo, references)
if err != nil {
return err
}
if _, err := db.Exec(ctx, `
UPDATE messages SET thread_id = $1::uuid, updated_at = NOW() WHERE id = $2
`, threadID, rowID); err != nil {
return err
}
return propagateThreadToReplies(ctx, db, accountID, threadID, rfcMessageID)
}
func propagateThreadToReplies(ctx context.Context, db *pgxpool.Pool, accountID, threadID, rfcMessageID string) error {
rfcMessageID = NormalizeMessageID(rfcMessageID)
if rfcMessageID == "" {
return nil
}
_, err := db.Exec(ctx, `
UPDATE messages
SET thread_id = $1::uuid, updated_at = NOW()
WHERE account_id = $2
AND thread_id IS DISTINCT FROM $1::uuid
AND (
in_reply_to = $3
OR $3 = ANY(references_header)
)
`, threadID, accountID, rfcMessageID)
return err
}