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() }