fix(messages): sync preserve private dialogs after clearing history

This commit is contained in:
iamxvbaba 2026-07-29 13:51:02 +08:00
parent 3926db7762
commit e22fac1c3f
19 changed files with 923 additions and 231 deletions

View file

@ -0,0 +1,30 @@
package rpc
import (
"testing"
"github.com/iamxvbaba/td/tg"
"telesrv/internal/domain"
)
func TestTGMessageProjectsHistoryClearServiceAction(t *testing.T) {
message := domain.NewHistoryClearMessage(
1001,
domain.Peer{Type: domain.PeerTypeUser, ID: 1002},
77,
88,
1700000000,
9,
)
got, ok := tgMessage(message).(*tg.MessageService)
if !ok {
t.Fatalf("message = %T, want *tg.MessageService", tgMessage(message))
}
if got.ID != 77 || !got.Out || got.PeerID == nil || got.FromID == nil {
t.Fatalf("service message = %+v, want owner-local id/peer/from", got)
}
if _, ok := got.Action.(*tg.MessageActionHistoryClear); !ok {
t.Fatalf("action = %T, want *tg.MessageActionHistoryClear", got.Action)
}
}

View file

@ -137,6 +137,8 @@ func tgMessageServiceAction(msg domain.Message) tg.MessageActionClass {
return nil
}
switch m.ServiceAction.Kind {
case domain.MessageServiceActionHistoryClear:
return &tg.MessageActionHistoryClear{}
case domain.MessageServiceActionSuggestProfilePhoto:
if m.ServiceAction.Photo == nil || m.ServiceAction.Photo.ID == 0 {
return &tg.MessageActionEmpty{}

View file

@ -34,10 +34,11 @@ func (r *Router) onMessagesDeleteMessages(ctx context.Context, req *tg.MessagesD
return nil, internalErr()
}
self := res.Self()
if len(self.MessageIDs) == 0 || self.Event.Pts == 0 {
pts, ptsCount := self.AffectedPts()
if len(self.MessageIDs) == 0 || pts == 0 {
return r.affectedMessages(ctx, authKeyID, userID)
}
return &tg.MessagesAffectedMessages{Pts: self.Event.Pts, PtsCount: self.Event.PtsCount}, nil
return &tg.MessagesAffectedMessages{Pts: pts, PtsCount: ptsCount}, nil
}
func (r *Router) onMessagesDeleteHistory(ctx context.Context, req *tg.MessagesDeleteHistoryRequest) (*tg.MessagesAffectedHistory, error) {
@ -109,12 +110,13 @@ func (r *Router) onMessagesDeleteHistory(ctx context.Context, req *tg.MessagesDe
return nil, internalErr()
}
self := res.Self()
if len(self.MessageIDs) == 0 || self.Event.Pts == 0 {
pts, ptsCount := self.AffectedPts()
if pts == 0 {
return r.affectedHistory(ctx, authKeyID, userID, 0)
}
return &tg.MessagesAffectedHistory{
Pts: self.Event.Pts,
PtsCount: self.Event.PtsCount,
Pts: pts,
PtsCount: ptsCount,
Offset: res.Offset,
}, nil
}

View file

@ -149,6 +149,8 @@ func TestMessagesDeleteHistoryPassesJustClearContext(t *testing.T) {
UserID: userID,
MessageIDs: []int{1, 2, 3},
Event: domain.UpdateEvent{Pts: 12, PtsCount: 3},
Pts: 14,
PtsCount: 5,
}},
}}
r := New(Config{}, Deps{Messages: messages}, zaptest.NewLogger(t), clock.System)
@ -171,8 +173,8 @@ func TestMessagesDeleteHistoryPassesJustClearContext(t *testing.T) {
if !ok {
t.Fatalf("response = %T, want *tg.MessagesAffectedHistory", enc)
}
if got.Pts != 12 || got.PtsCount != 3 {
t.Fatalf("affected = %+v, want pts=12 pts_count=3", got)
if got.Pts != 14 || got.PtsCount != 5 {
t.Fatalf("affected = %+v, want aggregate pts=14 pts_count=5", got)
}
reqGot := messages.deleteHistoryReq
if reqGot.OwnerUserID != userID || reqGot.Peer.ID != peerID || reqGot.MaxID != 15 || !reqGot.JustClear || !reqGot.Revoke || reqGot.OriginSessionID != 88 || reqGot.OriginAuthKeyID != authKeyID {