| Conditions | 7 |
| Total Lines | 73 |
| Code Lines | 47 |
| Lines | 0 |
| Ratio | 0 % |
| Changes | 0 | ||
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:
If many parameters/temporary variables are present:
| 1 | package servers |
||
| 51 | func (r *PermissionServer) BulkCheck(ctx context.Context, request *v1.PermissionBulkCheckRequest) (*v1.PermissionBulkCheckResponse, error) { |
||
| 52 | ctx, span := internal.Tracer.Start(ctx, "permissions.bulk-check") |
||
| 53 | defer span.End() |
||
| 54 | |||
| 55 | // Validate tenant_id |
||
| 56 | if request.GetTenantId() == "" { |
||
| 57 | err := status.Error(GetStatus(nil), "tenant_id is required") |
||
| 58 | span.RecordError(err) |
||
| 59 | span.SetStatus(otelCodes.Error, err.Error()) |
||
| 60 | return nil, err |
||
| 61 | } |
||
| 62 | |||
| 63 | // Validate number of requests |
||
| 64 | if len(request.GetItems()) == 0 { |
||
| 65 | err := status.Error(GetStatus(nil), "at least one item is required") |
||
| 66 | span.RecordError(err) |
||
| 67 | span.SetStatus(otelCodes.Error, err.Error()) |
||
| 68 | return nil, err |
||
| 69 | } |
||
| 70 | |||
| 71 | if len(request.GetItems()) > 100 { |
||
| 72 | err := status.Error(GetStatus(nil), "maximum 100 items allowed") |
||
| 73 | span.RecordError(err) |
||
| 74 | span.SetStatus(otelCodes.Error, err.Error()) |
||
| 75 | return nil, err |
||
| 76 | } |
||
| 77 | |||
| 78 | // Process each check request |
||
| 79 | results := make([]*v1.PermissionCheckResponse, len(request.GetItems())) |
||
| 80 | for i, checkRequestItem := range request.GetItems() { |
||
| 81 | |||
| 82 | // Validate individual request |
||
| 83 | v := checkRequestItem.Validate() |
||
| 84 | if v != nil { |
||
| 85 | // Return error response for this check |
||
| 86 | results[i] = &v1.PermissionCheckResponse{ |
||
| 87 | Can: v1.CheckResult_CHECK_RESULT_DENIED, |
||
| 88 | Metadata: &v1.PermissionCheckResponseMetadata{ |
||
| 89 | CheckCount: 0, |
||
| 90 | }, |
||
| 91 | } |
||
| 92 | continue |
||
| 93 | } |
||
| 94 | |||
| 95 | // Perform the check using existing Check function |
||
| 96 | checkRequest := &v1.PermissionCheckRequest{ |
||
| 97 | TenantId: request.GetTenantId(), |
||
| 98 | Subject: checkRequestItem.GetSubject(), |
||
| 99 | Entity: checkRequestItem.GetEntity(), |
||
| 100 | Permission: checkRequestItem.GetPermission(), |
||
| 101 | Metadata: request.GetMetadata(), |
||
| 102 | Context: request.GetContext(), |
||
| 103 | Arguments: request.GetArguments(), |
||
| 104 | } |
||
| 105 | response, err := r.invoker.Check(ctx, checkRequest) |
||
| 106 | if err != nil { |
||
| 107 | // Log error but don't fail the entire bulk operation |
||
| 108 | slog.ErrorContext(ctx, "check failed in bulk operation", "error", err.Error(), "index", i) |
||
| 109 | results[i] = &v1.PermissionCheckResponse{ |
||
| 110 | Can: v1.CheckResult_CHECK_RESULT_DENIED, |
||
| 111 | Metadata: &v1.PermissionCheckResponseMetadata{ |
||
| 112 | CheckCount: 0, |
||
| 113 | }, |
||
| 114 | } |
||
| 115 | continue |
||
| 116 | } |
||
| 117 | |||
| 118 | results[i] = response |
||
| 119 | } |
||
| 120 | |||
| 121 | return &v1.PermissionBulkCheckResponse{ |
||
| 122 | Results: results, |
||
| 123 | }, nil |
||
| 124 | } |
||
| 230 |