fix: preserve formatted date message entities

This commit is contained in:
A 2026-07-05 20:42:13 +08:00
parent 53105b6823
commit 03b785ebf4
10 changed files with 214 additions and 31 deletions

View file

@ -243,6 +243,13 @@ type messageEntityJSON struct {
Language string `json:"language,omitempty"`
DocumentID int64 `json:"document_id,omitempty"`
Collapsed bool `json:"collapsed,omitempty"`
Date int `json:"date,omitempty"`
Relative bool `json:"relative,omitempty"`
ShortTime bool `json:"short_time,omitempty"`
LongTime bool `json:"long_time,omitempty"`
ShortDate bool `json:"short_date,omitempty"`
LongDate bool `json:"long_date,omitempty"`
DayOfWeek bool `json:"day_of_week,omitempty"`
}
func encodeMessageEntities(entities []domain.MessageEntity) ([]byte, error) {
@ -260,6 +267,13 @@ func encodeMessageEntities(entities []domain.MessageEntity) ([]byte, error) {
Language: entity.Language,
DocumentID: entity.DocumentID,
Collapsed: entity.Collapsed,
Date: entity.Date,
Relative: entity.Relative,
ShortTime: entity.ShortTime,
LongTime: entity.LongTime,
ShortDate: entity.ShortDate,
LongDate: entity.LongDate,
DayOfWeek: entity.DayOfWeek,
})
}
raw, err := json.Marshal(wire)
@ -288,6 +302,13 @@ func decodeMessageEntities(raw string) ([]domain.MessageEntity, error) {
Language: entity.Language,
DocumentID: entity.DocumentID,
Collapsed: entity.Collapsed,
Date: entity.Date,
Relative: entity.Relative,
ShortTime: entity.ShortTime,
LongTime: entity.LongTime,
ShortDate: entity.ShortDate,
LongDate: entity.LongDate,
DayOfWeek: entity.DayOfWeek,
})
}
return out, nil

View file

@ -0,0 +1,33 @@
package postgres
import (
"testing"
"telesrv/internal/domain"
)
func TestMessageEntityJSONRoundTripPreservesFormattedDate(t *testing.T) {
in := []domain.MessageEntity{
{
Type: domain.MessageEntityFormattedDate,
Offset: 2,
Length: 5,
Date: 1773436800,
Relative: true,
ShortTime: true,
LongDate: true,
DayOfWeek: true,
},
}
raw, err := encodeMessageEntities(in)
if err != nil {
t.Fatalf("encodeMessageEntities: %v", err)
}
out, err := decodeMessageEntities(string(raw))
if err != nil {
t.Fatalf("decodeMessageEntities: %v", err)
}
if !sameMessageEntities(in, out) {
t.Fatalf("round-trip entities = %+v raw=%s, want %+v", out, raw, in)
}
}

View file

@ -43,7 +43,10 @@ func TestMessageStoreSendPrivateTextRoundTrip(t *testing.T) {
RecipientUserID: recipient.ID,
RandomID: 123456,
Message: "hello from pg",
Entities: []domain.MessageEntity{{Type: domain.MessageEntityBold, Offset: 0, Length: 5}},
Entities: []domain.MessageEntity{
{Type: domain.MessageEntityBold, Offset: 0, Length: 5},
{Type: domain.MessageEntityFormattedDate, Offset: 6, Length: 4, Date: 1773436800, ShortTime: true, LongDate: true},
},
Date: 1700000200,
OriginAuthKeyID: originAuthKeyID,
OriginSessionID: 77,
@ -73,6 +76,9 @@ func TestMessageStoreSendPrivateTextRoundTrip(t *testing.T) {
if len(senderHistory.Messages) != 1 || len(recipientHistory.Messages) != 1 {
t.Fatalf("history sizes = sender %d recipient %d, want both owner partitions populated", len(senderHistory.Messages), len(recipientHistory.Messages))
}
if !sameMessageEntities(senderHistory.Messages[0].Entities, req.Entities) || !sameMessageEntities(recipientHistory.Messages[0].Entities, req.Entities) {
t.Fatalf("history entities sender=%+v recipient=%+v, want %+v", senderHistory.Messages[0].Entities, recipientHistory.Messages[0].Entities, req.Entities)
}
events, err := NewUpdateEventStore(pool).ListAfter(ctx, recipient.ID, 0, 10)
if err != nil {