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 }