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

     1  package onetimetoken
     2  
     3  import (
     4  	"context"
     5  
     6  	pkgmodel "github.com/kyma-incubator/compass/components/director/pkg/model"
     7  
     8  	"github.com/kyma-incubator/compass/components/director/internal/model"
     9  	"github.com/kyma-incubator/compass/components/director/pkg/apperrors"
    10  	"github.com/kyma-incubator/compass/components/director/pkg/graphql"
    11  	"github.com/kyma-incubator/compass/components/director/pkg/persistence"
    12  	"github.com/pkg/errors"
    13  )
    14  
    15  // TokenService missing godoc
    16  //
    17  //go:generate mockery --name=TokenService --output=automock --outpkg=automock --case=underscore --disable-version-string
    18  type TokenService interface {
    19  	GenerateOneTimeToken(ctx context.Context, runtimeID string, tokenType pkgmodel.SystemAuthReferenceObjectType) (*model.OneTimeToken, error)
    20  	RegenerateOneTimeToken(ctx context.Context, sysAuthID string) (*model.OneTimeToken, error)
    21  }
    22  
    23  // TokenConverter missing godoc
    24  //
    25  //go:generate mockery --name=TokenConverter --output=automock --outpkg=automock --case=underscore --disable-version-string
    26  type TokenConverter interface {
    27  	ToGraphQLForRuntime(model model.OneTimeToken) graphql.OneTimeTokenForRuntime
    28  	ToGraphQLForApplication(model model.OneTimeToken) (graphql.OneTimeTokenForApplication, error)
    29  }
    30  
    31  // Resolver missing godoc
    32  type Resolver struct {
    33  	transact              persistence.Transactioner
    34  	svc                   TokenService
    35  	conv                  TokenConverter
    36  	suggestTokenHeaderKey string
    37  }
    38  
    39  // NewTokenResolver missing godoc
    40  func NewTokenResolver(transact persistence.Transactioner, svc TokenService, conv TokenConverter, suggestTokenHeaderKey string) *Resolver {
    41  	return &Resolver{transact: transact, svc: svc, conv: conv, suggestTokenHeaderKey: suggestTokenHeaderKey}
    42  }
    43  
    44  // RequestOneTimeTokenForRuntime missing godoc
    45  func (r *Resolver) RequestOneTimeTokenForRuntime(ctx context.Context, id string, systemAuthID *string) (*graphql.OneTimeTokenForRuntime, error) {
    46  	tx, err := r.transact.Begin()
    47  	if err != nil {
    48  		return nil, err
    49  	}
    50  	defer r.transact.RollbackUnlessCommitted(ctx, tx)
    51  	ctx = persistence.SaveToContext(ctx, tx)
    52  
    53  	var token *model.OneTimeToken
    54  	if systemAuthID != nil {
    55  		token, err = r.svc.RegenerateOneTimeToken(ctx, *systemAuthID)
    56  	} else {
    57  		token, err = r.svc.GenerateOneTimeToken(ctx, id, pkgmodel.RuntimeReference)
    58  	}
    59  	if err != nil {
    60  		return nil, err
    61  	}
    62  	if err = tx.Commit(); err != nil {
    63  		return nil, errors.Wrap(err, "while committing transaction")
    64  	}
    65  
    66  	gqlToken := r.conv.ToGraphQLForRuntime(*token)
    67  	return &gqlToken, nil
    68  }
    69  
    70  // RequestOneTimeTokenForApplication missing godoc
    71  func (r *Resolver) RequestOneTimeTokenForApplication(ctx context.Context, id string, systemAuthID *string) (*graphql.OneTimeTokenForApplication, error) {
    72  	tx, err := r.transact.Begin()
    73  	if err != nil {
    74  		return nil, err
    75  	}
    76  	defer r.transact.RollbackUnlessCommitted(ctx, tx)
    77  	ctx = persistence.SaveToContext(ctx, tx)
    78  
    79  	var token *model.OneTimeToken
    80  	if systemAuthID != nil {
    81  		token, err = r.svc.RegenerateOneTimeToken(ctx, *systemAuthID)
    82  	} else {
    83  		token, err = r.svc.GenerateOneTimeToken(ctx, id, pkgmodel.ApplicationReference)
    84  	}
    85  	if err != nil {
    86  		return nil, err
    87  	}
    88  
    89  	if err = tx.Commit(); err != nil {
    90  		return nil, errors.Wrap(err, "while committing transaction")
    91  	}
    92  	gqlToken, err := r.conv.ToGraphQLForApplication(*token)
    93  	if err != nil {
    94  		return nil, errors.Wrap(err, "while converting one-time token to graphql")
    95  	}
    96  	return &gqlToken, nil
    97  }
    98  
    99  // RawEncoded missing godoc
   100  func (r *Resolver) RawEncoded(ctx context.Context, obj *graphql.TokenWithURL) (*string, error) {
   101  	if obj == nil {
   102  		return nil, apperrors.NewInternalError("Token was nil")
   103  	}
   104  
   105  	if !tokenSuggestionEnabled(ctx, r.suggestTokenHeaderKey) {
   106  		return rawEncoded(obj)
   107  	}
   108  
   109  	return rawEncoded(&graphql.TokenWithURL{
   110  		Token:          extractToken(obj.Token),
   111  		ConnectorURL:   obj.ConnectorURL,
   112  		Used:           obj.Used,
   113  		ExpiresAt:      obj.ExpiresAt,
   114  		CreatedAt:      obj.CreatedAt,
   115  		UsedAt:         obj.UsedAt,
   116  		Type:           obj.Type,
   117  		ScenarioGroups: obj.ScenarioGroups,
   118  	})
   119  }
   120  
   121  // Raw missing godoc
   122  func (r *Resolver) Raw(ctx context.Context, obj *graphql.TokenWithURL) (*string, error) {
   123  	if obj == nil {
   124  		return nil, apperrors.NewInternalError("Token was nil")
   125  	}
   126  
   127  	if !tokenSuggestionEnabled(ctx, r.suggestTokenHeaderKey) {
   128  		return raw(obj)
   129  	}
   130  
   131  	return raw(&graphql.TokenWithURL{
   132  		Token:          extractToken(obj.Token),
   133  		ConnectorURL:   obj.ConnectorURL,
   134  		Used:           obj.Used,
   135  		ExpiresAt:      obj.ExpiresAt,
   136  		CreatedAt:      obj.CreatedAt,
   137  		UsedAt:         obj.UsedAt,
   138  		Type:           obj.Type,
   139  		ScenarioGroups: obj.ScenarioGroups,
   140  	})
   141  }