Passed
Pull Request — master (#1517)
by
unknown
02:40
created

memory.*TenantWriter.DeleteTenant   C

Complexity

Conditions 11

Size

Total Lines 46
Code Lines 31

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 11
eloc 31
nop 2
dl 0
loc 46
rs 5.4
c 0
b 0
f 0

How to fix   Complexity   

Complexity

Complex classes like memory.*TenantWriter.DeleteTenant often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
package memory
2
3
import (
4
	"context"
5
	"errors"
6
	"time"
7
8
	"github.com/Permify/permify/internal/storage"
9
	"github.com/Permify/permify/internal/storage/memory/constants"
10
	db "github.com/Permify/permify/pkg/database/memory"
11
	base "github.com/Permify/permify/pkg/pb/base/v1"
12
)
13
14
// TenantWriter - Structure for Tenant Writer
15
type TenantWriter struct {
16
	database *db.Memory
17
}
18
19
// NewTenantWriter creates a new TenantWriter
20
func NewTenantWriter(database *db.Memory) *TenantWriter {
21
	return &TenantWriter{
22
		database: database,
23
	}
24
}
25
26
// CreateTenant -
27
func (w *TenantWriter) CreateTenant(_ context.Context, id, name string) (result *base.Tenant, err error) {
28
	tenant := storage.Tenant{
29
		ID:        id,
30
		Name:      name,
31
		CreatedAt: time.Now(),
32
	}
33
	txn := w.database.DB.Txn(true)
34
	defer txn.Abort()
35
	if err = txn.Insert(constants.TenantsTable, tenant); err != nil {
36
		return nil, errors.New(base.ErrorCode_ERROR_CODE_EXECUTION.String())
37
	}
38
	txn.Commit()
39
	return tenant.ToTenant(), nil
40
}
41
42
// DeleteTenant -
43
func (w *TenantWriter) DeleteTenant(_ context.Context, tenantID string) (result *base.Tenant, err error) {
44
	txn := w.database.DB.Txn(true)
45
	defer txn.Abort()
46
	var raw interface{}
47
	raw, err = txn.First(constants.TenantsTable, "id", tenantID)
48
	if err != nil {
49
		return nil, errors.New(base.ErrorCode_ERROR_CODE_EXECUTION.String())
50
	}
51
52
	_, err = txn.First(constants.AttributesTable, "tenant_id", tenantID)
53
	if err != nil {
54
		if _, deleteErr := txn.DeleteAll(constants.AttributesTable, "tenant_id", tenantID); deleteErr != nil {
55
			return nil, errors.New(base.ErrorCode_ERROR_CODE_EXECUTION.String())
56
		}
57
		return nil, errors.New(base.ErrorCode_ERROR_CODE_EXECUTION.String())
58
	}
59
60
	_, err = txn.First(constants.BundlesTable, "tenant_id", tenantID)
61
	if err != nil {
62
		if _, deleteErr := txn.DeleteAll(constants.BundlesTable, "tenant_id", tenantID); deleteErr != nil {
63
			return nil, errors.New(base.ErrorCode_ERROR_CODE_EXECUTION.String())
64
		}
65
		return nil, errors.New(base.ErrorCode_ERROR_CODE_EXECUTION.String())
66
	}
67
68
	_, err = txn.First(constants.RelationTuplesTable, "tenant_id", tenantID)
69
	if err != nil {
70
		if _, deleteErr := txn.DeleteAll(constants.RelationTuplesTable, "tenant_id", tenantID); deleteErr != nil {
71
			return nil, errors.New(base.ErrorCode_ERROR_CODE_EXECUTION.String())
72
		}
73
		return nil, errors.New(base.ErrorCode_ERROR_CODE_EXECUTION.String())
74
	}
75
76
	_, err = txn.First(constants.SchemaDefinitionsTable, "tenant_id", tenantID)
77
	if err != nil {
78
		if _, deleteErr := txn.DeleteAll(constants.SchemaDefinitionsTable, "tenant_id", tenantID); deleteErr != nil {
79
			return nil, errors.New(base.ErrorCode_ERROR_CODE_EXECUTION.String())
80
		}
81
		return nil, errors.New(base.ErrorCode_ERROR_CODE_EXECUTION.String())
82
	}
83
84
	if _, err = txn.DeleteAll(constants.TenantsTable, "id", tenantID); err != nil {
85
		return nil, errors.New(base.ErrorCode_ERROR_CODE_EXECUTION.String())
86
	}
87
	txn.Commit()
88
	return raw.(storage.Tenant).ToTenant(), nil
89
}
90