36 lines
905 B
Go
36 lines
905 B
Go
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 {
|
|
if err := database.C.Model(&models.ChannelMember{}).
|
|
Where("id = ?", k).
|
|
Updates(map[string]any{
|
|
"reading_anchor": gorm.Expr("GREATEST(COALESCE(reading_anchor, 0), ?)", v),
|
|
}).Error; err != nil {
|
|
log.Error().Err(err).Msg("An error occurred when flushing reading anchor...")
|
|
return
|
|
}
|
|
}
|
|
clear(readingAnchorQueue)
|
|
}
|