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:
parent
541b8d3b88
commit
26e96616bf
7 changed files with 1287 additions and 1204 deletions
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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) | | |
|
||||
|
||||
|
|
2417
pb/commands.pb.go
2417
pb/commands.pb.go
File diff suppressed because it is too large
Load diff
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue