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

     1  package formationconstraint
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/kyma-incubator/compass/components/director/internal/model"
     7  	"github.com/kyma-incubator/compass/components/director/pkg/apperrors"
     8  	"github.com/kyma-incubator/compass/components/director/pkg/graphql"
     9  	"github.com/kyma-incubator/compass/components/director/pkg/log"
    10  	"github.com/kyma-incubator/compass/components/director/pkg/persistence"
    11  )
    12  
    13  //go:generate mockery --exported --name=formationConstraintConverter --output=automock --outpkg=automock --case=underscore --disable-version-string
    14  type formationConstraintConverter interface {
    15  	FromInputGraphQL(in *graphql.FormationConstraintInput) *model.FormationConstraintInput
    16  	ToGraphQL(in *model.FormationConstraint) *graphql.FormationConstraint
    17  	MultipleToGraphQL(in []*model.FormationConstraint) []*graphql.FormationConstraint
    18  	FromModelInputToModel(in *model.FormationConstraintInput, id string) *model.FormationConstraint
    19  }
    20  
    21  //go:generate mockery --exported --name=formationConstraintService --output=automock --outpkg=automock --case=underscore --disable-version-string
    22  type formationConstraintService interface {
    23  	Create(ctx context.Context, in *model.FormationConstraintInput) (string, error)
    24  	Get(ctx context.Context, id string) (*model.FormationConstraint, error)
    25  	List(ctx context.Context) ([]*model.FormationConstraint, error)
    26  	ListByFormationTemplateID(ctx context.Context, formationTemplateID string) ([]*model.FormationConstraint, error)
    27  	Delete(ctx context.Context, id string) error
    28  	Update(ctx context.Context, id string, in *model.FormationConstraintInput) error
    29  }
    30  
    31  // Resolver is the FormationConstraint resolver
    32  type Resolver struct {
    33  	transact persistence.Transactioner
    34  
    35  	svc       formationConstraintService
    36  	converter formationConstraintConverter
    37  }
    38  
    39  // NewResolver creates FormationConstraint resolver
    40  func NewResolver(transact persistence.Transactioner, converter formationConstraintConverter, svc formationConstraintService) *Resolver {
    41  	return &Resolver{
    42  		transact:  transact,
    43  		converter: converter,
    44  		svc:       svc,
    45  	}
    46  }
    47  
    48  // FormationConstraints lists all FormationConstraints
    49  func (r *Resolver) FormationConstraints(ctx context.Context) ([]*graphql.FormationConstraint, error) {
    50  	tx, err := r.transact.Begin()
    51  	if err != nil {
    52  		return nil, err
    53  	}
    54  	defer r.transact.RollbackUnlessCommitted(ctx, tx)
    55  
    56  	ctx = persistence.SaveToContext(ctx, tx)
    57  
    58  	formationConstraints, err := r.svc.List(ctx)
    59  	if err != nil {
    60  		return nil, err
    61  	}
    62  
    63  	err = tx.Commit()
    64  	if err != nil {
    65  		return nil, err
    66  	}
    67  
    68  	return r.converter.MultipleToGraphQL(formationConstraints), nil
    69  }
    70  
    71  // FormationConstraintsByFormationType lists all FormationConstraints for the specified FormationTemplate
    72  func (r *Resolver) FormationConstraintsByFormationType(ctx context.Context, formationTemplateID string) ([]*graphql.FormationConstraint, error) {
    73  	tx, err := r.transact.Begin()
    74  	if err != nil {
    75  		return nil, err
    76  	}
    77  	defer r.transact.RollbackUnlessCommitted(ctx, tx)
    78  
    79  	ctx = persistence.SaveToContext(ctx, tx)
    80  
    81  	formationConstraints, err := r.svc.ListByFormationTemplateID(ctx, formationTemplateID)
    82  	if err != nil {
    83  		return nil, err
    84  	}
    85  
    86  	err = tx.Commit()
    87  	if err != nil {
    88  		return nil, err
    89  	}
    90  
    91  	return r.converter.MultipleToGraphQL(formationConstraints), nil
    92  }
    93  
    94  // FormationConstraint queries the FormationConstraint matching ID `id`
    95  func (r *Resolver) FormationConstraint(ctx context.Context, id string) (*graphql.FormationConstraint, error) {
    96  	tx, err := r.transact.Begin()
    97  	if err != nil {
    98  		return nil, err
    99  	}
   100  	defer r.transact.RollbackUnlessCommitted(ctx, tx)
   101  
   102  	ctx = persistence.SaveToContext(ctx, tx)
   103  
   104  	formationConstraint, err := r.svc.Get(ctx, id)
   105  	if err != nil {
   106  		if apperrors.IsNotFoundError(err) {
   107  			return nil, tx.Commit()
   108  		}
   109  		return nil, err
   110  	}
   111  
   112  	err = tx.Commit()
   113  	if err != nil {
   114  		return nil, err
   115  	}
   116  
   117  	return r.converter.ToGraphQL(formationConstraint), nil
   118  }
   119  
   120  // CreateFormationConstraint creates a FormationConstraint using `in`
   121  func (r *Resolver) CreateFormationConstraint(ctx context.Context, in graphql.FormationConstraintInput) (*graphql.FormationConstraint, error) {
   122  	tx, err := r.transact.Begin()
   123  	if err != nil {
   124  		return nil, err
   125  	}
   126  	defer r.transact.RollbackUnlessCommitted(ctx, tx)
   127  
   128  	ctx = persistence.SaveToContext(ctx, tx)
   129  
   130  	if err = in.Validate(); err != nil {
   131  		return nil, err
   132  	}
   133  
   134  	id, err := r.svc.Create(ctx, r.converter.FromInputGraphQL(&in))
   135  	if err != nil {
   136  		return nil, err
   137  	}
   138  	log.C(ctx).Infof("Successfully created an Formation Constraint with name %s and id %s", in.Name, id)
   139  
   140  	formationConstraint, err := r.svc.Get(ctx, id)
   141  	if err != nil {
   142  		return nil, err
   143  	}
   144  
   145  	if err = tx.Commit(); err != nil {
   146  		return nil, err
   147  	}
   148  
   149  	return r.converter.ToGraphQL(formationConstraint), nil
   150  }
   151  
   152  // DeleteFormationConstraint deletes the FormationConstraint matching ID `id`
   153  func (r *Resolver) DeleteFormationConstraint(ctx context.Context, id string) (*graphql.FormationConstraint, error) {
   154  	tx, err := r.transact.Begin()
   155  	if err != nil {
   156  		return nil, err
   157  	}
   158  	defer r.transact.RollbackUnlessCommitted(ctx, tx)
   159  
   160  	ctx = persistence.SaveToContext(ctx, tx)
   161  
   162  	formationConstraint, err := r.svc.Get(ctx, id)
   163  	if err != nil {
   164  		return nil, err
   165  	}
   166  
   167  	err = r.svc.Delete(ctx, id)
   168  	if err != nil {
   169  		return nil, err
   170  	}
   171  
   172  	err = tx.Commit()
   173  	if err != nil {
   174  		return nil, err
   175  	}
   176  
   177  	return r.converter.ToGraphQL(formationConstraint), nil
   178  }
   179  
   180  // UpdateFormationConstraint updates the FormationConstraint matching ID `id` using `in`
   181  func (r *Resolver) UpdateFormationConstraint(ctx context.Context, id string, in graphql.FormationConstraintUpdateInput) (*graphql.FormationConstraint, error) {
   182  	tx, err := r.transact.Begin()
   183  	if err != nil {
   184  		return nil, err
   185  	}
   186  	defer r.transact.RollbackUnlessCommitted(ctx, tx)
   187  
   188  	ctx = persistence.SaveToContext(ctx, tx)
   189  
   190  	currentConstraint, err := r.svc.Get(ctx, id)
   191  	if err != nil {
   192  		return nil, err
   193  	}
   194  
   195  	// constraintType and targetOperation are needed for the template validation
   196  	updatedConstraintInput := &graphql.FormationConstraintInput{
   197  		Name:            currentConstraint.Name,
   198  		ConstraintType:  graphql.ConstraintType(currentConstraint.ConstraintType),
   199  		TargetOperation: graphql.TargetOperation(currentConstraint.TargetOperation),
   200  		Operator:        currentConstraint.Operator,
   201  		ResourceType:    graphql.ResourceType(currentConstraint.ResourceType),
   202  		ResourceSubtype: currentConstraint.ResourceSubtype,
   203  		InputTemplate:   in.InputTemplate,
   204  		ConstraintScope: graphql.ConstraintScope(currentConstraint.ConstraintScope),
   205  	}
   206  
   207  	if err = updatedConstraintInput.Validate(); err != nil {
   208  		return nil, err
   209  	}
   210  
   211  	convertedIn := r.converter.FromInputGraphQL(updatedConstraintInput)
   212  
   213  	err = r.svc.Update(ctx, id, convertedIn)
   214  	if err != nil {
   215  		return nil, err
   216  	}
   217  
   218  	formationConstraint, err := r.svc.Get(ctx, id)
   219  	if err != nil {
   220  		return nil, err
   221  	}
   222  
   223  	err = tx.Commit()
   224  	if err != nil {
   225  		return nil, err
   226  	}
   227  
   228  	return r.converter.ToGraphQL(formationConstraint), nil
   229  }