Passed
Pull Request — master (#1004)
by Tolga
02:52
created

cache.*SchemaReader.ReadRuleDefinition   A

Complexity

Conditions 5

Size

Total Lines 20
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 16
nop 4
dl 0
loc 20
rs 9.1333
c 0
b 0
f 0
1
package cache
2
3
import (
4
	"context"
5
	"errors"
6
	"fmt"
7
	"reflect"
8
9
	"github.com/Permify/permify/internal/storage"
10
	"github.com/Permify/permify/pkg/cache"
11
	base "github.com/Permify/permify/pkg/pb/base/v1"
12
)
13
14
// SchemaReader - Add cache behaviour to schema reader
15
type SchemaReader struct {
16
	delegate storage.SchemaReader
17
	cache    cache.Cache
18
}
19
20
// NewSchemaReader new instance of SchemaReader
21
func NewSchemaReader(delegate storage.SchemaReader, cache cache.Cache) *SchemaReader {
22
	return &SchemaReader{
23
		delegate: delegate,
24
		cache:    cache,
25
	}
26
}
27
28
// ReadSchema  - Read schema from the repository
29
func (r *SchemaReader) ReadSchema(ctx context.Context, tenantID, version string) (schema *base.SchemaDefinition, err error) {
30
	return r.delegate.ReadSchema(ctx, tenantID, version)
31
}
32
33
// ReadEntityDefinition - Read entity definition from the repository
34
func (r *SchemaReader) ReadEntityDefinition(ctx context.Context, tenantID, entityName, version string) (definition *base.EntityDefinition, v string, err error) {
35
	var s interface{}
36
	found := false
37
	if version != "" {
38
		s, found = r.cache.Get(fmt.Sprintf("%s|%s|%s", tenantID, entityName, version))
39
	}
40
	if !found {
41
		definition, version, err = r.delegate.ReadEntityDefinition(ctx, tenantID, entityName, version)
42
		if err != nil {
43
			return nil, "", err
44
		}
45
		size := reflect.TypeOf(definition).Size()
46
		r.cache.Set(fmt.Sprintf("%s|%s|%s", tenantID, entityName, version), definition, int64(size))
47
		return definition, version, nil
48
	}
49
	def, ok := s.(*base.EntityDefinition)
50
	if !ok {
51
		return nil, "", errors.New(base.ErrorCode_ERROR_CODE_SCAN.String())
52
	}
53
	return def, "", err
54
}
55
56
// ReadRuleDefinition - Read rule definition from the repository
57
func (r *SchemaReader) ReadRuleDefinition(ctx context.Context, tenantID, ruleName, version string) (definition *base.RuleDefinition, v string, err error) {
58
	var s interface{}
59
	found := false
60
	if version != "" {
61
		s, found = r.cache.Get(fmt.Sprintf("%s|%s|%s", tenantID, ruleName, version))
62
	}
63
	if !found {
64
		definition, version, err = r.delegate.ReadRuleDefinition(ctx, tenantID, ruleName, version)
65
		if err != nil {
66
			return nil, "", err
67
		}
68
		size := reflect.TypeOf(definition).Size()
69
		r.cache.Set(fmt.Sprintf("%s|%s|%s", tenantID, ruleName, version), definition, int64(size))
70
		return definition, version, nil
71
	}
72
	def, ok := s.(*base.RuleDefinition)
73
	if !ok {
74
		return nil, "", errors.New(base.ErrorCode_ERROR_CODE_SCAN.String())
75
	}
76
	return def, "", err
77
}
78
79
// HeadVersion - Finds the latest version of the schema.
80
func (r *SchemaReader) HeadVersion(ctx context.Context, tenantID string) (version string, err error) {
81
	return r.delegate.HeadVersion(ctx, tenantID)
82
}
83