45 lines
1.1 KiB
Go
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
|
|
}
|