Messaging/pkg/internal/services/reading_anchor.go

36 lines
905 B
Go
Raw Normal View History

2025-02-22 23:31:52 +08:00
package services
import (
"git.solsynth.dev/hypernet/messaging/pkg/internal/database"
"git.solsynth.dev/hypernet/messaging/pkg/internal/models"
"github.com/rs/zerolog/log"
"gorm.io/gorm"
)
var readingAnchorQueue = make(map[uint]uint)
func SetReadingAnchor(memberId uint, eventId uint) {
if val, ok := readingAnchorQueue[memberId]; ok {
readingAnchorQueue[memberId] = max(eventId, val)
} else {
readingAnchorQueue[memberId] = eventId
}
}
func FlushReadingAnchor() {
if len(readingAnchorQueue) == 0 {
return
}
for k, v := range readingAnchorQueue {
2025-02-23 00:58:20 +08:00
if err := database.C.Model(&models.ChannelMember{}).
Where("id = ?", k).
Updates(map[string]any{
2025-02-23 01:10:45 +08:00
"reading_anchor": gorm.Expr("GREATEST(COALESCE(reading_anchor, 0), ?)", v),
2025-02-23 00:58:20 +08:00
}).Error; err != nil {
log.Error().Err(err).Msg("An error occurred when flushing reading anchor...")
return
}
2025-02-22 23:31:52 +08:00
}
2025-02-23 00:58:20 +08:00
clear(readingAnchorQueue)
2025-02-22 23:31:52 +08:00
}