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

     1  package application
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"time"
     7  
     8  	"github.com/kyma-incubator/compass/components/director/pkg/log"
     9  
    10  	"github.com/kyma-incubator/compass/components/director/pkg/apperrors"
    11  
    12  	"github.com/kyma-incubator/compass/components/director/internal/model"
    13  	"github.com/kyma-incubator/compass/components/director/internal/repo"
    14  	"github.com/kyma-incubator/compass/components/director/pkg/graphql"
    15  	"github.com/pkg/errors"
    16  )
    17  
    18  type converter struct {
    19  	webhook WebhookConverter
    20  
    21  	bndl BundleConverter
    22  }
    23  
    24  // NewConverter missing godoc
    25  func NewConverter(webhook WebhookConverter, bndlConverter BundleConverter) *converter {
    26  	return &converter{webhook: webhook, bndl: bndlConverter}
    27  }
    28  
    29  // ToEntity missing godoc
    30  func (c *converter) ToEntity(in *model.Application) (*Entity, error) {
    31  	if in == nil {
    32  		return nil, nil
    33  	}
    34  
    35  	if in.Status == nil {
    36  		return nil, apperrors.NewInternalError("invalid input model")
    37  	}
    38  
    39  	return &Entity{
    40  		Name:                  in.Name,
    41  		ProviderName:          repo.NewNullableString(in.ProviderName),
    42  		Description:           repo.NewNullableString(in.Description),
    43  		StatusCondition:       string(in.Status.Condition),
    44  		StatusTimestamp:       in.Status.Timestamp,
    45  		HealthCheckURL:        repo.NewNullableString(in.HealthCheckURL),
    46  		IntegrationSystemID:   repo.NewNullableString(in.IntegrationSystemID),
    47  		ApplicationTemplateID: repo.NewNullableString(in.ApplicationTemplateID),
    48  		TenantBusinessTypeID:  repo.NewNullableString(in.TenantBusinessTypeID),
    49  		BaseURL:               repo.NewNullableString(in.BaseURL),
    50  		ApplicationNamespace:  repo.NewNullableString(in.ApplicationNamespace),
    51  		SystemNumber:          repo.NewNullableString(in.SystemNumber),
    52  		LocalTenantID:         repo.NewNullableString(in.LocalTenantID),
    53  		OrdLabels:             repo.NewNullableStringFromJSONRawMessage(in.OrdLabels),
    54  		CorrelationIDs:        repo.NewNullableStringFromJSONRawMessage(in.CorrelationIDs),
    55  		SystemStatus:          repo.NewNullableString(in.SystemStatus),
    56  		Tags:                  repo.NewNullableStringFromJSONRawMessage(in.Tags),
    57  		DocumentationLabels:   repo.NewNullableStringFromJSONRawMessage(in.DocumentationLabels),
    58  		BaseEntity: &repo.BaseEntity{
    59  			ID:        in.ID,
    60  			Ready:     in.Ready,
    61  			CreatedAt: in.CreatedAt,
    62  			UpdatedAt: in.UpdatedAt,
    63  			DeletedAt: in.DeletedAt,
    64  			Error:     repo.NewNullableString(in.Error),
    65  		},
    66  	}, nil
    67  }
    68  
    69  // FromEntity missing godoc
    70  func (c *converter) FromEntity(entity *Entity) *model.Application {
    71  	if entity == nil {
    72  		return nil
    73  	}
    74  
    75  	return &model.Application{
    76  		ProviderName:  repo.StringPtrFromNullableString(entity.ProviderName),
    77  		Name:          entity.Name,
    78  		SystemNumber:  repo.StringPtrFromNullableString(entity.SystemNumber),
    79  		LocalTenantID: repo.StringPtrFromNullableString(entity.LocalTenantID),
    80  		Description:   repo.StringPtrFromNullableString(entity.Description),
    81  		Status: &model.ApplicationStatus{
    82  			Condition: model.ApplicationStatusCondition(entity.StatusCondition),
    83  			Timestamp: entity.StatusTimestamp,
    84  		},
    85  		HealthCheckURL:        repo.StringPtrFromNullableString(entity.HealthCheckURL),
    86  		IntegrationSystemID:   repo.StringPtrFromNullableString(entity.IntegrationSystemID),
    87  		ApplicationTemplateID: repo.StringPtrFromNullableString(entity.ApplicationTemplateID),
    88  		TenantBusinessTypeID:  repo.StringPtrFromNullableString(entity.TenantBusinessTypeID),
    89  		BaseURL:               repo.StringPtrFromNullableString(entity.BaseURL),
    90  		ApplicationNamespace:  repo.StringPtrFromNullableString(entity.ApplicationNamespace),
    91  		OrdLabels:             repo.JSONRawMessageFromNullableString(entity.OrdLabels),
    92  		CorrelationIDs:        repo.JSONRawMessageFromNullableString(entity.CorrelationIDs),
    93  		SystemStatus:          repo.StringPtrFromNullableString(entity.SystemStatus),
    94  		Tags:                  repo.JSONRawMessageFromNullableString(entity.Tags),
    95  		DocumentationLabels:   repo.JSONRawMessageFromNullableString(entity.DocumentationLabels),
    96  		BaseEntity: &model.BaseEntity{
    97  			ID:        entity.ID,
    98  			Ready:     entity.Ready,
    99  			CreatedAt: entity.CreatedAt,
   100  			UpdatedAt: entity.UpdatedAt,
   101  			DeletedAt: entity.DeletedAt,
   102  			Error:     repo.StringPtrFromNullableString(entity.Error),
   103  		},
   104  	}
   105  }
   106  
   107  // ToGraphQL missing godoc
   108  func (c *converter) ToGraphQL(in *model.Application) *graphql.Application {
   109  	if in == nil {
   110  		return nil
   111  	}
   112  
   113  	return &graphql.Application{
   114  		Status:                c.statusModelToGraphQL(in.Status),
   115  		Name:                  in.Name,
   116  		Description:           in.Description,
   117  		HealthCheckURL:        in.HealthCheckURL,
   118  		BaseURL:               in.BaseURL,
   119  		ApplicationNamespace:  in.ApplicationNamespace,
   120  		IntegrationSystemID:   in.IntegrationSystemID,
   121  		ApplicationTemplateID: in.ApplicationTemplateID,
   122  		TenantBusinessTypeID:  in.TenantBusinessTypeID,
   123  		ProviderName:          in.ProviderName,
   124  		SystemNumber:          in.SystemNumber,
   125  		LocalTenantID:         in.LocalTenantID,
   126  		SystemStatus:          in.SystemStatus,
   127  		BaseEntity: &graphql.BaseEntity{
   128  			ID:        in.ID,
   129  			Ready:     in.Ready,
   130  			CreatedAt: timePtrToTimestampPtr(in.CreatedAt),
   131  			UpdatedAt: timePtrToTimestampPtr(in.UpdatedAt),
   132  			DeletedAt: timePtrToTimestampPtr(in.DeletedAt),
   133  			Error:     in.Error,
   134  		},
   135  	}
   136  }
   137  
   138  // MultipleToGraphQL missing godoc
   139  func (c *converter) MultipleToGraphQL(in []*model.Application) []*graphql.Application {
   140  	applications := make([]*graphql.Application, 0, len(in))
   141  	for _, r := range in {
   142  		if r == nil {
   143  			continue
   144  		}
   145  
   146  		applications = append(applications, c.ToGraphQL(r))
   147  	}
   148  
   149  	return applications
   150  }
   151  
   152  // CreateInputFromGraphQL missing godoc
   153  func (c *converter) CreateInputFromGraphQL(ctx context.Context, in graphql.ApplicationRegisterInput) (model.ApplicationRegisterInput, error) {
   154  	var labels map[string]interface{}
   155  	if in.Labels != nil {
   156  		labels = in.Labels
   157  	}
   158  
   159  	log.C(ctx).Debugf("Converting Webhooks from Application registration GraphQL input with name %s", in.Name)
   160  	webhooks, err := c.webhook.MultipleInputFromGraphQL(in.Webhooks)
   161  	if err != nil {
   162  		return model.ApplicationRegisterInput{}, errors.Wrap(err, "while converting Webhooks")
   163  	}
   164  
   165  	log.C(ctx).Debugf("Converting Bundles from Application registration GraphQL input with name %s", in.Name)
   166  	bundles, err := c.bndl.MultipleCreateInputFromGraphQL(in.Bundles)
   167  	if err != nil {
   168  		return model.ApplicationRegisterInput{}, errors.Wrap(err, "while converting Bundles")
   169  	}
   170  
   171  	var statusCondition *model.ApplicationStatusCondition
   172  	if in.StatusCondition != nil {
   173  		condition := model.ApplicationStatusCondition(*in.StatusCondition)
   174  		statusCondition = &condition
   175  	}
   176  	return model.ApplicationRegisterInput{
   177  		Name:                 in.Name,
   178  		Description:          in.Description,
   179  		Labels:               labels,
   180  		LocalTenantID:        in.LocalTenantID,
   181  		BaseURL:              in.BaseURL,
   182  		ApplicationNamespace: in.ApplicationNamespace,
   183  		HealthCheckURL:       in.HealthCheckURL,
   184  		IntegrationSystemID:  in.IntegrationSystemID,
   185  		StatusCondition:      statusCondition,
   186  		ProviderName:         in.ProviderName,
   187  		Webhooks:             webhooks,
   188  		Bundles:              bundles,
   189  	}, nil
   190  }
   191  
   192  // UpdateInputFromGraphQL missing godoc
   193  func (c *converter) UpdateInputFromGraphQL(in graphql.ApplicationUpdateInput) model.ApplicationUpdateInput {
   194  	var statusCondition *model.ApplicationStatusCondition
   195  	if in.StatusCondition != nil {
   196  		condition := model.ApplicationStatusCondition(*in.StatusCondition)
   197  		statusCondition = &condition
   198  	}
   199  	return model.ApplicationUpdateInput{
   200  		Description:          in.Description,
   201  		HealthCheckURL:       in.HealthCheckURL,
   202  		IntegrationSystemID:  in.IntegrationSystemID,
   203  		LocalTenantID:        in.LocalTenantID,
   204  		ProviderName:         in.ProviderName,
   205  		StatusCondition:      statusCondition,
   206  		BaseURL:              in.BaseURL,
   207  		ApplicationNamespace: in.ApplicationNamespace,
   208  	}
   209  }
   210  
   211  // CreateRegisterInputJSONToGQL missing godoc
   212  func (c *converter) CreateRegisterInputJSONToGQL(in string) (graphql.ApplicationRegisterInput, error) {
   213  	var appInput graphql.ApplicationRegisterInput
   214  	err := json.Unmarshal([]byte(in), &appInput)
   215  	if err != nil {
   216  		return graphql.ApplicationRegisterInput{}, errors.Wrap(err, "while unmarshalling string to ApplicationRegisterInput")
   217  	}
   218  
   219  	return appInput, nil
   220  }
   221  
   222  // CreateJSONInputJSONToGQL missing godoc
   223  func (c *converter) CreateJSONInputJSONToGQL(in string) (graphql.ApplicationJSONInput, error) {
   224  	var appInput graphql.ApplicationJSONInput
   225  	err := json.Unmarshal([]byte(in), &appInput)
   226  	if err != nil {
   227  		return graphql.ApplicationJSONInput{}, errors.Wrap(err, "while unmarshalling string to ApplicationJSONInput")
   228  	}
   229  
   230  	return appInput, nil
   231  }
   232  
   233  // CreateInputJSONToModel converts a JSON input to an application model.
   234  func (c *converter) CreateInputJSONToModel(ctx context.Context, in string) (model.ApplicationRegisterInput, error) {
   235  	modelIn := model.ApplicationRegisterInput{}
   236  	if err := json.Unmarshal([]byte(in), &modelIn); err != nil {
   237  		return modelIn, errors.Wrap(err, "while unmarshalling application input JSON")
   238  	}
   239  	return modelIn, nil
   240  }
   241  
   242  // CreateRegisterInputGQLToJSON missing godoc
   243  func (c *converter) CreateRegisterInputGQLToJSON(in *graphql.ApplicationRegisterInput) (string, error) {
   244  	appInput, err := json.Marshal(in)
   245  	if err != nil {
   246  		return "", errors.Wrap(err, "while marshaling application input")
   247  	}
   248  
   249  	return string(appInput), nil
   250  }
   251  
   252  // CreateJSONInputGQLToJSON missing godoc
   253  func (c *converter) CreateJSONInputGQLToJSON(in *graphql.ApplicationJSONInput) (string, error) {
   254  	appInput, err := json.Marshal(in)
   255  	if err != nil {
   256  		return "", errors.Wrap(err, "while marshaling application input")
   257  	}
   258  
   259  	return string(appInput), nil
   260  }
   261  
   262  // GraphQLToModel missing godoc
   263  func (c *converter) GraphQLToModel(obj *graphql.Application, tenantID string) *model.Application {
   264  	if obj == nil {
   265  		return nil
   266  	}
   267  
   268  	return &model.Application{
   269  		ProviderName:         obj.ProviderName,
   270  		Name:                 obj.Name,
   271  		Description:          obj.Description,
   272  		LocalTenantID:        obj.LocalTenantID,
   273  		Status:               c.statusGraphQLToModel(obj.Status),
   274  		HealthCheckURL:       obj.HealthCheckURL,
   275  		IntegrationSystemID:  obj.IntegrationSystemID,
   276  		SystemNumber:         obj.SystemNumber,
   277  		ApplicationNamespace: obj.ApplicationNamespace,
   278  		BaseEntity: &model.BaseEntity{
   279  			ID: obj.ID,
   280  		},
   281  	}
   282  }
   283  
   284  func (c *converter) statusModelToGraphQL(in *model.ApplicationStatus) *graphql.ApplicationStatus {
   285  	if in == nil {
   286  		return &graphql.ApplicationStatus{Condition: graphql.ApplicationStatusConditionInitial}
   287  	}
   288  
   289  	return &graphql.ApplicationStatus{
   290  		Condition: graphql.ApplicationStatusCondition(in.Condition),
   291  		Timestamp: graphql.Timestamp(in.Timestamp),
   292  	}
   293  }
   294  
   295  func (c *converter) statusGraphQLToModel(in *graphql.ApplicationStatus) *model.ApplicationStatus {
   296  	if in == nil {
   297  		return &model.ApplicationStatus{Condition: model.ApplicationStatusConditionInitial}
   298  	}
   299  
   300  	return &model.ApplicationStatus{
   301  		Condition: model.ApplicationStatusCondition(in.Condition),
   302  		Timestamp: time.Time(in.Timestamp),
   303  	}
   304  }
   305  
   306  func timePtrToTimestampPtr(time *time.Time) *graphql.Timestamp {
   307  	if time == nil {
   308  		return nil
   309  	}
   310  
   311  	t := graphql.Timestamp(*time)
   312  	return &t
   313  }