1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-09 09:35:00 +09:00

GO-4111: ChatGetMessages: Add AfterOrderId

This commit is contained in:
Sergey 2024-11-22 11:11:53 +01:00
parent 541b8d3b88
commit 26e96616bf
No known key found for this signature in database
GPG key ID: 3B6BEF79160221C6
7 changed files with 1287 additions and 1204 deletions

View file

@ -18,7 +18,7 @@ type Service interface {
EditMessage(ctx context.Context, chatObjectId string, messageId string, newMessage *model.ChatMessage) error
ToggleMessageReaction(ctx context.Context, chatObjectId string, messageId string, emoji string) error
DeleteMessage(ctx context.Context, chatObjectId string, messageId string) error
GetMessages(ctx context.Context, chatObjectId string, beforeOrderId string, limit int) ([]*model.ChatMessage, error)
GetMessages(ctx context.Context, chatObjectId string, req chatobject.GetMessagesRequest) ([]*model.ChatMessage, error)
GetMessagesByIds(ctx context.Context, chatObjectId string, messageIds []string) ([]*model.ChatMessage, error)
SubscribeLastMessages(ctx context.Context, chatObjectId string, limit int) ([]*model.ChatMessage, int, error)
Unsubscribe(chatObjectId string) error
@ -74,10 +74,10 @@ func (s *service) DeleteMessage(ctx context.Context, chatObjectId string, messag
})
}
func (s *service) GetMessages(ctx context.Context, chatObjectId string, beforeOrderId string, limit int) ([]*model.ChatMessage, error) {
func (s *service) GetMessages(ctx context.Context, chatObjectId string, req chatobject.GetMessagesRequest) ([]*model.ChatMessage, error) {
var res []*model.ChatMessage
err := cache.Do(s.objectGetter, chatObjectId, func(sb chatobject.StoreObject) error {
msgs, err := sb.GetMessages(ctx, beforeOrderId, limit)
msgs, err := sb.GetMessages(ctx, req)
if err != nil {
return err
}

View file

@ -25,6 +25,7 @@ import (
const (
collectionName = "chats"
descOrder = "-_o.id"
ascOrder = "_o.id"
)
type StoreObject interface {
@ -32,7 +33,7 @@ type StoreObject interface {
anystoredebug.AnystoreDebug
AddMessage(ctx context.Context, sessionCtx session.Context, message *model.ChatMessage) (string, error)
GetMessages(ctx context.Context, beforeOrderId string, limit int) ([]*model.ChatMessage, error)
GetMessages(ctx context.Context, req GetMessagesRequest) ([]*model.ChatMessage, error)
GetMessagesByIds(ctx context.Context, messageIds []string) ([]*model.ChatMessage, error)
EditMessage(ctx context.Context, messageId string, newMessage *model.ChatMessage) error
ToggleMessageReaction(ctx context.Context, messageId string, emoji string) error
@ -41,6 +42,12 @@ type StoreObject interface {
Unsubscribe() error
}
type GetMessagesRequest struct {
AfterOrderId string
BeforeOrderId string
Limit int
}
type AccountService interface {
AccountID() string
}
@ -129,20 +136,26 @@ func (s *storeObject) GetMessagesByIds(ctx context.Context, messageIds []string)
return messages, txn.Commit()
}
func (s *storeObject) GetMessages(ctx context.Context, beforeOrderId string, limit int) ([]*model.ChatMessage, error) {
func (s *storeObject) GetMessages(ctx context.Context, req GetMessagesRequest) ([]*model.ChatMessage, error) {
coll, err := s.store.Collection(ctx, collectionName)
if err != nil {
return nil, fmt.Errorf("get collection: %w", err)
}
var msgs []*model.ChatMessage
if beforeOrderId != "" {
qry := coll.Find(query.Key{Path: []string{orderKey, "id"}, Filter: query.NewComp(query.CompOpLt, beforeOrderId)}).Sort(descOrder).Limit(uint(limit))
if req.AfterOrderId != "" {
qry := coll.Find(query.Key{Path: []string{orderKey, "id"}, Filter: query.NewComp(query.CompOpGt, req.AfterOrderId)}).Sort(ascOrder).Limit(uint(req.Limit))
msgs, err = s.queryMessages(ctx, qry)
if err != nil {
return nil, fmt.Errorf("query messages: %w", err)
}
} else if req.BeforeOrderId != "" {
qry := coll.Find(query.Key{Path: []string{orderKey, "id"}, Filter: query.NewComp(query.CompOpLt, req.BeforeOrderId)}).Sort(descOrder).Limit(uint(req.Limit))
msgs, err = s.queryMessages(ctx, qry)
if err != nil {
return nil, fmt.Errorf("query messages: %w", err)
}
} else {
qry := coll.Find(nil).Sort(descOrder).Limit(uint(limit))
qry := coll.Find(nil).Sort(descOrder).Limit(uint(req.Limit))
msgs, err = s.queryMessages(ctx, qry)
if err != nil {
return nil, fmt.Errorf("query messages: %w", err)

View file

@ -96,7 +96,7 @@ func TestAddMessage(t *testing.T) {
assert.NotEmpty(t, messageId)
assert.NotEmpty(t, sessionCtx.GetMessages())
messages, err := fx.GetMessages(ctx, "", 0)
messages, err := fx.GetMessages(ctx, GetMessagesRequest{})
require.NoError(t, err)
require.Len(t, messages, 1)
@ -121,20 +121,32 @@ func TestGetMessages(t *testing.T) {
assert.NotEmpty(t, messageId)
}
messages, err := fx.GetMessages(ctx, "", 5)
messages, err := fx.GetMessages(ctx, GetMessagesRequest{Limit: 5})
require.NoError(t, err)
wantTexts := []string{"text 6", "text 7", "text 8", "text 9", "text 10"}
for i, msg := range messages {
assert.Equal(t, wantTexts[i], msg.Message.Text)
}
lastOrderId := messages[0].OrderId
messages, err = fx.GetMessages(ctx, lastOrderId, 10)
require.NoError(t, err)
wantTexts = []string{"text 1", "text 2", "text 3", "text 4", "text 5"}
for i, msg := range messages {
assert.Equal(t, wantTexts[i], msg.Message.Text)
}
t.Run("with requested BeforeOrderId", func(t *testing.T) {
lastOrderId := messages[0].OrderId // text 6
gotMessages, err := fx.GetMessages(ctx, GetMessagesRequest{BeforeOrderId: lastOrderId, Limit: 5})
require.NoError(t, err)
wantTexts = []string{"text 1", "text 2", "text 3", "text 4", "text 5"}
for i, msg := range gotMessages {
assert.Equal(t, wantTexts[i], msg.Message.Text)
}
})
t.Run("with requested AfterOrderId", func(t *testing.T) {
lastOrderId := messages[0].OrderId // text 6
gotMessages, err := fx.GetMessages(ctx, GetMessagesRequest{AfterOrderId: lastOrderId, Limit: 2})
require.NoError(t, err)
wantTexts = []string{"text 7", "text 8"}
for i, msg := range gotMessages {
assert.Equal(t, wantTexts[i], msg.Message.Text)
}
})
}
func TestGetMessagesByIds(t *testing.T) {
@ -177,7 +189,7 @@ func TestEditMessage(t *testing.T) {
err = fx.EditMessage(ctx, messageId, editedMessage)
require.NoError(t, err)
messages, err := fx.GetMessages(ctx, "", 0)
messages, err := fx.GetMessages(ctx, GetMessagesRequest{})
require.NoError(t, err)
require.Len(t, messages, 1)
@ -212,7 +224,7 @@ func TestEditMessage(t *testing.T) {
require.Error(t, err)
// Check that nothing is changed
messages, err := fx.GetMessages(ctx, "", 0)
messages, err := fx.GetMessages(ctx, GetMessagesRequest{})
require.NoError(t, err)
require.Len(t, messages, 1)
@ -268,7 +280,7 @@ func TestToggleReaction(t *testing.T) {
require.NoError(t, err)
})
messages, err := fx.GetMessages(ctx, "", 0)
messages, err := fx.GetMessages(ctx, GetMessagesRequest{})
require.NoError(t, err)
require.Len(t, messages, 1)

View file

@ -4,6 +4,7 @@ import (
"context"
"github.com/anyproto/anytype-heart/core/block/chats"
"github.com/anyproto/anytype-heart/core/block/editor/chatobject"
"github.com/anyproto/anytype-heart/pb"
)
@ -65,7 +66,11 @@ func (mw *Middleware) ChatDeleteMessage(cctx context.Context, req *pb.RpcChatDel
func (mw *Middleware) ChatGetMessages(cctx context.Context, req *pb.RpcChatGetMessagesRequest) *pb.RpcChatGetMessagesResponse {
chatService := getService[chats.Service](mw)
messages, err := chatService.GetMessages(cctx, req.ChatObjectId, req.BeforeOrderId, int(req.Limit))
messages, err := chatService.GetMessages(cctx, req.ChatObjectId, chatobject.GetMessagesRequest{
AfterOrderId: req.AfterOrderId,
BeforeOrderId: req.BeforeOrderId,
Limit: int(req.Limit),
})
code := mapErrorCode[pb.RpcChatGetMessagesResponseErrorCode](err)
return &pb.RpcChatGetMessagesResponse{
Messages: messages,

View file

@ -10117,6 +10117,7 @@ Get marks list in the selected range in text block.
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| chatObjectId | [string](#string) | | |
| afterOrderId | [string](#string) | | OrderId of the message after which to get messages |
| beforeOrderId | [string](#string) | | OrderId of the message before which to get messages |
| limit | [int32](#int32) | | |

File diff suppressed because it is too large Load diff

View file

@ -7568,6 +7568,7 @@ message Rpc {
message GetMessages {
message Request {
string chatObjectId = 1;
string afterOrderId = 4; // OrderId of the message after which to get messages
string beforeOrderId = 2; // OrderId of the message before which to get messages
int32 limit = 3;
}