package company import ( "context" "strings" ) const recommendedTendersPageCacheKeyPrefix = "ai:recommendations:page:" func recommendedTendersPageCacheKey(companyID, language string) string { return recommendedTendersPageCacheKeyPrefix + strings.TrimSpace(companyID) + ":" + strings.ToLower(strings.TrimSpace(language)) } func (s *companyService) invalidateRecommendedTendersPageCache(ctx context.Context, companyID string) { if s.redisClient == nil { return } for _, language := range s.pageCacheLanguages { lang := strings.ToLower(strings.TrimSpace(language)) if lang == "" { continue } _ = s.redisClient.Del(ctx, recommendedTendersPageCacheKey(companyID, lang)) } } func (s *companyService) scheduleRecommendedTendersPageCacheRefresh(companyID string) { if s.pageCacheRefresher == nil { return } s.pageCacheRefresher.ScheduleRefreshRecommendedTendersPageCache(companyID) } // SetRecommendedTendersPageCacheRefresher wires async page-cache rebuilds from the tender service. func (s *companyService) SetRecommendedTendersPageCacheRefresher(refresher RecommendedTendersPageCacheRefresher) { s.pageCacheRefresher = refresher } // SetPageCacheLanguages configures which language variants are invalidated in Redis. func (s *companyService) SetPageCacheLanguages(languages []string) { s.pageCacheLanguages = normalizePageCacheLanguages("", languages) } func normalizePageCacheLanguages(defaultLanguage string, languages []string) []string { seen := make(map[string]struct{}) out := make([]string, 0, len(languages)+1) add := func(lang string) { lang = strings.ToLower(strings.TrimSpace(lang)) if lang == "" { return } if _, ok := seen[lang]; ok { return } seen[lang] = struct{}{} out = append(out, lang) } add(defaultLanguage) for _, lang := range languages { add(lang) } if len(out) == 0 { out = append(out, "en") } return out }