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  }