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 }