github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/domain/bundlereferences/converter.go (about)

     1  package bundlereferences
     2  
     3  import (
     4  	"database/sql"
     5  	"fmt"
     6  
     7  	"github.com/kyma-incubator/compass/components/director/internal/model"
     8  	"github.com/kyma-incubator/compass/components/director/internal/repo"
     9  	"github.com/pkg/errors"
    10  )
    11  
    12  type converter struct{}
    13  
    14  // NewConverter returns a new Converter that can later be used to make the conversions between the GraphQL, service, and repository layer representations of a Compass BundleReference
    15  func NewConverter() *converter {
    16  	return &converter{}
    17  }
    18  
    19  // ToEntity converts the provided service-layer representation of a BundleReference to the repository-layer one.
    20  func (c *converter) ToEntity(in model.BundleReference) Entity {
    21  	var apiDefID sql.NullString
    22  	var eventDefID sql.NullString
    23  	var apiDefaultTargetURL sql.NullString
    24  
    25  	switch in.ObjectType {
    26  	case model.BundleAPIReference:
    27  		apiDefID = repo.NewNullableString(in.ObjectID)
    28  		apiDefaultTargetURL = repo.NewNullableString(in.APIDefaultTargetURL)
    29  	case model.BundleEventReference:
    30  		eventDefID = repo.NewNullableString(in.ObjectID)
    31  	}
    32  
    33  	return Entity{
    34  		ID:                  in.ID,
    35  		BundleID:            repo.NewNullableString(in.BundleID),
    36  		APIDefID:            apiDefID,
    37  		EventDefID:          eventDefID,
    38  		APIDefaultTargetURL: apiDefaultTargetURL,
    39  		IsDefaultBundle:     repo.NewNullableBool(in.IsDefaultBundle),
    40  	}
    41  }
    42  
    43  // FromEntity converts the provided Entity repo-layer representation of a BundleReference to the service-layer representation model.BundleReference.
    44  func (c *converter) FromEntity(in Entity) (model.BundleReference, error) {
    45  	objectID, objectType, err := c.objectReferenceFromEntity(in)
    46  	if err != nil {
    47  		return model.BundleReference{}, errors.Wrap(err, "while determining object reference")
    48  	}
    49  
    50  	return model.BundleReference{
    51  		ID:                  in.ID,
    52  		BundleID:            repo.StringPtrFromNullableString(in.BundleID),
    53  		ObjectType:          objectType,
    54  		ObjectID:            repo.StringPtrFromNullableString(objectID),
    55  		APIDefaultTargetURL: repo.StringPtrFromNullableString(in.APIDefaultTargetURL),
    56  		IsDefaultBundle:     repo.BoolPtrFromNullableBool(in.IsDefaultBundle),
    57  	}, nil
    58  }
    59  
    60  func (c *converter) objectReferenceFromEntity(in Entity) (sql.NullString, model.BundleReferenceObjectType, error) {
    61  	if in.APIDefID.Valid {
    62  		return in.APIDefID, model.BundleAPIReference, nil
    63  	}
    64  
    65  	if in.EventDefID.Valid {
    66  		return in.EventDefID, model.BundleEventReference, nil
    67  	}
    68  
    69  	return sql.NullString{}, "", fmt.Errorf("incorrect Object Reference ID and its type for Reference Entity with bundle ID %q", *repo.StringPtrFromNullableString(in.BundleID))
    70  }