package policy import ( "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/cache" "git.frostfs.info/TrueCloudLab/frostfs-s3-gw/internal/logs" "git.frostfs.info/TrueCloudLab/policy-engine/pkg/chain" "git.frostfs.info/TrueCloudLab/policy-engine/pkg/engine" "github.com/nspcc-dev/neo-go/pkg/util" "go.uber.org/zap" ) type CachedMorph struct { morph engine.MorphRuleChainStorage cache *cache.MorphPolicyCache log *zap.Logger } type CachedMorphConfig struct { Morph engine.MorphRuleChainStorage Cache *cache.MorphPolicyCache Log *zap.Logger } var _ engine.MorphRuleChainStorage = (*CachedMorph)(nil) func NewCachedMorph(config CachedMorphConfig) *CachedMorph { return &CachedMorph{ morph: config.Morph, cache: config.Cache, log: config.Log, } } func (c *CachedMorph) AddMorphRuleChain(name chain.Name, target engine.Target, policyChain *chain.Chain) (util.Uint256, uint32, error) { c.cache.Delete(cache.MorphPolicyCacheKey{Target: target, Name: name}) return c.morph.AddMorphRuleChain(name, target, policyChain) } func (c *CachedMorph) RemoveMorphRuleChain(name chain.Name, target engine.Target, chainID chain.ID) (util.Uint256, uint32, error) { c.cache.Delete(cache.MorphPolicyCacheKey{Target: target, Name: name}) return c.morph.RemoveMorphRuleChain(name, target, chainID) } func (c *CachedMorph) ListMorphRuleChains(name chain.Name, target engine.Target) ([]*chain.Chain, error) { key := cache.MorphPolicyCacheKey{Target: target, Name: name} list := c.cache.Get(key) if list != nil { return list, nil } list, err := c.morph.ListMorphRuleChains(name, target) if err != nil { return nil, err } if err = c.cache.Put(key, list); err != nil { c.log.Warn(logs.CouldntCacheListPolicyChains) } return list, nil }