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

circuitBreaker.*SchemaReader.ReadRuleDefinition   A

Complexity

Conditions 3

Size

Total Lines 18
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 13
nop 4
dl 0
loc 18
rs 9.75
c 0
b 0
f 0
1
package circuitBreaker
2
3
import (
4
	"context"
5
6
	"github.com/sony/gobreaker"
7
8
	"github.com/Permify/permify/internal/storage"
9
	base "github.com/Permify/permify/pkg/pb/base/v1"
10
)
11
12
// SchemaReader - Add circuit breaker behaviour to schema reader
13
type SchemaReader struct {
14
	delegate storage.SchemaReader
15
	cb       *gobreaker.CircuitBreaker
16
}
17
18
// NewSchemaReader - Add circuit breaker behaviour to new schema reader
19
func NewSchemaReader(delegate storage.SchemaReader, cb *gobreaker.CircuitBreaker) *SchemaReader {
20
	return &SchemaReader{delegate: delegate, cb: cb}
21
}
22
23
// ReadSchema - Read schema from repository
24
func (r *SchemaReader) ReadSchema(ctx context.Context, tenantID, version string) (*base.SchemaDefinition, error) {
25
	response, err := r.cb.Execute(func() (interface{}, error) {
26
		return r.delegate.ReadSchema(ctx, tenantID, version)
27
	})
28
	if err != nil {
29
		return nil, err
30
	}
31
	return response.(*base.SchemaDefinition), nil
32
}
33
34
// ReadEntityDefinition - Read entity definition from repository
35
func (r *SchemaReader) ReadEntityDefinition(ctx context.Context, tenantID, entityName, version string) (*base.EntityDefinition, string, error) {
36
	type circuitBreakerResponse struct {
37
		Definition *base.EntityDefinition
38
		Version    string
39
	}
40
41
	response, err := r.cb.Execute(func() (interface{}, error) {
42
		var err error
43
		var resp circuitBreakerResponse
44
		resp.Definition, resp.Version, err = r.delegate.ReadEntityDefinition(ctx, tenantID, entityName, version)
45
		return resp, err
46
	})
47
	if err != nil {
48
		return nil, "", err
49
	}
50
51
	resp := response.(circuitBreakerResponse)
52
	return resp.Definition, resp.Version, nil
53
}
54
55
// ReadRuleDefinition - Read rule definition from repository
56
func (r *SchemaReader) ReadRuleDefinition(ctx context.Context, tenantID, ruleName, version string) (*base.RuleDefinition, string, error) {
57
	type circuitBreakerResponse struct {
58
		Definition *base.RuleDefinition
59
		Version    string
60
	}
61
62
	response, err := r.cb.Execute(func() (interface{}, error) {
63
		var err error
64
		var resp circuitBreakerResponse
65
		resp.Definition, resp.Version, err = r.delegate.ReadRuleDefinition(ctx, tenantID, ruleName, version)
66
		return resp, err
67
	})
68
	if err != nil {
69
		return nil, "", err
70
	}
71
72
	resp := response.(circuitBreakerResponse)
73
	return resp.Definition, resp.Version, nil
74
}
75
76
// HeadVersion - Finds the latest version of the schema.
77
func (r *SchemaReader) HeadVersion(ctx context.Context, tenantID string) (version string, err error) {
78
	response, err := r.cb.Execute(func() (interface{}, error) {
79
		return r.delegate.HeadVersion(ctx, tenantID)
80
	})
81
	if err != nil {
82
		return "", err
83
	}
84
	return response.(string), nil
85
}
86