github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/internal/domain/certsubjectmapping/resolver.go (about) 1 package certsubjectmapping 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 // CertSubjectMappingService is responsible for service-layer certificate subject mapping operations 14 //go:generate mockery --name=CertSubjectMappingService --output=automock --outpkg=automock --case=underscore --disable-version-string 15 type CertSubjectMappingService interface { 16 Create(ctx context.Context, in *model.CertSubjectMapping) (string, error) 17 Get(ctx context.Context, id string) (*model.CertSubjectMapping, error) 18 Update(ctx context.Context, in *model.CertSubjectMapping) error 19 Delete(ctx context.Context, id string) error 20 Exists(ctx context.Context, id string) (bool, error) 21 List(ctx context.Context, pageSize int, cursor string) (*model.CertSubjectMappingPage, error) 22 } 23 24 // Converter converts between the graphql and internal model 25 //go:generate mockery --name=Converter --output=automock --outpkg=automock --case=underscore --disable-version-string 26 type Converter interface { 27 ToGraphQL(in *model.CertSubjectMapping) *graphql.CertificateSubjectMapping 28 MultipleToGraphQL(in []*model.CertSubjectMapping) []*graphql.CertificateSubjectMapping 29 FromGraphql(id string, in graphql.CertificateSubjectMappingInput) *model.CertSubjectMapping 30 } 31 32 // UIDService generates UUIDs for new entities 33 //go:generate mockery --name=UIDService --output=automock --outpkg=automock --case=underscore --disable-version-string 34 type UIDService interface { 35 Generate() string 36 } 37 38 // Resolver is an object responsible for resolver-layer operations. 39 type Resolver struct { 40 transact persistence.Transactioner 41 conv Converter 42 certSubjectMappingSvc CertSubjectMappingService 43 uidSvc UIDService 44 } 45 46 // NewResolver returns a new object responsible for resolver-layer certificate subject mapping operations. 47 func NewResolver(transact persistence.Transactioner, conv Converter, certSubjectMappingSvc CertSubjectMappingService, uidSvc UIDService) *Resolver { 48 return &Resolver{ 49 transact: transact, 50 conv: conv, 51 certSubjectMappingSvc: certSubjectMappingSvc, 52 uidSvc: uidSvc, 53 } 54 } 55 56 // CertificateSubjectMapping queries the CertificateSubjectMapping matching ID `id` 57 func (r *Resolver) CertificateSubjectMapping(ctx context.Context, id string) (*graphql.CertificateSubjectMapping, error) { 58 tx, err := r.transact.Begin() 59 if err != nil { 60 return nil, err 61 } 62 defer r.transact.RollbackUnlessCommitted(ctx, tx) 63 64 ctx = persistence.SaveToContext(ctx, tx) 65 66 csm, err := r.certSubjectMappingSvc.Get(ctx, id) 67 if err != nil { 68 return nil, err 69 } 70 71 if err = tx.Commit(); err != nil { 72 return nil, err 73 } 74 75 return r.conv.ToGraphQL(csm), nil 76 } 77 78 // CertificateSubjectMappings list all CertificateSubjectMapping with pagination based on `first` and `after` 79 func (r *Resolver) CertificateSubjectMappings(ctx context.Context, first *int, after *graphql.PageCursor) (*graphql.CertificateSubjectMappingPage, error) { 80 var cursor string 81 if after != nil { 82 cursor = string(*after) 83 } 84 if first == nil { 85 return nil, apperrors.NewInvalidDataError("missing required parameter 'first'") 86 } 87 88 tx, err := r.transact.Begin() 89 if err != nil { 90 return nil, err 91 } 92 defer r.transact.RollbackUnlessCommitted(ctx, tx) 93 94 ctx = persistence.SaveToContext(ctx, tx) 95 96 csmPage, err := r.certSubjectMappingSvc.List(ctx, *first, cursor) 97 if err != nil { 98 return nil, err 99 } 100 101 if err = tx.Commit(); err != nil { 102 return nil, err 103 } 104 105 gqlCertSubjectMapping := r.conv.MultipleToGraphQL(csmPage.Data) 106 107 return &graphql.CertificateSubjectMappingPage{ 108 Data: gqlCertSubjectMapping, 109 TotalCount: csmPage.TotalCount, 110 PageInfo: &graphql.PageInfo{ 111 StartCursor: graphql.PageCursor(csmPage.PageInfo.StartCursor), 112 EndCursor: graphql.PageCursor(csmPage.PageInfo.EndCursor), 113 HasNextPage: csmPage.PageInfo.HasNextPage, 114 }, 115 }, nil 116 } 117 118 // CreateCertificateSubjectMapping creates a CertificateSubjectMapping with the provided input `in` 119 func (r *Resolver) CreateCertificateSubjectMapping(ctx context.Context, in graphql.CertificateSubjectMappingInput) (*graphql.CertificateSubjectMapping, error) { 120 tx, err := r.transact.Begin() 121 if err != nil { 122 return nil, err 123 } 124 defer r.transact.RollbackUnlessCommitted(ctx, tx) 125 126 ctx = persistence.SaveToContext(ctx, tx) 127 128 if err = in.Validate(); err != nil { 129 return nil, err 130 } 131 132 certSubjectMappingID := r.uidSvc.Generate() 133 csmID, err := r.certSubjectMappingSvc.Create(ctx, r.conv.FromGraphql(certSubjectMappingID, in)) 134 if err != nil { 135 return nil, err 136 } 137 log.C(ctx).Infof("Successfully created a certificate subject mapping with ID: %s and subject: %s", certSubjectMappingID, in.Subject) 138 139 csm, err := r.certSubjectMappingSvc.Get(ctx, csmID) 140 if err != nil { 141 return nil, err 142 } 143 144 if err = tx.Commit(); err != nil { 145 return nil, err 146 } 147 148 return r.conv.ToGraphQL(csm), nil 149 } 150 151 // UpdateCertificateSubjectMapping updates the CertificateSubjectMapping matching ID `id` using `in` 152 func (r *Resolver) UpdateCertificateSubjectMapping(ctx context.Context, id string, in graphql.CertificateSubjectMappingInput) (*graphql.CertificateSubjectMapping, error) { 153 tx, err := r.transact.Begin() 154 if err != nil { 155 return nil, err 156 } 157 defer r.transact.RollbackUnlessCommitted(ctx, tx) 158 159 ctx = persistence.SaveToContext(ctx, tx) 160 161 if err = in.Validate(); err != nil { 162 return nil, err 163 } 164 165 err = r.certSubjectMappingSvc.Update(ctx, r.conv.FromGraphql(id, in)) 166 if err != nil { 167 return nil, err 168 } 169 170 csm, err := r.certSubjectMappingSvc.Get(ctx, id) 171 if err != nil { 172 return nil, err 173 } 174 175 err = tx.Commit() 176 if err != nil { 177 return nil, err 178 } 179 180 return r.conv.ToGraphQL(csm), nil 181 } 182 183 // DeleteCertificateSubjectMapping deletes the CertificateSubjectMapping matching ID `id` 184 func (r *Resolver) DeleteCertificateSubjectMapping(ctx context.Context, id string) (*graphql.CertificateSubjectMapping, error) { 185 tx, err := r.transact.Begin() 186 if err != nil { 187 return nil, err 188 } 189 defer r.transact.RollbackUnlessCommitted(ctx, tx) 190 191 ctx = persistence.SaveToContext(ctx, tx) 192 193 csm, err := r.certSubjectMappingSvc.Get(ctx, id) 194 if err != nil { 195 return nil, err 196 } 197 198 err = r.certSubjectMappingSvc.Delete(ctx, id) 199 if err != nil { 200 return nil, err 201 } 202 203 if err = tx.Commit(); err != nil { 204 return nil, err 205 } 206 207 return r.conv.ToGraphQL(csm), nil 208 }