Passed
Pull Request — master (#2583)
by Tolga
03:10
created

circuitbreaker.*TenantReader.ListTenants   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 2
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
	"github.com/Permify/permify/pkg/database"
10
	base "github.com/Permify/permify/pkg/pb/base/v1"
11
)
12
13
// TenantReader - Add circuit breaker behaviour to tenant reader
14
type TenantReader struct {
15
	delegate storage.TenantReader
16
	cb       *gobreaker.CircuitBreaker
17
}
18
19
// NewTenantReader - Add circuit breaker behaviour to new tenant reader
20
func NewTenantReader(delegate storage.TenantReader, cb *gobreaker.CircuitBreaker) *TenantReader {
21
	return &TenantReader{delegate: delegate, cb: cb}
22
}
23
24
// ListTenants - List tenants from the repository
25
func (r *TenantReader) ListTenants(ctx context.Context, pagination database.Pagination) (tenants []*base.Tenant, ct database.EncodedContinuousToken, err error) {
26
	type circuitBreakerResponse struct {
27
		Tenants []*base.Tenant
28
		Ct      database.EncodedContinuousToken
29
	}
30
31
	response, err := r.cb.Execute(func() (interface{}, error) {
32
		var err error
33
		var resp circuitBreakerResponse
34
		resp.Tenants, resp.Ct, err = r.delegate.ListTenants(ctx, pagination)
35
		return resp, err
36
	})
37
	if err != nil {
38
		return nil, nil, err
39
	}
40
41
	resp := response.(circuitBreakerResponse)
42
	return resp.Tenants, resp.Ct, nil
43
}
44