package cache import ( "jannex/admin-dashboard-backend/modules/structs" "jannex/admin-dashboard-backend/modules/utils" "sort" "sync" "time" ) var pipelineProductsCache *structs.PipelineProductsCache var pp sync.RWMutex var pipelineProductsLastUpdated time.Time // last fetch from google sheets var ppLU sync.RWMutex var productsStatesCache []structs.ProductState var ps sync.RWMutex func SetPipelineProductsCache(newPipelineProducts structs.PipelineProductsCache) { pp.Lock() pipelineProductsCache = &newPipelineProducts pp.Unlock() } /* func isPipelineProductCached(name string) bool { pp.RLock() defer pp.RUnlock() for _, newProduct := range pipelineProductsCache.NewProducts { if newProduct.Name == name { return true } } for _, futureProduct := range pipelineProductsCache.FutureProducts { if futureProduct.Name == name { return true } } for _, inWorkProduct := range pipelineProductsCache.InWorkProducts { if inWorkProduct == name { return true } } return false } */ func IsPipelineProductsCacheTimeExpired() bool { ppLU.RLock() defer ppLU.RUnlock() return time.Since(pipelineProductsLastUpdated) > utils.ProductPipelineCacheTime } func UpdateProductsPipelineLastCacheUpdate() { ppLU.Lock() pipelineProductsLastUpdated = time.Now() ppLU.Unlock() } func GetPipelineProducts() *structs.PipelineProductsCache { pp.RLock() defer pp.RUnlock() return pipelineProductsCache } func GetProductsStates() []structs.ProductState { ps.RLock() defer ps.RUnlock() return productsStatesCache } func SetProductStates(productStates []structs.ProductState) { ps.Lock() productsStatesCache = productStates ps.Unlock() } func IsIdInFutureProducts(id string) bool { pipelineProducts := GetPipelineProducts() for _, pipelineProduct := range pipelineProducts.FutureProducts { if pipelineProduct.Id == id { return true } } return false } func VoteFutureProduct(id string, up bool) { pipelineProducts := GetPipelineProducts() for index, futureProduct := range pipelineProducts.FutureProducts { if futureProduct.Id == id { pp.Lock() if up { pipelineProductsCache.FutureProducts[index].Votes++ } else { pipelineProductsCache.FutureProducts[index].Votes-- } pp.Unlock() break } } } func SortFutureProducts() { pipelineProducts := GetPipelineProducts() pp.Lock() defer pp.Unlock() sort.SliceStable(pipelineProducts.FutureProducts, func(i, j int) bool { return pipelineProducts.FutureProducts[i].Votes > pipelineProducts.FutureProducts[j].Votes }) }