diff --git a/server/core_channel.go b/server/core_channel.go index f2270e5f9..aba8d3456 100644 --- a/server/core_channel.go +++ b/server/core_channel.go @@ -131,7 +131,6 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3: userIDOne := stream.Subject.String() userIDTwo := stream.Subcontext.String() messages := make([]*api.ChannelMessage, 0, limit) - createTimeNano := make(map[string]int64) var nextCursor, prevCursor *channelMessageListCursor var dbID string @@ -141,19 +140,23 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3: var dbContent string var dbCreateTime pgtype.Timestamptz var dbUpdateTime pgtype.Timestamptz + var dbFirstCreateTimeNano int64 + var dbLastCreateTimeNano int64 for rows.Next() { if len(messages) >= limit { + dbLastCreateTimeNano = dbCreateTime.Time.UnixNano() nextCursor = &channelMessageListCursor{ StreamMode: stream.Mode, StreamSubject: stream.Subject.String(), StreamSubcontext: stream.Subcontext.String(), StreamLabel: stream.Label, - CreateTime: dbCreateTime.Time.UnixNano(), + CreateTime: dbLastCreateTimeNano, Id: dbID, Forward: forward, IsNext: true, } break + } err = rows.Scan(&dbID, &dbCode, &dbSenderID, &dbUsername, &dbContent, &dbCreateTime, &dbUpdateTime) @@ -174,7 +177,6 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3: UpdateTime: ×tamppb.Timestamp{Seconds: dbUpdateTime.Time.Unix()}, Persistent: &wrapperspb.BoolValue{Value: true}, } - createTimeNano[dbID] = dbCreateTime.Time.UnixNano() switch stream.Mode { case StreamModeChannel: message.RoomName = stream.Label @@ -187,6 +189,9 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3: messages = append(messages, message) + if dbFirstCreateTimeNano == 0 { + dbFirstCreateTimeNano = dbCreateTime.Time.UnixNano() + } // There can only be a previous page if this is a paginated listing. if incomingCursor != nil && prevCursor == nil { prevCursor = &channelMessageListCursor{ @@ -194,7 +199,7 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3: StreamSubject: stream.Subject.String(), StreamSubcontext: stream.Subcontext.String(), StreamLabel: stream.Label, - CreateTime: dbCreateTime.Time.UnixNano(), + CreateTime: dbFirstCreateTimeNano, Id: dbID, Forward: forward, IsNext: false, @@ -203,6 +208,7 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3: } _ = rows.Close() + flipped := false if incomingCursor != nil && !incomingCursor.IsNext { // If this was a previous page listing, flip the results to their normal order and swap the cursors. nextCursor, prevCursor = prevCursor, nextCursor @@ -216,17 +222,22 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3: for i, j := 0, len(messages)-1; i < j; i, j = i+1, j-1 { messages[i], messages[j] = messages[j], messages[i] } + flipped = true } var cacheableCursor *channelMessageListCursor if l := len(messages); l > 0 { + createTime := dbLastCreateTimeNano + if flipped { + createTime = dbFirstCreateTimeNano + } // There is at least 1 message returned by the listing, so use it as the foundation of a new cacheable cursor. cacheableCursor = &channelMessageListCursor{ StreamMode: stream.Mode, StreamSubject: stream.Subject.String(), StreamSubcontext: stream.Subcontext.String(), StreamLabel: stream.Label, - CreateTime: createTimeNano[messages[l-1].MessageId], + CreateTime: createTime, Id: messages[l-1].MessageId, Forward: true, IsNext: true, @@ -341,7 +352,6 @@ WHERE stream_mode = $1 AND stream_subject = $2::UUID AND stream_descriptor = $3: if start > 0 { // Check if there might be a prev cursor setPrevCursor = true - firstRecords = firstRecords[:len(firstRecords)-1] } records = records[start:end]