@@ -138,7 +138,6 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3:
138
138
userIDOne := stream .Subject .String ()
139
139
userIDTwo := stream .Subcontext .String ()
140
140
messages := make ([]* api.ChannelMessage , 0 , limit )
141
- createTimeNano := make (map [string ]int64 )
142
141
var nextCursor , prevCursor * channelMessageListCursor
143
142
144
143
var dbID string
@@ -148,19 +147,23 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3:
148
147
var dbContent string
149
148
var dbCreateTime pgtype.Timestamptz
150
149
var dbUpdateTime pgtype.Timestamptz
150
+ var dbFirstCreateTimeNano int64
151
+ var dbLastCreateTimeNano int64
151
152
for rows .Next () {
152
153
if len (messages ) >= limit {
154
+ dbLastCreateTimeNano = dbCreateTime .Time .UnixNano ()
153
155
nextCursor = & channelMessageListCursor {
154
156
StreamMode : stream .Mode ,
155
157
StreamSubject : stream .Subject .String (),
156
158
StreamSubcontext : stream .Subcontext .String (),
157
159
StreamLabel : stream .Label ,
158
- CreateTime : dbCreateTime . Time . UnixNano () ,
160
+ CreateTime : dbLastCreateTimeNano ,
159
161
Id : dbID ,
160
162
Forward : forward ,
161
163
IsNext : true ,
162
164
}
163
165
break
166
+
164
167
}
165
168
166
169
err = rows .Scan (& dbID , & dbCode , & dbSenderID , & dbUsername , & dbContent , & dbCreateTime , & dbUpdateTime )
@@ -181,7 +184,6 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3:
181
184
UpdateTime : & timestamppb.Timestamp {Seconds : dbUpdateTime .Time .Unix ()},
182
185
Persistent : & wrapperspb.BoolValue {Value : true },
183
186
}
184
- createTimeNano [dbID ] = dbCreateTime .Time .UnixNano ()
185
187
switch stream .Mode {
186
188
case StreamModeChannel :
187
189
message .RoomName = stream .Label
@@ -194,14 +196,17 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3:
194
196
195
197
messages = append (messages , message )
196
198
199
+ if dbFirstCreateTimeNano == 0 {
200
+ dbFirstCreateTimeNano = dbCreateTime .Time .UnixNano ()
201
+ }
197
202
// There can only be a previous page if this is a paginated listing.
198
203
if incomingCursor != nil && prevCursor == nil {
199
204
prevCursor = & channelMessageListCursor {
200
205
StreamMode : stream .Mode ,
201
206
StreamSubject : stream .Subject .String (),
202
207
StreamSubcontext : stream .Subcontext .String (),
203
208
StreamLabel : stream .Label ,
204
- CreateTime : dbCreateTime . Time . UnixNano () ,
209
+ CreateTime : dbFirstCreateTimeNano ,
205
210
Id : dbID ,
206
211
Forward : forward ,
207
212
IsNext : false ,
@@ -210,6 +215,7 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3:
210
215
}
211
216
_ = rows .Close ()
212
217
218
+ flipped := false
213
219
if incomingCursor != nil && ! incomingCursor .IsNext {
214
220
// If this was a previous page listing, flip the results to their normal order and swap the cursors.
215
221
nextCursor , prevCursor = prevCursor , nextCursor
@@ -223,17 +229,22 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3:
223
229
for i , j := 0 , len (messages )- 1 ; i < j ; i , j = i + 1 , j - 1 {
224
230
messages [i ], messages [j ] = messages [j ], messages [i ]
225
231
}
232
+ flipped = true
226
233
}
227
234
228
235
var cacheableCursor * channelMessageListCursor
229
236
if l := len (messages ); l > 0 {
237
+ createTime := dbLastCreateTimeNano
238
+ if flipped {
239
+ createTime = dbFirstCreateTimeNano
240
+ }
230
241
// There is at least 1 message returned by the listing, so use it as the foundation of a new cacheable cursor.
231
242
cacheableCursor = & channelMessageListCursor {
232
243
StreamMode : stream .Mode ,
233
244
StreamSubject : stream .Subject .String (),
234
245
StreamSubcontext : stream .Subcontext .String (),
235
246
StreamLabel : stream .Label ,
236
- CreateTime : createTimeNano [ messages [ l - 1 ]. MessageId ] ,
247
+ CreateTime : createTime ,
237
248
Id : messages [l - 1 ].MessageId ,
238
249
Forward : true ,
239
250
IsNext : true ,
@@ -348,7 +359,6 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3:
348
359
if start > 0 {
349
360
// Check if there might be a prev cursor
350
361
setPrevCursor = true
351
- firstRecords = firstRecords [:len (firstRecords )- 1 ]
352
362
}
353
363
354
364
records = records [start :end ]
0 commit comments