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  }