github.com/openfga/openfga@v1.5.4-rc1/pkg/server/commands/listusers/validate.go (about) 1 package listusers 2 3 import ( 4 "context" 5 "errors" 6 7 openfgav1 "github.com/openfga/api/proto/openfga/v1" 8 9 serverErrors "github.com/openfga/openfga/pkg/server/errors" 10 11 "github.com/openfga/openfga/internal/validation" 12 "github.com/openfga/openfga/pkg/typesystem" 13 ) 14 15 func ValidateListUsersRequest(ctx context.Context, req *openfgav1.ListUsersRequest, typesys *typesystem.TypeSystem) error { 16 _, span := tracer.Start(ctx, "validateListUsersRequest") 17 defer span.End() 18 if err := validateContextualTuples(req, typesys); err != nil { 19 return err 20 } 21 22 if err := validateUsersFilters(req, typesys); err != nil { 23 return err 24 } 25 26 return validateTargetRelation(req, typesys) 27 } 28 29 func validateContextualTuples(request *openfgav1.ListUsersRequest, typeSystem *typesystem.TypeSystem) error { 30 for _, contextualTuple := range request.GetContextualTuples() { 31 if err := validation.ValidateTuple(typeSystem, contextualTuple); err != nil { 32 return serverErrors.HandleTupleValidateError(err) 33 } 34 } 35 36 return nil 37 } 38 39 func validateUsersFilters(request *openfgav1.ListUsersRequest, typeSystem *typesystem.TypeSystem) error { 40 for _, userFilter := range request.GetUserFilters() { 41 if err := validateUserFilter(typeSystem, userFilter); err != nil { 42 return err 43 } 44 } 45 46 return nil 47 } 48 49 func validateUserFilter(typeSystem *typesystem.TypeSystem, usersFilter *openfgav1.UserTypeFilter) error { 50 filterObjectType := usersFilter.GetType() 51 52 if _, typeExists := typeSystem.GetTypeDefinition(filterObjectType); !typeExists { 53 return serverErrors.TypeNotFound(filterObjectType) 54 } 55 56 return validateUserFilterRelation(typeSystem, usersFilter, filterObjectType) 57 } 58 59 func validateUserFilterRelation(typeSystem *typesystem.TypeSystem, usersFilter *openfgav1.UserTypeFilter, filterObjectType string) error { 60 filterObjectRelation := usersFilter.GetRelation() 61 if filterObjectRelation == "" { 62 return nil 63 } 64 65 _, err := typeSystem.GetRelation(filterObjectType, filterObjectRelation) 66 if err == nil { 67 return nil 68 } 69 70 if errors.Is(err, typesystem.ErrRelationUndefined) { 71 return serverErrors.RelationNotFound(filterObjectRelation, filterObjectType, nil) 72 } 73 74 return serverErrors.HandleError("", err) 75 } 76 77 func validateTargetRelation(request *openfgav1.ListUsersRequest, typeSystem *typesystem.TypeSystem) error { 78 objectType := request.GetObject().GetType() 79 targetRelation := request.GetRelation() 80 81 _, err := typeSystem.GetRelation(objectType, targetRelation) 82 if err == nil { 83 return nil 84 } 85 86 if errors.Is(err, typesystem.ErrObjectTypeUndefined) { 87 return serverErrors.TypeNotFound(objectType) 88 } 89 90 if errors.Is(err, typesystem.ErrRelationUndefined) { 91 return serverErrors.RelationNotFound(targetRelation, objectType, nil) 92 } 93 94 return serverErrors.HandleError("", err) 95 }