Skip to content

Commit ca6c1de

Browse files
LBeernaertProtoncuthix
authored andcommitted
feat(GODT-2829): Extend Metadata with some missing features
* Allow sorting in descending order * Add `EndID` parameter to match in query.
1 parent f042271 commit ca6c1de

File tree

5 files changed

+58
-4
lines changed

5 files changed

+58
-4
lines changed

message.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,15 +248,13 @@ func (c *Client) GetMessageMetadataPage(ctx context.Context, page, pageSize int,
248248
PageSize int
249249

250250
Sort string
251-
Desc Bool
252251
}{
253252
MessageFilter: filter,
254253

255254
Page: page,
256255
PageSize: pageSize,
257256

258257
Sort: "ID",
259-
Desc: false,
260258
}
261259

262260
for {

message_types.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ type MessageFilter struct {
5454
AddressID string `json:",omitempty"`
5555
ExternalID string `json:",omitempty"`
5656
LabelID string `json:",omitempty"`
57+
EndID string `json:",omitempty"`
58+
Desc Bool
5759
}
5860

5961
type Message struct {

server/backend/api.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,23 @@ func (b *Backend) GetMessages(userID string, page, pageSize int, filter proton.M
360360
return nil, err
361361
}
362362

363+
if filter.Desc {
364+
xslices.Reverse(metadata)
365+
}
366+
367+
// Note that this not a perfect replacement as we don't handle the case where this message could have been
368+
// deleted in between this metadata request. The backend has the information stored differently and can
369+
// resolve these gaps.
370+
if filter.EndID != "" {
371+
index := xslices.IndexFunc(metadata, func(metadata proton.MessageMetadata) bool {
372+
return metadata.ID == filter.EndID
373+
})
374+
375+
if index >= 0 {
376+
metadata = metadata[index:]
377+
}
378+
}
379+
363380
metadata = xslices.Filter(metadata, func(metadata proton.MessageMetadata) bool {
364381
if len(filter.ID) > 0 {
365382
if !slices.Contains(filter.ID, metadata.ID) {
@@ -548,7 +565,6 @@ func (b *Backend) CreateDraft(userID, addrID string, draft proton.DraftTemplate,
548565
}
549566
}
550567
msg := newMessageFromTemplate(addrID, draft, parentRef)
551-
552568
// Drafts automatically get the sysLabel "Drafts".
553569
msg.addLabel(proton.DraftsLabel, labels)
554570

server/backend/backend.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package backend
22

33
import (
44
"fmt"
5-
"golang.org/x/exp/slices"
65
"net/mail"
76
"sync"
87
"time"
@@ -14,6 +13,7 @@ import (
1413
"github.com/bradenaw/juniper/xslices"
1514
"github.com/google/uuid"
1615
"golang.org/x/exp/maps"
16+
"golang.org/x/exp/slices"
1717
)
1818

1919
type Backend struct {

server/server_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,44 @@ func TestServer_MessageFilter(t *testing.T) {
233233
})
234234
}
235235

236+
func TestServer_MessageFilterDesc(t *testing.T) {
237+
withServer(t, func(ctx context.Context, s *Server, m *proton.Manager) {
238+
withUser(ctx, t, s, m, "user", "pass", func(c *proton.Client) {
239+
withMessages(ctx, t, c, "pass", 100, func(messageIDs []string) {
240+
allMetadata := make([]proton.MessageMetadata, 0, 100)
241+
242+
// first request.
243+
{
244+
metadata, err := c.GetMessageMetadataPage(ctx, 0, 10, proton.MessageFilter{Desc: true})
245+
require.NoError(t, err)
246+
247+
allMetadata = append(allMetadata, metadata...)
248+
}
249+
250+
for i := 1; i < 11; i++ {
251+
// Get the messages.
252+
metadata, err := c.GetMessageMetadataPage(ctx, 0, 10, proton.MessageFilter{Desc: true, EndID: allMetadata[len(allMetadata)-1].ID})
253+
require.NoError(t, err)
254+
require.NotEmpty(t, metadata)
255+
require.Equal(t, metadata[0].ID, allMetadata[len(allMetadata)-1].ID)
256+
allMetadata = append(allMetadata, metadata[1:]...)
257+
}
258+
259+
// Final check. Asking for EndID as last message multiple times will always return the last id.
260+
metadata, err := c.GetMessageMetadataPage(ctx, 0, 10, proton.MessageFilter{Desc: true, EndID: allMetadata[len(allMetadata)-1].ID})
261+
require.NoError(t, err)
262+
require.Len(t, metadata, 1)
263+
require.Equal(t, metadata[0].ID, allMetadata[len(allMetadata)-1].ID)
264+
265+
// The messages should be the ones we created.
266+
require.ElementsMatch(t, messageIDs, xslices.Map(allMetadata, func(metadata proton.MessageMetadata) string {
267+
return metadata.ID
268+
}))
269+
})
270+
})
271+
})
272+
}
273+
236274
func TestServer_MessageIDs(t *testing.T) {
237275
withServer(t, func(ctx context.Context, s *Server, m *proton.Manager) {
238276
withUser(ctx, t, s, m, "user", "pass", func(c *proton.Client) {

0 commit comments

Comments
 (0)