subjectFilter is a method for the SubjectFilterEngine struct. It determines the type of relational reference for the permission field in the request, prepares and returns a SubjectFilterFunction accordingly.
( ctx context.Context, request *base.PermissionLookupSubjectRequest, en *base.EntityDefinition, )
| 86 | // It determines the type of relational reference for the permission field in the request, |
| 87 | // prepares and returns a SubjectFilterFunction accordingly. |
| 88 | func (engine *SubjectFilter) subjectFilter( |
| 89 | ctx context.Context, |
| 90 | request *base.PermissionLookupSubjectRequest, |
| 91 | en *base.EntityDefinition, |
| 92 | ) SubjectFilterFunction { |
| 93 | // The GetTypeOfRelationalReferenceByNameInEntityDefinition method retrieves the type of relational reference for the permission field. |
| 94 | tor, _ := schema.GetTypeOfReferenceByNameInEntityDefinition(en, request.GetPermission()) |
| 95 | |
| 96 | var fn SubjectFilterFunction |
| 97 | |
| 98 | switch tor { |
| 99 | case base.EntityDefinition_REFERENCE_PERMISSION: |
| 100 | // Get the permission by its name in the entity definition. |
| 101 | permission, err := schema.GetPermissionByNameInEntityDefinition(en, request.GetPermission()) |
| 102 | if err != nil { |
| 103 | // If an error is encountered while getting the permission, a SubjectFilterFunction is returned that always fails with this error. |
| 104 | return subjectFilterFail(err) |
| 105 | } |
| 106 | child := permission.GetChild() |
| 107 | |
| 108 | // Depending on whether the child permission has a rewrite rule, |
| 109 | // we prepare a SubjectFilterFunction to handle it accordingly. |
| 110 | if child.GetRewrite() != nil { |
| 111 | fn = engine.subjectFilterRewrite(ctx, request, child.GetRewrite()) |
| 112 | } else { |
| 113 | fn = engine.subjectFilterLeaf(request, child.GetLeaf()) |
| 114 | } |
| 115 | case base.EntityDefinition_REFERENCE_ATTRIBUTE: |
| 116 | fn = engine.subjectFilterDirectAttribute(request) |
| 117 | case base.EntityDefinition_REFERENCE_RELATION: |
| 118 | fn = engine.subjectFilterDirectRelation(request) |
| 119 | default: |
| 120 | fn = engine.subjectFilterDirectCall(request) |
| 121 | } |
| 122 | |
| 123 | // If we could not prepare a SubjectFilterFunction, we return a function that always fails with an error indicating undefined child kind. |
| 124 | if fn == nil { |
| 125 | return subjectFilterFail(errors.New(base.ErrorCode_ERROR_CODE_UNDEFINED_CHILD_KIND.String())) |
| 126 | } |
| 127 | |
| 128 | // Finally, we return a function that combines results from the prepared function. |
| 129 | return func(ctx context.Context) ([]string, error) { |
| 130 | return subjectFilterUnion(ctx, []SubjectFilterFunction{fn}, engine.concurrencyLimit) |
| 131 | } |
| 132 | } |
| 133 | |
| 134 | // subjectFilterRewrite is a method for the SubjectFilterEngine struct. |
| 135 | // It generates a SubjectFilterFunction based on the rewrite operation type present in the provided request. |
no test coverage detected