⚡ Add cache into typing status set queries
This commit is contained in:
parent
a8a3c8cc71
commit
f97cb877f5
@ -3,6 +3,7 @@ package services
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"git.solsynth.dev/hydrogen/dealer/pkg/hyper"
|
"git.solsynth.dev/hydrogen/dealer/pkg/hyper"
|
||||||
"git.solsynth.dev/hydrogen/dealer/pkg/proto"
|
"git.solsynth.dev/hydrogen/dealer/pkg/proto"
|
||||||
@ -11,27 +12,55 @@ import (
|
|||||||
"git.solsynth.dev/hydrogen/messaging/pkg/internal/models"
|
"git.solsynth.dev/hydrogen/messaging/pkg/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type statusQueryCacheEntry struct {
|
||||||
|
Account models.Account
|
||||||
|
Member models.ChannelMember
|
||||||
|
Channel models.Channel
|
||||||
|
}
|
||||||
|
|
||||||
|
var statusQueryCacheLock sync.Mutex
|
||||||
|
|
||||||
|
// Map for caching typing status queries [channel id][user id]
|
||||||
|
var statusQueryCache map[uint]map[uint]statusQueryCacheEntry
|
||||||
|
|
||||||
func SetTypingStatus(channelId uint, userId uint) error {
|
func SetTypingStatus(channelId uint, userId uint) error {
|
||||||
var account models.Account
|
var account models.Account
|
||||||
if err := database.C.Where("external_id = ?", userId).First(&account).Error; err != nil {
|
|
||||||
return fmt.Errorf("account not found: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
var member models.ChannelMember
|
var member models.ChannelMember
|
||||||
if err := database.C.
|
|
||||||
Where("account_id = ? AND channel_id = ?", account.ID, channelId).
|
|
||||||
First(&member).Error; err != nil {
|
|
||||||
return fmt.Errorf("channel member not found: %v", err)
|
|
||||||
} else {
|
|
||||||
member.Account = account
|
|
||||||
}
|
|
||||||
|
|
||||||
var channel models.Channel
|
var channel models.Channel
|
||||||
if err := database.C.
|
|
||||||
Preload("Members").
|
if channelLevel, ok := statusQueryCache[channelId]; ok {
|
||||||
Where("id = ?", channelId).
|
if entry, ok := channelLevel[userId]; ok {
|
||||||
First(&channel).Error; err != nil {
|
account = entry.Account
|
||||||
return fmt.Errorf("channel not found: %v", err)
|
member = entry.Member
|
||||||
|
channel = entry.Channel
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if err := database.C.Where("external_id = ?", userId).First(&account).Error; err != nil {
|
||||||
|
return fmt.Errorf("account not found: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := database.C.
|
||||||
|
Where("account_id = ? AND channel_id = ?", account.ID, channelId).
|
||||||
|
First(&member).Error; err != nil {
|
||||||
|
return fmt.Errorf("channel member not found: %v", err)
|
||||||
|
} else {
|
||||||
|
member.Account = account
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := database.C.
|
||||||
|
Preload("Members").
|
||||||
|
Where("id = ?", channelId).
|
||||||
|
First(&channel).Error; err != nil {
|
||||||
|
return fmt.Errorf("channel not found: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cache queries
|
||||||
|
statusQueryCacheLock.Lock()
|
||||||
|
if _, ok := statusQueryCache[channelId]; !ok {
|
||||||
|
statusQueryCache[channelId] = make(map[uint]statusQueryCacheEntry)
|
||||||
|
}
|
||||||
|
statusQueryCache[channelId][userId] = statusQueryCacheEntry{account, member, channel}
|
||||||
|
statusQueryCacheLock.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
var broadcastTarget []uint64
|
var broadcastTarget []uint64
|
||||||
|
Loading…
Reference in New Issue
Block a user