MCPcopy Create free account
hub / github.com/Permify/permify / subjectFilter

Method subjectFilter

internal/engines/subject_filter.go:88–132  ·  view source on GitHub ↗

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,
)

Source from the content-addressed store, hash-verified

86// It determines the type of relational reference for the permission field in the request,
87// prepares and returns a SubjectFilterFunction accordingly.
88func (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.

Callers 1

SubjectFilterMethod · 0.95

Calls 14

subjectFilterRewriteMethod · 0.95
subjectFilterLeafMethod · 0.95
subjectFilterFailFunction · 0.85
subjectFilterUnionFunction · 0.85
GetChildMethod · 0.80
GetRewriteMethod · 0.80
StringMethod · 0.65

Tested by

no test coverage detected