fleet/tools/github-manage/pkg/ghapi/cache.go
George Karr df5e42a54c
Github Manager (#31540)
New tool to help with github management. Read all about it in the
[README](https://github.com/fleetdm/fleet/blob/gkarr-gm/tools/github-manage/README.md)
on this branch.
2025-08-07 15:00:36 -05:00

81 lines
2.3 KiB
Go

package ghapi
import (
"fmt"
"sync"
)
// Cache structures for performance optimization
var (
// projectNodeIDCache caches project number to project GraphQL node ID mappings
projectNodeIDCache = make(map[int]string)
projectNodeIDMutex sync.RWMutex
// projectItemIDCache caches (issue number, project ID) to project item ID mappings
projectItemIDCache = make(map[string]string)
projectItemIDMutex sync.RWMutex
// MapProjectFieldNameToField caches project field metadata by project ID
MapProjectFieldNameToField = map[int]map[string]ProjectField{}
)
// generateProjectItemCacheKey creates a unique key for project item cache.
func generateProjectItemCacheKey(issueNumber, projectID int) string {
return fmt.Sprintf("%d:%d", issueNumber, projectID)
}
// Cache management functions
// ClearProjectNodeIDCache clears the project node ID cache.
func ClearProjectNodeIDCache() {
projectNodeIDMutex.Lock()
defer projectNodeIDMutex.Unlock()
projectNodeIDCache = make(map[int]string)
}
// ClearProjectItemIDCache clears the project item ID cache.
func ClearProjectItemIDCache() {
projectItemIDMutex.Lock()
defer projectItemIDMutex.Unlock()
projectItemIDCache = make(map[string]string)
}
// ClearProjectFieldsCache clears the project fields cache.
func ClearProjectFieldsCache() {
MapProjectFieldNameToField = make(map[int]map[string]ProjectField)
}
// ClearAllCaches clears all caches.
func ClearAllCaches() {
ClearProjectNodeIDCache()
ClearProjectItemIDCache()
ClearProjectFieldsCache()
}
// GetCacheStats returns statistics about cache usage.
func GetCacheStats() map[string]interface{} {
projectNodeIDMutex.RLock()
projectNodeIDCount := len(projectNodeIDCache)
projectNodeIDMutex.RUnlock()
projectItemIDMutex.RLock()
projectItemIDCount := len(projectItemIDCache)
projectItemIDMutex.RUnlock()
fieldCacheCount := len(MapProjectFieldNameToField)
return map[string]interface{}{
"project_node_ids": projectNodeIDCount,
"project_item_ids": projectItemIDCount,
"project_fields": fieldCacheCount,
}
}
// InvalidateProjectItemID removes a specific project item ID from cache.
// Useful when an item might have been moved/changed.
func InvalidateProjectItemID(issueNumber, projectID int) {
cacheKey := generateProjectItemCacheKey(issueNumber, projectID)
projectItemIDMutex.Lock()
defer projectItemIDMutex.Unlock()
delete(projectItemIDCache, cacheKey)
}