44 lines
1.2 KiB
Go
44 lines
1.2 KiB
Go
package chat
|
|
|
|
import (
|
|
"context"
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
const adminChatCountsCacheTTL = 5 * time.Second
|
|
|
|
func (r *Repository) adminChatCountsCacheKey(principal Principal, filter, stage, keyword string) string {
|
|
sum := sha256.Sum256([]byte(keyword))
|
|
return fmt.Sprintf("admin-chat:counts:v2:%s:%d:%s:%s:%s", principal.Type, principal.ID, filter, stage, hex.EncodeToString(sum[:8]))
|
|
}
|
|
|
|
func (r *Repository) loadAdminChatCountsCache(ctx context.Context, principal Principal, filter, stage, keyword string) *AdminConversationCountsDTO {
|
|
if r.redis == nil {
|
|
return nil
|
|
}
|
|
raw, err := r.redis.Get(ctx, r.adminChatCountsCacheKey(principal, filter, stage, keyword)).Bytes()
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
var value AdminConversationCountsDTO
|
|
if err := json.Unmarshal(raw, &value); err != nil {
|
|
return nil
|
|
}
|
|
return &value
|
|
}
|
|
|
|
func (r *Repository) storeAdminChatCountsCache(ctx context.Context, principal Principal, filter, stage, keyword string, value *AdminConversationCountsDTO) {
|
|
if r.redis == nil || value == nil {
|
|
return
|
|
}
|
|
raw, err := json.Marshal(value)
|
|
if err != nil {
|
|
return
|
|
}
|
|
_ = r.redis.Set(ctx, r.adminChatCountsCacheKey(principal, filter, stage, keyword), raw, adminChatCountsCacheTTL).Err()
|
|
}
|