Passed
Pull Request — master (#1681)
by
unknown
03:28
created

servers.*PermissionServer.BulkCheck   A

Complexity

Conditions 4

Size

Total Lines 53
Code Lines 34

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 34
nop 2
dl 0
loc 53
rs 9.064
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
package servers
2
3
import (
4
	"log/slog"
5
6
	otelCodes "go.opentelemetry.io/otel/codes"
7
	"golang.org/x/net/context"
8
	"google.golang.org/grpc/status"
9
10
	"github.com/Permify/permify/internal/invoke"
11
	v1 "github.com/Permify/permify/pkg/pb/base/v1"
12
)
13
14
// PermissionServer - Structure for Permission Server
15
type PermissionServer struct {
16
	v1.UnimplementedPermissionServer
17
18
	invoker invoke.Invoker
19
}
20
21
// NewPermissionServer - Creates new Permission Server
22
func NewPermissionServer(i invoke.Invoker) *PermissionServer {
23
	return &PermissionServer{
24
		invoker: i,
25
	}
26
}
27
28
// Check - Performs Authorization Check
29
func (r *PermissionServer) Check(ctx context.Context, request *v1.PermissionCheckRequest) (*v1.PermissionCheckResponse, error) {
30
	ctx, span := tracer.Start(ctx, "permissions.check")
31
	defer span.End()
32
33
	v := request.Validate()
34
	if v != nil {
35
		return nil, status.Error(GetStatus(v), v.Error())
36
	}
37
38
	response, err := r.invoker.Check(ctx, request)
39
	if err != nil {
40
		span.RecordError(err)
41
		span.SetStatus(otelCodes.Error, err.Error())
42
		slog.ErrorContext(ctx, err.Error())
43
		return nil, status.Error(GetStatus(err), err.Error())
44
	}
45
46
	return response, nil
47
}
48
49
// Bulk Check - Performs Bulk Authorization Checks
50
func (r *PermissionServer) BulkCheck(ctx context.Context, request *v1.BulkPermissionCheckRequest) (*v1.BulkPermissionCheckResponse, error) {
51
	ctx, span := tracer.Start(ctx, "permissions.bulk-check")
52
	defer span.End()
53
54
	// Validate the incoming request
55
	v := request.Validate()
56
	if v != nil {
57
		return nil, status.Error(GetStatus(v), v.Error())
58
	}
59
60
	checks := request.Checks
61
	results := make([]*v1.SinglePermissionCheckResponse, len(checks))
62
63
	for i, check := range checks {
64
		// Create individual PermissionCheckRequest for each item
65
		singleRequest := &v1.PermissionCheckRequest{
66
			TenantId:   request.TenantId,
67
			Metadata:   check.Metadata,
68
			Entity:     check.Entity,
69
			Permission: check.Permission,
70
			Subject:    check.Subject,
71
			Context:    check.Context,
72
			Arguments:  check.Arguments,
73
		}
74
75
		// Perform the permission check
76
		response, err := r.invoker.Check(ctx, singleRequest)
77
		if err != nil {
78
			// Log and record the error for each failed check
79
			span.RecordError(err)
80
			span.SetStatus(otelCodes.Error, err.Error())
81
			slog.ErrorContext(ctx, err.Error())
82
83
			// Add the failure response with index
84
			results[i] = &v1.SinglePermissionCheckResponse{
85
				Can:      v1.CheckResult_CHECK_RESULT_DENIED,
86
				Metadata: &v1.PermissionCheckResponseMetadata{},
87
				Index:    int32(i),
88
			}
89
		} else {
90
			// Successful check response, attach the index
91
			results[i] = &v1.SinglePermissionCheckResponse{
92
				Can:      response.Can,
93
				Metadata: response.Metadata,
94
				Index:    int32(i),
95
			}
96
		}
97
	}
98
99
	// Return the bulk response
100
	return &v1.BulkPermissionCheckResponse{
101
		Results: results,
102
	}, nil
103
}
104
105
// Expand - Get schema actions in a tree structure
106
func (r *PermissionServer) Expand(ctx context.Context, request *v1.PermissionExpandRequest) (*v1.PermissionExpandResponse, error) {
107
	ctx, span := tracer.Start(ctx, "permissions.expand")
108
	defer span.End()
109
110
	v := request.Validate()
111
	if v != nil {
112
		return nil, status.Error(GetStatus(v), v.Error())
113
	}
114
115
	response, err := r.invoker.Expand(ctx, request)
116
	if err != nil {
117
		span.RecordError(err)
118
		span.SetStatus(otelCodes.Error, err.Error())
119
		slog.ErrorContext(ctx, err.Error())
120
		return nil, status.Error(GetStatus(err), err.Error())
121
	}
122
123
	return response, nil
124
}
125
126
// LookupEntity -
127
func (r *PermissionServer) LookupEntity(ctx context.Context, request *v1.PermissionLookupEntityRequest) (*v1.PermissionLookupEntityResponse, error) {
128
	ctx, span := tracer.Start(ctx, "permissions.lookup-entity")
129
	defer span.End()
130
131
	v := request.Validate()
132
	if v != nil {
133
		return nil, status.Error(GetStatus(v), v.Error())
134
	}
135
136
	response, err := r.invoker.LookupEntity(ctx, request)
137
	if err != nil {
138
		span.RecordError(err)
139
		span.SetStatus(otelCodes.Error, err.Error())
140
		slog.ErrorContext(ctx, err.Error())
141
		return nil, status.Error(GetStatus(err), err.Error())
142
	}
143
144
	return response, nil
145
}
146
147
// LookupEntityStream -
148
func (r *PermissionServer) LookupEntityStream(request *v1.PermissionLookupEntityRequest, server v1.Permission_LookupEntityStreamServer) error {
149
	ctx, span := tracer.Start(server.Context(), "permissions.lookup-entity-stream")
150
	defer span.End()
151
152
	v := request.Validate()
153
	if v != nil {
154
		return v
155
	}
156
157
	err := r.invoker.LookupEntityStream(ctx, request, server)
158
	if err != nil {
159
		span.RecordError(err)
160
		span.SetStatus(otelCodes.Error, err.Error())
161
		slog.ErrorContext(ctx, err.Error())
162
		return status.Error(GetStatus(err), err.Error())
163
	}
164
165
	return nil
166
}
167
168
// LookupSubject -
169
func (r *PermissionServer) LookupSubject(ctx context.Context, request *v1.PermissionLookupSubjectRequest) (*v1.PermissionLookupSubjectResponse, error) {
170
	ctx, span := tracer.Start(ctx, "permissions.lookup-subject")
171
	defer span.End()
172
173
	v := request.Validate()
174
	if v != nil {
175
		return nil, status.Error(GetStatus(v), v.Error())
176
	}
177
178
	response, err := r.invoker.LookupSubject(ctx, request)
179
	if err != nil {
180
		span.RecordError(err)
181
		span.SetStatus(otelCodes.Error, err.Error())
182
		slog.ErrorContext(ctx, err.Error())
183
		return nil, status.Error(GetStatus(err), err.Error())
184
	}
185
186
	return response, nil
187
}
188
189
// SubjectPermission -
190
func (r *PermissionServer) SubjectPermission(ctx context.Context, request *v1.PermissionSubjectPermissionRequest) (*v1.PermissionSubjectPermissionResponse, error) {
191
	ctx, span := tracer.Start(ctx, "permissions.subject-permission")
192
	defer span.End()
193
194
	v := request.Validate()
195
	if v != nil {
196
		return nil, status.Error(GetStatus(v), v.Error())
197
	}
198
199
	response, err := r.invoker.SubjectPermission(ctx, request)
200
	if err != nil {
201
		span.RecordError(err)
202
		span.SetStatus(otelCodes.Error, err.Error())
203
		slog.ErrorContext(ctx, err.Error())
204
		return nil, status.Error(GetStatus(err), err.Error())
205
	}
206
207
	return response, nil
208
}
209