github.com/kyma-incubator/compass/components/director@v0.0.0-20230623144113-d764f56ff805/pkg/graphql/graphqlizer/fields.go (about) 1 package graphqlizer 2 3 import ( 4 "fmt" 5 "strings" 6 ) 7 8 // GqlFieldsProvider is responsible for generating GraphQL queries that request for all fields for given type 9 type GqlFieldsProvider struct{} 10 11 // FieldCtx is a map of optional fields that can be passed to FieldsProvider 12 // Map keys should be in following format: `type.field` eg. `APIDefinition.auth` 13 type FieldCtx map[string]string 14 15 // addFieldsFromContext checks if field context contains specific keys, adds them to provided fields and returns them 16 func addFieldsFromContext(oldFields string, ctx []FieldCtx, keys []string) string { 17 var newFields []string 18 for _, key := range keys { 19 for _, dict := range ctx { 20 if val, ok := dict[key]; ok { 21 newFields = append(newFields, val) 22 break 23 } 24 } 25 } 26 if len(newFields) == 0 { 27 return oldFields 28 } 29 30 return fmt.Sprintf("%s\n%s", oldFields, strings.Join(newFields, "\n")) 31 } 32 33 func buildProperties(allProperties map[string]string, omittedProperties []string) string { 34 resultProperties := make([]string, 0, len(allProperties)) 35 for key, prop := range allProperties { 36 shouldBeOmitted := false 37 for _, om := range omittedProperties { 38 if strings.HasPrefix(key, om) { 39 shouldBeOmitted = true 40 break 41 } 42 } 43 if !shouldBeOmitted { 44 resultProperties = append(resultProperties, prop) 45 } 46 } 47 return strings.Join(resultProperties, "\n") 48 } 49 50 func extractOmitFor(omittedProperties []string, propertyName string) []string { 51 result := make([]string, 0) 52 for _, om := range omittedProperties { 53 if strings.HasPrefix(om, propertyName+".") { 54 result = append(result, strings.TrimPrefix(om, propertyName+".")) 55 } 56 } 57 return result 58 } 59 60 // Page missing godoc 61 func (fp *GqlFieldsProvider) Page(item string) string { 62 return fmt.Sprintf(`data { 63 %s 64 } 65 pageInfo {%s} 66 totalCount 67 `, item, fp.ForPageInfo()) 68 } 69 70 // OmitForApplication missing godoc 71 func (fp *GqlFieldsProvider) OmitForApplication(omittedProperties []string) string { 72 bundlesOmittedProperties := extractOmitFor(omittedProperties, "bundles") 73 webhooksOmittedProperties := extractOmitFor(omittedProperties, "webhooks") 74 75 return buildProperties(map[string]string{ 76 "id": "id", 77 "name": "name", 78 "providerName": "providerName", 79 "description": "description", 80 "baseUrl": "baseUrl", 81 "systemNumber": "systemNumber", 82 "integrationSystemID": "integrationSystemID", 83 "applicationTemplateID": "applicationTemplateID", 84 "labels": "labels", 85 "status": "status { condition timestamp }", 86 "webhooks": fmt.Sprintf("webhooks {%s}", fp.OmitForWebhooks(webhooksOmittedProperties)), 87 "healthCheckURL": "healthCheckURL", 88 "bundles": fmt.Sprintf("bundles {%s}", fp.Page(fp.OmitForBundle(bundlesOmittedProperties))), 89 "auths": fmt.Sprintf("auths {%s}", fp.ForSystemAuth()), 90 "eventingConfiguration": "eventingConfiguration { defaultURL }", 91 }, omittedProperties) 92 } 93 94 // ForApplication missing godoc 95 func (fp *GqlFieldsProvider) ForApplication(ctx ...FieldCtx) string { 96 return addFieldsFromContext(fmt.Sprintf(` 97 id 98 name 99 providerName 100 description 101 baseUrl 102 systemNumber 103 systemStatus 104 integrationSystemID 105 applicationTemplateID 106 labels 107 deletedAt 108 updatedAt 109 error 110 status {condition timestamp} 111 webhooks {%s} 112 healthCheckURL 113 bundles {%s} 114 auths {%s} 115 eventingConfiguration { defaultURL } 116 `, fp.ForWebhooks(), fp.Page(fp.ForBundle()), fp.ForSystemAuth()), 117 ctx, []string{"Application.bundle", "Application.apiDefinition", "Application.eventDefinition"}) 118 } 119 120 // ForApplicationTemplate missing godoc 121 func (fp *GqlFieldsProvider) ForApplicationTemplate(ctx ...FieldCtx) string { 122 return fmt.Sprintf(` 123 id 124 name 125 description 126 applicationInput 127 placeholders {%s} 128 webhooks {%s} 129 labels 130 accessLevel 131 `, fp.ForPlaceholders(), fp.ForWebhooks()) 132 } 133 134 // ForFormation missing godoc 135 func (fp *GqlFieldsProvider) ForFormation() string { 136 return ` 137 id 138 name 139 formationTemplateId 140 state 141 ` 142 } 143 144 // ForFormationWithStatus missing godoc 145 func (fp *GqlFieldsProvider) ForFormationWithStatus() string { 146 return fmt.Sprintf(` 147 id 148 name 149 formationTemplateId 150 state 151 status {%s} 152 `, fp.ForFormationStatus()) 153 } 154 155 // ForFormationTemplate missing godoc 156 func (fp *GqlFieldsProvider) ForFormationTemplate() string { 157 return fmt.Sprintf(` 158 id 159 name 160 applicationTypes 161 runtimeTypes 162 runtimeTypeDisplayName 163 runtimeArtifactKind 164 leadingProductIDs 165 webhooks {%s} 166 `, fp.ForWebhooks()) 167 } 168 169 // ForFormationTemplateWithConstraints missing godoc 170 func (fp *GqlFieldsProvider) ForFormationTemplateWithConstraints() string { 171 return fmt.Sprintf(` 172 id 173 name 174 applicationTypes 175 runtimeTypes 176 runtimeTypeDisplayName 177 runtimeArtifactKind 178 leadingProductIDs 179 webhooks {%s} 180 formationConstraints {%s} 181 `, fp.ForWebhooks(), fp.ForFormationConstraint()) 182 } 183 184 // ForFormationAssignment missing godoc 185 func (fp *GqlFieldsProvider) ForFormationAssignment() string { 186 return ` 187 id 188 source 189 sourceType 190 target 191 targetType 192 state 193 value 194 ` 195 } 196 197 // ForFormationStatus missing godoc 198 func (fp *GqlFieldsProvider) ForFormationStatus() string { 199 return fmt.Sprintf(` 200 condition 201 errors { 202 %s 203 } 204 `, fp.ForFormationStatusErrors()) 205 } 206 207 // ForFormationStatusErrors missing godoc 208 func (fp *GqlFieldsProvider) ForFormationStatusErrors() string { 209 return ` 210 assignmentID 211 message 212 errorCode 213 ` 214 } 215 216 // ForFormationConstraint missing godoc 217 func (fp *GqlFieldsProvider) ForFormationConstraint() string { 218 return ` 219 id 220 name 221 constraintType 222 targetOperation 223 operator 224 resourceType 225 resourceSubtype 226 inputTemplate 227 constraintScope 228 ` 229 } 230 231 // ForFormationTemplateConstraintReference missing godoc 232 func (fp *GqlFieldsProvider) ForFormationTemplateConstraintReference() string { 233 return ` 234 constraintID 235 formationTemplateID 236 ` 237 } 238 239 // OmitForWebhooks missing godoc 240 func (fp *GqlFieldsProvider) OmitForWebhooks(omittedProperties []string) string { 241 return buildProperties(map[string]string{ 242 "id": "id", 243 "applicationID": "applicationID", 244 "type": "type", 245 "mode": "mode", 246 "correlationIdKey": "correlationIdKey", 247 "retryInterval": "retryInterval", 248 "timeout": "timeout", 249 "url": "url", 250 "urlTemplate": "urlTemplate", 251 "inputTemplate": "inputTemplate", 252 "headerTemplate": "headerTemplate", 253 "outputTemplate": "outputTemplate", 254 "statusTemplate": "statusTemplate", 255 "auth": fmt.Sprintf("auth {%s}", fp.ForAuth()), 256 "createdAt": "createdAt", 257 }, omittedProperties) 258 } 259 260 // ForWebhooks missing godoc 261 func (fp *GqlFieldsProvider) ForWebhooks() string { 262 return fmt.Sprintf( 263 `id 264 applicationID 265 applicationTemplateID 266 runtimeID 267 formationTemplateID 268 type 269 mode 270 correlationIdKey 271 retryInterval 272 timeout 273 url 274 urlTemplate 275 inputTemplate 276 headerTemplate 277 outputTemplate 278 statusTemplate 279 auth { 280 %s 281 } 282 createdAt`, fp.ForAuth()) 283 } 284 285 // OmitForAPIDefinition missing godoc 286 func (fp *GqlFieldsProvider) OmitForAPIDefinition(omittedProperties []string) string { 287 specOmittedProperties := extractOmitFor(omittedProperties, "spec") 288 versionOmittedProperties := extractOmitFor(omittedProperties, "version") 289 290 return buildProperties(map[string]string{ 291 "id": "id", 292 "name": "name", 293 "description": "description", 294 "spec": fmt.Sprintf("spec {%s}", fp.OmitForAPISpec(specOmittedProperties)), 295 "targetURL": "targetURL", 296 "group": "group", 297 "version": fmt.Sprintf("version {%s}", fp.OmitForVersion(versionOmittedProperties)), 298 }, omittedProperties) 299 } 300 301 // ForAPIDefinition missing godoc 302 func (fp *GqlFieldsProvider) ForAPIDefinition(ctx ...FieldCtx) string { 303 return addFieldsFromContext(fmt.Sprintf(` 304 id 305 name 306 description 307 spec {%s} 308 targetURL 309 group 310 version {%s}`, fp.ForAPISpec(), fp.ForVersion()), 311 ctx, []string{"APIDefinition.auth"}) 312 } 313 314 // ForSystemAuth missing godoc 315 func (fp *GqlFieldsProvider) ForSystemAuth() string { 316 return fmt.Sprintf(` 317 id 318 auth {%s}`, fp.ForAuth()) 319 } 320 321 // OmitForAPISpec missing godoc 322 func (fp *GqlFieldsProvider) OmitForAPISpec(omittedProperties []string) string { 323 frOmittedProperties := extractOmitFor(omittedProperties, "fetchRequest") 324 325 return buildProperties(map[string]string{ 326 "id": "id", 327 "data": "data", 328 "format": "format", 329 "type": "type", 330 "fetchRequest": fmt.Sprintf("fetchRequest {%s}", fp.OmitForFetchRequest(frOmittedProperties)), 331 }, omittedProperties) 332 } 333 334 // ForAPISpec missing godoc 335 func (fp *GqlFieldsProvider) ForAPISpec() string { 336 return fmt.Sprintf(` 337 id 338 data 339 format 340 type 341 fetchRequest {%s}`, fp.ForFetchRequest()) 342 } 343 344 // OmitForFetchRequest missing godoc 345 func (fp *GqlFieldsProvider) OmitForFetchRequest(omittedProperties []string) string { 346 return buildProperties(map[string]string{ 347 "url": "url", 348 "auth": fmt.Sprintf("auth {%s}", fp.ForAuth()), 349 "mode": "mode", 350 "filter": "filter", 351 "status": "status {condition message timestamp}", 352 }, omittedProperties) 353 } 354 355 // ForFetchRequest missing godoc 356 func (fp *GqlFieldsProvider) ForFetchRequest() string { 357 return fmt.Sprintf(` 358 url 359 auth {%s} 360 mode 361 filter 362 status {condition message timestamp}`, fp.ForAuth()) 363 } 364 365 // ForAPIRuntimeAuth missing godoc 366 func (fp *GqlFieldsProvider) ForAPIRuntimeAuth() string { 367 return fmt.Sprintf(`runtimeID 368 auth {%s}`, fp.ForAuth()) 369 } 370 371 // OmitForVersion missing godoc 372 func (fp *GqlFieldsProvider) OmitForVersion(omittedProperties []string) string { 373 return buildProperties(map[string]string{ 374 "value": "value", 375 "deprecated": "deprecated", 376 "deprecatedSince": "deprecatedSince", 377 "forRemoval": "forRemoval", 378 }, omittedProperties) 379 } 380 381 // ForVersion missing godoc 382 func (fp *GqlFieldsProvider) ForVersion() string { 383 return `value 384 deprecated 385 deprecatedSince 386 forRemoval` 387 } 388 389 // ForPageInfo missing godoc 390 func (fp *GqlFieldsProvider) ForPageInfo() string { 391 return `startCursor 392 endCursor 393 hasNextPage` 394 } 395 396 // OmitForEventDefinition missing godoc 397 func (fp *GqlFieldsProvider) OmitForEventDefinition(omittedProperties []string) string { 398 specOmittedProperties := extractOmitFor(omittedProperties, "spec") 399 versionOmittedProperties := extractOmitFor(omittedProperties, "version") 400 401 return buildProperties(map[string]string{ 402 "id": "id", 403 "name": "name", 404 "description": "description", 405 "group": "group", 406 "spec": fmt.Sprintf("spec {%s}", fp.OmitForEventSpec(specOmittedProperties)), 407 "version": fmt.Sprintf("version {%s}", fp.OmitForVersion(versionOmittedProperties)), 408 }, omittedProperties) 409 } 410 411 // ForEventDefinition missing godoc 412 func (fp *GqlFieldsProvider) ForEventDefinition() string { 413 return fmt.Sprintf(` 414 id 415 name 416 description 417 group 418 spec {%s} 419 version {%s} 420 `, fp.ForEventSpec(), fp.ForVersion()) 421 } 422 423 // OmitForEventSpec missing godoc 424 func (fp *GqlFieldsProvider) OmitForEventSpec(omittedProperties []string) string { 425 frOmittedProperties := extractOmitFor(omittedProperties, "fetchRequest") 426 427 return buildProperties(map[string]string{ 428 "id": "id", 429 "data": "data", 430 "type": "type", 431 "format": "format", 432 "fetchRequest": fmt.Sprintf("fetchRequest {%s}", fp.OmitForFetchRequest(frOmittedProperties)), 433 }, omittedProperties) 434 } 435 436 // ForEventSpec missing godoc 437 func (fp *GqlFieldsProvider) ForEventSpec() string { 438 return fmt.Sprintf(` 439 id 440 data 441 type 442 format 443 fetchRequest {%s}`, fp.ForFetchRequest()) 444 } 445 446 // OmitForDocument missing godoc 447 func (fp *GqlFieldsProvider) OmitForDocument(omittedProperties []string) string { 448 frOmittedProperties := extractOmitFor(omittedProperties, "fetchRequest") 449 450 return buildProperties(map[string]string{ 451 "id": "id", 452 "title": "title", 453 "displayName": "displayName", 454 "description": "description", 455 "format": "format", 456 "kind": "kind", 457 "data": "data", 458 "fetchRequest": fmt.Sprintf("fetchRequest {%s}", fp.OmitForFetchRequest(frOmittedProperties)), 459 }, omittedProperties) 460 } 461 462 // ForDocument missing godoc 463 func (fp *GqlFieldsProvider) ForDocument() string { 464 return fmt.Sprintf(` 465 id 466 title 467 displayName 468 description 469 format 470 kind 471 data 472 fetchRequest {%s}`, fp.ForFetchRequest()) 473 } 474 475 // ForAuth missing godoc 476 func (fp *GqlFieldsProvider) ForAuth() string { 477 return `credential { 478 ... on BasicCredentialData { 479 username 480 password 481 } 482 ... on CertificateOAuthCredentialData { 483 clientId 484 certificate 485 url 486 } 487 ... on OAuthCredentialData { 488 clientId 489 clientSecret 490 url 491 } 492 } 493 oneTimeToken { 494 __typename 495 token 496 used 497 expiresAt 498 } 499 certCommonName 500 accessStrategy 501 additionalHeaders 502 additionalQueryParams 503 requestAuth { 504 csrf { 505 tokenEndpointURL 506 credential { 507 ... on BasicCredentialData { 508 username 509 password 510 } 511 ... on OAuthCredentialData { 512 clientId 513 clientSecret 514 url 515 } 516 ... on CertificateOAuthCredentialData { 517 clientId 518 certificate 519 url 520 } 521 } 522 additionalHeaders 523 additionalQueryParams 524 } 525 } 526 ` 527 } 528 529 // ForLabel missing godoc 530 func (fp *GqlFieldsProvider) ForLabel() string { 531 return `key 532 value` 533 } 534 535 // ForRuntime missing godoc 536 func (fp *GqlFieldsProvider) ForRuntime(ctx ...FieldCtx) string { 537 return addFieldsFromContext(fmt.Sprintf(` 538 id 539 name 540 description 541 applicationNamespace 542 labels 543 status {condition timestamp} 544 metadata { creationTimestamp } 545 auths {%s} 546 runtimeContexts {%s} 547 webhooks {%s} 548 eventingConfiguration { defaultURL }`, fp.ForSystemAuth(), fp.Page(fp.ForRuntimeContext()), fp.ForWebhooks()), ctx, []string{"Runtime.runtimeContext"}) 549 } 550 551 // ForRuntimeContext missing godoc 552 func (fp *GqlFieldsProvider) ForRuntimeContext() string { 553 return `id 554 key 555 value 556 labels` 557 } 558 559 // ForApplicationLabel missing godoc 560 func (fp *GqlFieldsProvider) ForApplicationLabel() string { 561 return ` 562 key 563 value` 564 } 565 566 // ForLabelDefinition missing godoc 567 func (fp *GqlFieldsProvider) ForLabelDefinition() string { 568 return ` 569 key 570 schema` 571 } 572 573 // ForOneTimeTokenForApplication missing godoc 574 func (fp *GqlFieldsProvider) ForOneTimeTokenForApplication() string { 575 return ` 576 token 577 connectorURL 578 raw 579 rawEncoded 580 legacyConnectorURL` 581 } 582 583 // ForOneTimeTokenForRuntime missing godoc 584 func (fp *GqlFieldsProvider) ForOneTimeTokenForRuntime() string { 585 return ` 586 token 587 connectorURL 588 raw 589 rawEncoded` 590 } 591 592 // ForIntegrationSystem missing godoc 593 func (fp *GqlFieldsProvider) ForIntegrationSystem() string { 594 return fmt.Sprintf(` 595 id 596 name 597 description 598 auths {%s}`, fp.ForSystemAuth()) 599 } 600 601 // ForPlaceholders missing godoc 602 func (fp *GqlFieldsProvider) ForPlaceholders() string { 603 return ` 604 name 605 description 606 jsonPath` 607 } 608 609 // ForEventingConfiguration missing godoc 610 func (fp *GqlFieldsProvider) ForEventingConfiguration() string { 611 return ` 612 defaultURL` 613 } 614 615 // ForViewer missing godoc 616 func (fp *GqlFieldsProvider) ForViewer() string { 617 return ` 618 id 619 type` 620 } 621 622 // OmitForTenant missing godoc 623 func (fp *GqlFieldsProvider) OmitForTenant(omittedProperties []string) string { 624 return buildProperties(map[string]string{ 625 "id": "id", 626 "internalID": "internalID", 627 "name": "name", 628 "initialized": "initialized", 629 "labels": fmt.Sprintf("labels {%s}", fp.ForLabel()), 630 }, omittedProperties) 631 } 632 633 // ForTenant missing godoc 634 func (fp *GqlFieldsProvider) ForTenant() string { 635 return ` 636 id 637 internalID 638 name 639 initialized 640 labels 641 parentID 642 type` 643 } 644 645 // OmitForBundle missing godoc 646 func (fp *GqlFieldsProvider) OmitForBundle(omittedProperties []string) string { 647 apiDefOmittedProperties := extractOmitFor(omittedProperties, "apiDefinitions") 648 eventDefOmittedProperties := extractOmitFor(omittedProperties, "eventDefinitions") 649 documentsOmittedProperties := extractOmitFor(omittedProperties, "documents") 650 instanceAuthsOmittedProperties := extractOmitFor(omittedProperties, "instanceAuths") 651 652 return buildProperties(map[string]string{ 653 "id": "id", 654 "name": "name", 655 "description": "description", 656 "instanceAuthRequestInputSchema": "instanceAuthRequestInputSchema", 657 "instanceAuths": fmt.Sprintf("instanceAuths {%s}", fp.OmitForBundleInstanceAuth(instanceAuthsOmittedProperties)), 658 "defaultInstanceAuth": fmt.Sprintf("defaultInstanceAuth {%s}", fp.ForAuth()), 659 "apiDefinitions": fmt.Sprintf("apiDefinitions {%s}", fp.Page(fp.OmitForAPIDefinition(apiDefOmittedProperties))), 660 "eventDefinitions": fmt.Sprintf("eventDefinitions {%s}", fp.Page(fp.OmitForEventDefinition(eventDefOmittedProperties))), 661 "documents": fmt.Sprintf("documents {%s}", fp.Page(fp.OmitForDocument(documentsOmittedProperties))), 662 }, omittedProperties) 663 } 664 665 // ForBundle missing godoc 666 func (fp *GqlFieldsProvider) ForBundle(ctx ...FieldCtx) string { 667 return addFieldsFromContext(fmt.Sprintf(` 668 id 669 name 670 description 671 instanceAuthRequestInputSchema 672 instanceAuths {%s} 673 defaultInstanceAuth {%s} 674 apiDefinitions {%s} 675 eventDefinitions {%s} 676 documents {%s}`, fp.ForBundleInstanceAuth(), fp.ForAuth(), fp.Page(fp.ForAPIDefinition(ctx...)), fp.Page(fp.ForEventDefinition()), fp.Page(fp.ForDocument())), 677 ctx, []string{"Bundle.instanceAuth"}) 678 } 679 680 // OmitForBundleInstanceAuth missing godoc 681 func (fp *GqlFieldsProvider) OmitForBundleInstanceAuth(omittedProperties []string) string { 682 statusOmittedProperties := extractOmitFor(omittedProperties, "status") 683 684 return buildProperties(map[string]string{ 685 "id": "id", 686 "context": "context", 687 "inputParams": "inputParams", 688 "auth": fmt.Sprintf("auth {%s}", fp.ForAuth()), 689 "status": fmt.Sprintf("status {%s}", fp.OmitForBundleInstanceAuthStatus(statusOmittedProperties)), 690 }, omittedProperties) 691 } 692 693 // ForBundleInstanceAuth missing godoc 694 func (fp *GqlFieldsProvider) ForBundleInstanceAuth() string { 695 return fmt.Sprintf(` 696 id 697 context 698 inputParams 699 auth {%s} 700 status {%s} 701 runtimeID 702 runtimeContextID`, fp.ForAuth(), fp.ForBundleInstanceAuthStatus()) 703 } 704 705 // OmitForBundleInstanceAuthStatus missing godoc 706 func (fp *GqlFieldsProvider) OmitForBundleInstanceAuthStatus(omittedProperties []string) string { 707 return buildProperties(map[string]string{ 708 "condition": "condition", 709 "timestamp": "timestamp", 710 "message": "message", 711 "reason": "reason", 712 }, omittedProperties) 713 } 714 715 // ForBundleInstanceAuthStatus missing godoc 716 func (fp *GqlFieldsProvider) ForBundleInstanceAuthStatus() string { 717 return ` 718 condition 719 timestamp 720 message 721 reason` 722 } 723 724 // ForAutomaticScenarioAssignment missing godoc 725 func (fp *GqlFieldsProvider) ForAutomaticScenarioAssignment() string { 726 return fmt.Sprintf(` 727 scenarioName 728 selector {%s}`, fp.ForLabel()) 729 } 730 731 // ForCertificateSubjectMapping returns certificate subject mappings fields 732 func (fp *GqlFieldsProvider) ForCertificateSubjectMapping() string { 733 return ` 734 id 735 subject 736 consumerType 737 internalConsumerID 738 tenantAccessLevels 739 ` 740 } 741 742 // ForTenantAccess returns tenant access fields 743 func (fp *GqlFieldsProvider) ForTenantAccess() string { 744 return ` 745 tenantID 746 resourceID 747 resourceType 748 owner 749 ` 750 }