From 6935038383ffbf7b83c5f7a3912a0cdd89024fea Mon Sep 17 00:00:00 2001 From: speakeasybot Date: Tue, 7 May 2024 00:17:53 +0000 Subject: [PATCH] ci: regenerated with OpenAPI Doc 1.0.0, Speakeasy CLI 1.280.1 --- .speakeasy/gen.lock | 113 ++-- README.md | 2 +- RELEASES.md | 10 +- docs/index.md | 2 +- docs/resources/journey.md | 6 + examples/provider/provider.tf | 2 +- .../epilot-journey_journey/import.sh | 1 + .../epilot-journey_journey/resource.tf | 39 +- gen.yaml | 6 +- go.mod | 40 +- go.sum | 70 ++- internal/provider/journey_data_source.go | 23 +- internal/provider/journey_data_source_sdk.go | 257 ++++---- internal/provider/journey_resource.go | 24 +- internal/provider/journey_resource_sdk.go | 279 +++++---- internal/provider/provider.go | 4 +- internal/provider/reflect/helpers.go | 2 +- internal/provider/reflect/options.go | 9 + internal/provider/reflect/struct.go | 14 +- .../journey_creation_request_v2_button.go} | 2 +- .../journey_creation_request_v2_design.go} | 2 +- ...rney_creation_request_v2_embed_options.go} | 2 +- .../journey_creation_request_v2_logics.go} | 2 +- .../journey_creation_request_v2_rules.go} | 2 +- .../journey_creation_request_v2_settings.go} | 2 +- .../journey_creation_request_v2_steps.go} | 2 +- internal/provider/utils.go | 15 +- internal/sdk/.gitattributes | 2 + internal/sdk/.gitignore | 1 + internal/sdk/internal/hooks/hooks.go | 144 +++++ internal/sdk/internal/hooks/registration.go | 15 + .../{pkg => internal}/utils/contenttype.go | 0 internal/sdk/{pkg => internal}/utils/form.go | 2 +- .../sdk/{pkg => internal}/utils/headers.go | 27 +- internal/sdk/{pkg => internal}/utils/json.go | 78 ++- .../sdk/{pkg => internal}/utils/pathparams.go | 46 +- .../{pkg => internal}/utils/queryparams.go | 54 +- .../{pkg => internal}/utils/requestbody.go | 15 +- .../sdk/{pkg => internal}/utils/retries.go | 0 .../sdk/{pkg => internal}/utils/security.go | 136 ++-- internal/sdk/{pkg => internal}/utils/utils.go | 89 ++- internal/sdk/journeys.go | 592 +++++++++++++----- internal/sdk/journeysv2.go | 378 ++++++++--- .../sdkerrors => models/errors}/sdkerror.go | 2 +- .../models/operations/createjourney.go | 2 +- .../models/operations/createjourneyv2.go | 2 +- .../{pkg => }/models/operations/getjourney.go | 2 +- .../models/operations/getjourneyproducts.go | 2 +- .../models/operations/getjourneysbyorgid.go | 2 +- .../models/operations/getjourneyv2.go | 2 +- .../{pkg => }/models/operations/options.go | 2 +- .../models/operations/patchupdatejourney.go | 2 +- .../models/operations/patchupdatejourneyv2.go | 2 +- .../models/operations/removejourney.go | 0 .../models/operations/removejourneyv2.go | 0 .../models/operations/searchjourneys.go | 2 +- .../models/operations/updatejourney.go | 2 +- .../models/operations/updatejourneyv2.go | 2 +- .../models/shared/getjourneysresponse.go | 0 .../sdk/{pkg => }/models/shared/journey.go | 2 +- .../models/shared/journeycreationrequest.go | 2 +- .../models/shared/journeycreationrequestv2.go | 0 .../models/shared/journeyproductsresponse.go | 0 .../models/shared/journeyresponse.go | 0 .../shared/patchupdatejourneyrequest.go | 2 +- .../shared/searchjourneysqueryrequest.go | 2 +- .../models/shared/searchjourneysresponse.go | 2 +- .../sdk/{pkg => }/models/shared/security.go | 0 internal/sdk/sdk.go | 36 +- internal/sdk/{pkg => }/types/bigint.go | 0 internal/sdk/{pkg => }/types/date.go | 0 internal/sdk/{pkg => }/types/datetime.go | 0 internal/sdk/{pkg => }/types/decimal.go | 0 internal/sdk/{pkg => }/types/pointers.go | 0 internal/validators/DateValidator.go | 2 +- main.go | 2 +- 76 files changed, 1729 insertions(+), 858 deletions(-) create mode 100644 examples/resources/epilot-journey_journey/import.sh rename internal/provider/{type_journey_creation_request_v2_button.go => types/journey_creation_request_v2_button.go} (93%) rename internal/provider/{type_journey_creation_request_v2_design.go => types/journey_creation_request_v2_design.go} (94%) rename internal/provider/{type_journey_creation_request_v2_embed_options.go => types/journey_creation_request_v2_embed_options.go} (97%) rename internal/provider/{type_journey_creation_request_v2_logics.go => types/journey_creation_request_v2_logics.go} (95%) rename internal/provider/{type_journey_creation_request_v2_rules.go => types/journey_creation_request_v2_rules.go} (95%) rename internal/provider/{type_journey_creation_request_v2_settings.go => types/journey_creation_request_v2_settings.go} (98%) rename internal/provider/{type_journey_creation_request_v2_steps.go => types/journey_creation_request_v2_steps.go} (97%) create mode 100644 internal/sdk/.gitattributes create mode 100644 internal/sdk/.gitignore create mode 100644 internal/sdk/internal/hooks/hooks.go create mode 100644 internal/sdk/internal/hooks/registration.go rename internal/sdk/{pkg => internal}/utils/contenttype.go (100%) rename internal/sdk/{pkg => internal}/utils/form.go (99%) rename internal/sdk/{pkg => internal}/utils/headers.go (72%) rename internal/sdk/{pkg => internal}/utils/json.go (89%) rename internal/sdk/{pkg => internal}/utils/pathparams.go (73%) rename internal/sdk/{pkg => internal}/utils/queryparams.go (71%) rename internal/sdk/{pkg => internal}/utils/requestbody.go (93%) rename internal/sdk/{pkg => internal}/utils/retries.go (100%) rename internal/sdk/{pkg => internal}/utils/security.go (63%) rename internal/sdk/{pkg => internal}/utils/utils.go (64%) rename internal/sdk/{pkg/models/sdkerrors => models/errors}/sdkerror.go (97%) rename internal/sdk/{pkg => }/models/operations/createjourney.go (98%) rename internal/sdk/{pkg => }/models/operations/createjourneyv2.go (97%) rename internal/sdk/{pkg => }/models/operations/getjourney.go (98%) rename internal/sdk/{pkg => }/models/operations/getjourneyproducts.go (98%) rename internal/sdk/{pkg => }/models/operations/getjourneysbyorgid.go (98%) rename internal/sdk/{pkg => }/models/operations/getjourneyv2.go (97%) rename internal/sdk/{pkg => }/models/operations/options.go (99%) rename internal/sdk/{pkg => }/models/operations/patchupdatejourney.go (97%) rename internal/sdk/{pkg => }/models/operations/patchupdatejourneyv2.go (97%) rename internal/sdk/{pkg => }/models/operations/removejourney.go (100%) rename internal/sdk/{pkg => }/models/operations/removejourneyv2.go (100%) rename internal/sdk/{pkg => }/models/operations/searchjourneys.go (97%) rename internal/sdk/{pkg => }/models/operations/updatejourney.go (97%) rename internal/sdk/{pkg => }/models/operations/updatejourneyv2.go (97%) rename internal/sdk/{pkg => }/models/shared/getjourneysresponse.go (100%) rename internal/sdk/{pkg => }/models/shared/journey.go (99%) rename internal/sdk/{pkg => }/models/shared/journeycreationrequest.go (99%) rename internal/sdk/{pkg => }/models/shared/journeycreationrequestv2.go (100%) rename internal/sdk/{pkg => }/models/shared/journeyproductsresponse.go (100%) rename internal/sdk/{pkg => }/models/shared/journeyresponse.go (100%) rename internal/sdk/{pkg => }/models/shared/patchupdatejourneyrequest.go (97%) rename internal/sdk/{pkg => }/models/shared/searchjourneysqueryrequest.go (98%) rename internal/sdk/{pkg => }/models/shared/searchjourneysresponse.go (99%) rename internal/sdk/{pkg => }/models/shared/security.go (100%) rename internal/sdk/{pkg => }/types/bigint.go (100%) rename internal/sdk/{pkg => }/types/date.go (100%) rename internal/sdk/{pkg => }/types/datetime.go (100%) rename internal/sdk/{pkg => }/types/decimal.go (100%) rename internal/sdk/{pkg => }/types/pointers.go (100%) diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index fc89587..64e3538 100755 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -3,25 +3,69 @@ id: 1afd37bc-cea9-4679-ac40-35ad5de414fc management: docChecksum: 25eb21ef4a0c170c431dedb3401afc84 docVersion: 1.0.0 - speakeasyVersion: internal - generationVersion: 2.230.1 - releaseVersion: 0.2.7 - configChecksum: ba1909901d42d5999d4327d01df604d8 + speakeasyVersion: 1.280.1 + generationVersion: 2.322.5 + releaseVersion: 0.3.0 + configChecksum: 91220056e36a4832e4098a1240151a7a repoURL: https://github.com/epilot-dev/terraform-provider-epilot-journey.git repoSubDirectory: . published: true features: terraform: additionalProperties: 0.1.2 - constsAndDefaults: 0.1.2 - core: 3.8.1 - globalSecurity: 2.81.2 + constsAndDefaults: 0.1.4 + core: 3.19.1 + globalSecurity: 2.81.6 globalServerURLs: 2.82.1 retries: 2.81.1 generatedFiles: - internal/sdk/journeys.go - internal/sdk/journeysv2.go - internal/sdk/sdk.go + - internal/sdk/models/errors/sdkerror.go + - internal/sdk/types/bigint.go + - internal/sdk/types/date.go + - internal/sdk/types/datetime.go + - internal/sdk/types/decimal.go + - internal/sdk/types/pointers.go + - internal/sdk/internal/utils/contenttype.go + - internal/sdk/internal/utils/form.go + - internal/sdk/internal/utils/headers.go + - internal/sdk/internal/utils/json.go + - internal/sdk/internal/utils/pathparams.go + - internal/sdk/internal/utils/queryparams.go + - internal/sdk/internal/utils/requestbody.go + - internal/sdk/internal/utils/retries.go + - internal/sdk/internal/utils/security.go + - internal/sdk/internal/utils/utils.go + - internal/sdk/models/operations/createjourney.go + - internal/sdk/models/operations/getjourney.go + - internal/sdk/models/operations/getjourneyproducts.go + - internal/sdk/models/operations/getjourneysbyorgid.go + - internal/sdk/models/operations/patchupdatejourney.go + - internal/sdk/models/operations/removejourney.go + - internal/sdk/models/operations/searchjourneys.go + - internal/sdk/models/operations/updatejourney.go + - internal/sdk/models/operations/createjourneyv2.go + - internal/sdk/models/operations/getjourneyv2.go + - internal/sdk/models/operations/patchupdatejourneyv2.go + - internal/sdk/models/operations/removejourneyv2.go + - internal/sdk/models/operations/updatejourneyv2.go + - internal/sdk/models/shared/journey.go + - internal/sdk/models/shared/journeycreationrequest.go + - internal/sdk/models/shared/journeyproductsresponse.go + - internal/sdk/models/shared/getjourneysresponse.go + - internal/sdk/models/shared/journeyresponse.go + - internal/sdk/models/shared/patchupdatejourneyrequest.go + - internal/sdk/models/shared/searchjourneysresponse.go + - internal/sdk/models/shared/searchjourneysqueryrequest.go + - internal/sdk/models/shared/journeycreationrequestv2.go + - internal/sdk/models/shared/security.go + - internal/sdk/.gitignore + - internal/sdk/models/operations/options.go + - internal/sdk/.gitattributes + - internal/sdk/internal/hooks/registration.go + - internal/sdk/internal/hooks/hooks.go - examples/README.md - go.mod - go.sum @@ -50,22 +94,6 @@ generatedFiles: - internal/provider/reflect/slice.go - internal/provider/reflect/struct.go - internal/provider/utils.go - - internal/sdk/pkg/models/sdkerrors/sdkerror.go - - internal/sdk/pkg/types/bigint.go - - internal/sdk/pkg/types/date.go - - internal/sdk/pkg/types/datetime.go - - internal/sdk/pkg/types/decimal.go - - internal/sdk/pkg/types/pointers.go - - internal/sdk/pkg/utils/contenttype.go - - internal/sdk/pkg/utils/form.go - - internal/sdk/pkg/utils/headers.go - - internal/sdk/pkg/utils/json.go - - internal/sdk/pkg/utils/pathparams.go - - internal/sdk/pkg/utils/queryparams.go - - internal/sdk/pkg/utils/requestbody.go - - internal/sdk/pkg/utils/retries.go - - internal/sdk/pkg/utils/security.go - - internal/sdk/pkg/utils/utils.go - internal/validators/DateValidator.go - internal/validators/ExactlyOneChild.go - internal/validators/JSONParseValidator.go @@ -82,44 +110,21 @@ generatedFiles: - main.go - terraform-registry-manifest.json - tools/tools.go - - internal/sdk/pkg/models/operations/createjourney.go - - internal/sdk/pkg/models/operations/getjourney.go - - internal/sdk/pkg/models/operations/getjourneyproducts.go - - internal/sdk/pkg/models/operations/getjourneysbyorgid.go - - internal/sdk/pkg/models/operations/patchupdatejourney.go - - internal/sdk/pkg/models/operations/removejourney.go - - internal/sdk/pkg/models/operations/searchjourneys.go - - internal/sdk/pkg/models/operations/updatejourney.go - - internal/sdk/pkg/models/operations/createjourneyv2.go - - internal/sdk/pkg/models/operations/getjourneyv2.go - - internal/sdk/pkg/models/operations/patchupdatejourneyv2.go - - internal/sdk/pkg/models/operations/removejourneyv2.go - - internal/sdk/pkg/models/operations/updatejourneyv2.go - - internal/sdk/pkg/models/shared/journey.go - - internal/sdk/pkg/models/shared/journeycreationrequest.go - - internal/sdk/pkg/models/shared/journeyproductsresponse.go - - internal/sdk/pkg/models/shared/getjourneysresponse.go - - internal/sdk/pkg/models/shared/journeyresponse.go - - internal/sdk/pkg/models/shared/patchupdatejourneyrequest.go - - internal/sdk/pkg/models/shared/searchjourneysresponse.go - - internal/sdk/pkg/models/shared/searchjourneysqueryrequest.go - - internal/sdk/pkg/models/shared/journeycreationrequestv2.go - - internal/sdk/pkg/models/shared/security.go - - internal/provider/type_journey_creation_request_v2_design.go - - internal/provider/type_journey_creation_request_v2_logics.go - - internal/provider/type_journey_creation_request_v2_rules.go - - internal/provider/type_journey_creation_request_v2_button.go - - internal/provider/type_journey_creation_request_v2_embed_options.go - - internal/provider/type_journey_creation_request_v2_settings.go - - internal/provider/type_journey_creation_request_v2_steps.go + - internal/provider/types/journey_creation_request_v2_design.go + - internal/provider/types/journey_creation_request_v2_logics.go + - internal/provider/types/journey_creation_request_v2_rules.go + - internal/provider/types/journey_creation_request_v2_button.go + - internal/provider/types/journey_creation_request_v2_embed_options.go + - internal/provider/types/journey_creation_request_v2_settings.go + - internal/provider/types/journey_creation_request_v2_steps.go - USAGE.md - internal/provider/provider.go - examples/provider/provider.tf + - examples/resources/epilot-journey_journey/import.sh - internal/provider/journey_resource.go - internal/provider/journey_resource_sdk.go - examples/resources/epilot-journey_journey/resource.tf - internal/provider/journey_data_source.go - internal/provider/journey_data_source_sdk.go - examples/data-sources/epilot-journey_journey/data-source.tf - - internal/sdk/pkg/models/operations/options.go - .gitattributes diff --git a/README.md b/README.md index 5b86f46..2e73125 100755 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ terraform { required_providers { epilot-journey = { source = "epilot-dev/epilot-journey" - version = "0.2.7" + version = "0.3.0" } } } diff --git a/RELEASES.md b/RELEASES.md index 22a7ee6..2468e57 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -30,4 +30,12 @@ Based on: - OpenAPI Doc 1.0.0 - Speakeasy CLI 1.147.0 (2.237.2) https://github.com/speakeasy-api/speakeasy ### Generated -- [terraform v0.2.3] . \ No newline at end of file +- [terraform v0.2.3] . + +## 2024-05-07 00:17:08 +### Changes +Based on: +- OpenAPI Doc 1.0.0 +- Speakeasy CLI 1.280.1 (2.322.5) https://github.com/speakeasy-api/speakeasy +### Generated +- [terraform v0.3.0] . \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 98897c4..f15ad37 100644 --- a/docs/index.md +++ b/docs/index.md @@ -17,7 +17,7 @@ terraform { required_providers { epilot-journey = { source = "epilot-dev/epilot-journey" - version = "0.2.7" + version = "0.3.0" } } } diff --git a/docs/resources/journey.md b/docs/resources/journey.md index 79de396..cfa68e3 100644 --- a/docs/resources/journey.md +++ b/docs/resources/journey.md @@ -137,4 +137,10 @@ Optional: - `align` (String) must be one of ["left", "center", "right"] - `text` (String) +## Import +Import is supported using the following syntax: + +```shell +terraform import epilot-journey_journey.my_epilot-journey_journey "509cdffe-424f-457a-95c2-9708c304ce77" +``` diff --git a/examples/provider/provider.tf b/examples/provider/provider.tf index f7ff17c..f620392 100644 --- a/examples/provider/provider.tf +++ b/examples/provider/provider.tf @@ -2,7 +2,7 @@ terraform { required_providers { epilot-journey = { source = "epilot-dev/epilot-journey" - version = "0.2.7" + version = "0.3.0" } } } diff --git a/examples/resources/epilot-journey_journey/import.sh b/examples/resources/epilot-journey_journey/import.sh new file mode 100644 index 0000000..831d2c1 --- /dev/null +++ b/examples/resources/epilot-journey_journey/import.sh @@ -0,0 +1 @@ +terraform import epilot-journey_journey.my_epilot-journey_journey "509cdffe-424f-457a-95c2-9708c304ce77" diff --git a/examples/resources/epilot-journey_journey/resource.tf b/examples/resources/epilot-journey_journey/resource.tf index 5c1abe9..4d3b2d9 100644 --- a/examples/resources/epilot-journey_journey/resource.tf +++ b/examples/resources/epilot-journey_journey/resource.tf @@ -1,21 +1,20 @@ resource "epilot-journey_journey" "my_journey" { - # brand_id = "...my_brand_id..." - # journey_id = "...my_journey_id..." - # name = "Dianne Kiehn" - # skip_automation = true - # steps = [ - # { - # hide_next_button = false - # name = "Pearl Ondricka" - # schema = "{ \"see\": \"documentation\" }" - # show_step_name = true - # show_stepper = true - # show_stepper_labels = true - # show_step_subtitle = true - # step_id = "...my_step_id..." - # sub_title = "...my_sub_title..." - # title = "Ms." - # uischema = "{ \"see\": \"documentation\" }" - # }, - # ] -} \ No newline at end of file + brand_id = "...my_brand_id..." + journey_id = "...my_journey_id..." + name = "Dianne Kiehn" + steps = [ + { + hide_next_button = false + name = "Pearl Ondricka" + schema = "{ \"see\": \"documentation\" }" + show_step_name = true + show_stepper = true + show_stepper_labels = true + show_step_subtitle = true + step_id = "...my_step_id..." + sub_title = "...my_sub_title..." + title = "Ms." + uischema = "{ \"see\": \"documentation\" }" + }, + ] +} \ No newline at end of file diff --git a/gen.yaml b/gen.yaml index c48ae08..be88791 100755 --- a/gen.yaml +++ b/gen.yaml @@ -5,10 +5,14 @@ generation: optionalPropertyRendering: withExample fixes: nameResolutionDec2023: false + parameterOrderingFeb2024: false + requestResponseComponentNamesFeb2024: false + auth: + oAuth2ClientCredentialsEnabled: false sdkFlattening: true telemetryEnabled: false terraform: - version: 0.2.7 + version: 0.3.0 author: epilot-dev imports: option: openapi diff --git a/go.mod b/go.mod index 053ee95..51e47d9 100644 --- a/go.mod +++ b/go.mod @@ -1,13 +1,16 @@ module github.com/epilot-dev/terraform-provider-epilot-journey -go 1.18 +go 1.21 + +toolchain go1.21.9 require ( github.com/cenkalti/backoff/v4 v4.2.0 github.com/ericlagergren/decimal v0.0.0-20221120152707-495c53812d05 - github.com/hashicorp/terraform-plugin-framework v1.3.5 - github.com/hashicorp/terraform-plugin-go v0.18.0 - github.com/spyzhov/ajson v0.9.0 + github.com/hashicorp/terraform-plugin-docs v0.13.0 + github.com/hashicorp/terraform-plugin-framework v1.7.0 + github.com/hashicorp/terraform-plugin-framework-validators v0.10.0 + github.com/hashicorp/terraform-plugin-go v0.22.1 ) require ( @@ -19,21 +22,22 @@ require ( github.com/bgentry/speakeasy v0.1.0 // indirect github.com/fatih/color v1.13.0 // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/google/uuid v1.3.0 // indirect + github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-checkpoint v0.5.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.5.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/go-plugin v1.4.10 // indirect + github.com/hashicorp/go-plugin v1.6.0 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/hc-install v0.4.0 // indirect github.com/hashicorp/terraform-exec v0.17.2 // indirect github.com/hashicorp/terraform-json v0.14.0 // indirect github.com/hashicorp/terraform-plugin-log v0.9.0 // indirect - github.com/hashicorp/terraform-registry-address v0.2.1 // indirect + github.com/hashicorp/terraform-registry-address v0.2.3 // indirect github.com/hashicorp/terraform-svchost v0.1.1 // indirect + github.com/hashicorp/yamux v0.1.1 // indirect github.com/huandu/xstrings v1.3.2 // indirect github.com/imdario/mergo v0.3.13 // indirect github.com/mattn/go-colorable v0.1.12 // indirect @@ -47,20 +51,14 @@ require ( github.com/russross/blackfriday v1.6.0 // indirect github.com/shopspring/decimal v1.3.1 // indirect github.com/spf13/cast v1.5.0 // indirect - github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect + github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect github.com/zclconf/go-cty v1.13.1 // indirect - golang.org/x/crypto v0.10.0 // indirect - golang.org/x/net v0.11.0 // indirect - golang.org/x/sys v0.9.0 // indirect - golang.org/x/text v0.10.0 // indirect - google.golang.org/grpc v1.56.1 // indirect - google.golang.org/protobuf v1.31.0 // indirect -) - -require ( - github.com/hashicorp/terraform-plugin-docs v0.13.0 - github.com/hashicorp/terraform-plugin-framework-validators v0.10.0 - github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d // indirect - google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect + golang.org/x/crypto v0.18.0 // indirect + golang.org/x/net v0.20.0 // indirect + golang.org/x/sys v0.16.0 // indirect + golang.org/x/text v0.14.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/grpc v1.62.1 // indirect + google.golang.org/protobuf v1.33.0 // indirect ) diff --git a/go.sum b/go.sum index 853448b..417aa41 100644 --- a/go.sum +++ b/go.sum @@ -23,6 +23,8 @@ github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgI github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= +github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4= github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -38,6 +40,7 @@ github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= @@ -57,11 +60,12 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -75,8 +79,8 @@ github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVH github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-plugin v1.4.10 h1:xUbmA4jC6Dq163/fWcp8P3JuHilrHHMLNRxzGQJ9hNk= -github.com/hashicorp/go-plugin v1.4.10/go.mod h1:6/1TEzT0eQznvI/gV2CM29DLSkAK/e58mUWKVsPaph0= +github.com/hashicorp/go-plugin v1.6.0 h1:wgd4KxHJTVGGqWBq4QPB1i5BZNEx9BR8+OFmHDmTk8A= +github.com/hashicorp/go-plugin v1.6.0/go.mod h1:lBS5MtSSBZk0SHc66KACcjjlU6WzEVP/8pwz68aMkCI= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -91,20 +95,20 @@ github.com/hashicorp/terraform-json v0.14.0 h1:sh9iZ1Y8IFJLx+xQiKHGud6/TSUCM0N8e github.com/hashicorp/terraform-json v0.14.0/go.mod h1:5A9HIWPkk4e5aeeXIBbkcOvaZbIYnAIkEyqP2pNSckM= github.com/hashicorp/terraform-plugin-docs v0.13.0 h1:6e+VIWsVGb6jYJewfzq2ok2smPzZrt1Wlm9koLeKazY= github.com/hashicorp/terraform-plugin-docs v0.13.0/go.mod h1:W0oCmHAjIlTHBbvtppWHe8fLfZ2BznQbuv8+UD8OucQ= -github.com/hashicorp/terraform-plugin-framework v1.3.5 h1:FJ6s3CVWVAxlhiF/jhy6hzs4AnPHiflsp9KgzTGl1wo= -github.com/hashicorp/terraform-plugin-framework v1.3.5/go.mod h1:2gGDpWiTI0irr9NSTLFAKlTi6KwGti3AoU19rFqU30o= +github.com/hashicorp/terraform-plugin-framework v1.7.0 h1:wOULbVmfONnJo9iq7/q+iBOBJul5vRovaYJIu2cY/Pw= +github.com/hashicorp/terraform-plugin-framework v1.7.0/go.mod h1:jY9Id+3KbZ17OMpulgnWLSfwxNVYSoYBQFTgsx044CI= github.com/hashicorp/terraform-plugin-framework-validators v0.10.0 h1:4L0tmy/8esP6OcvocVymw52lY0HyQ5OxB7VNl7k4bS0= github.com/hashicorp/terraform-plugin-framework-validators v0.10.0/go.mod h1:qdQJCdimB9JeX2YwOpItEu+IrfoJjWQ5PhLpAOMDQAE= -github.com/hashicorp/terraform-plugin-go v0.18.0 h1:IwTkOS9cOW1ehLd/rG0y+u/TGLK9y6fGoBjXVUquzpE= -github.com/hashicorp/terraform-plugin-go v0.18.0/go.mod h1:l7VK+2u5Kf2y+A+742GX0ouLut3gttudmvMgN0PA74Y= +github.com/hashicorp/terraform-plugin-go v0.22.1 h1:iTS7WHNVrn7uhe3cojtvWWn83cm2Z6ryIUDTRO0EV7w= +github.com/hashicorp/terraform-plugin-go v0.22.1/go.mod h1:qrjnqRghvQ6KnDbB12XeZ4FluclYwptntoWCr9QaXTI= github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0= github.com/hashicorp/terraform-plugin-log v0.9.0/go.mod h1:rKL8egZQ/eXSyDqzLUuwUYLVdlYeamldAHSxjUFADow= -github.com/hashicorp/terraform-registry-address v0.2.1 h1:QuTf6oJ1+WSflJw6WYOHhLgwUiQ0FrROpHPYFtwTYWM= -github.com/hashicorp/terraform-registry-address v0.2.1/go.mod h1:BSE9fIFzp0qWsJUUyGquo4ldV9k2n+psif6NYkBRS3Y= +github.com/hashicorp/terraform-registry-address v0.2.3 h1:2TAiKJ1A3MAkZlH1YI/aTVcLZRu7JseiXNRHbOAyoTI= +github.com/hashicorp/terraform-registry-address v0.2.3/go.mod h1:lFHA76T8jfQteVfT7caREqguFrW3c4MFSPhZB7HHgUM= github.com/hashicorp/terraform-svchost v0.1.1 h1:EZZimZ1GxdqFRinZ1tpJwVxxt49xc/S52uzrw4x0jKQ= github.com/hashicorp/terraform-svchost v0.1.1/go.mod h1:mNsjQfZyf/Jhz35v6/0LWcv26+X7JPS+buii2c9/ctc= -github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d h1:kJCB4vdITiW1eC1vq2e6IsrXKrZit1bv/TDYFGMp4BQ= -github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= @@ -115,13 +119,15 @@ github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= -github.com/jhump/protoreflect v1.6.0 h1:h5jfMVslIg6l29nsMs0D8Wj17RDVdNYti0vDN/PZZoE= +github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= +github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck= github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -159,11 +165,13 @@ github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndr github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= github.com/sebdah/goldie v1.0.0/go.mod h1:jXP4hmWywNEwZzhMuv2ccnqTSFpuq8iyQhtQdkkZBH4= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -171,8 +179,6 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spyzhov/ajson v0.9.0 h1:tF46gJGOenYVj+k9K1U1XpCxVWhmiyY5PsVCAs1+OJ0= -github.com/spyzhov/ajson v0.9.0/go.mod h1:a6oSw0MMb7Z5aD2tPoPO+jq11ETKgXUr2XktHdT8Wt8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= @@ -185,8 +191,8 @@ github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8 github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= -github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= -github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= +github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= @@ -204,16 +210,16 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= +golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= -golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU= -golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= +golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -231,27 +237,27 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= -golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= -google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= -google.golang.org/grpc v1.56.1 h1:z0dNfjIl0VpaZ9iSVjA6daGatAYwPGstTjt5vkRMFkQ= -google.golang.org/grpc v1.56.1/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 h1:AjyfHzEPEFp/NpvfN5g+KDla3EMojjhRVZc1i7cj+oM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80/go.mod h1:PAREbraiVEVGVdTZsVWjSbbTtSyGbAgIIvni8a8CD5s= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internal/provider/journey_data_source.go b/internal/provider/journey_data_source.go index 0339e14..7f9fc42 100644 --- a/internal/provider/journey_data_source.go +++ b/internal/provider/journey_data_source.go @@ -5,8 +5,9 @@ package provider import ( "context" "fmt" + tfTypes "github.com/epilot-dev/terraform-provider-epilot-journey/internal/provider/types" "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/operations" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/operations" "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/datasource/schema" "github.com/hashicorp/terraform-plugin-framework/types" @@ -28,14 +29,14 @@ type JourneyDataSource struct { // JourneyDataSourceModel describes the data model. type JourneyDataSourceModel struct { - BrandID types.String `tfsdk:"brand_id"` - Design *JourneyCreationRequestV2Design `tfsdk:"design"` - JourneyID types.String `tfsdk:"journey_id"` - Logics []JourneyCreationRequestV2Logics `tfsdk:"logics"` - Name types.String `tfsdk:"name"` - Rules []JourneyCreationRequestV2Rules `tfsdk:"rules"` - Settings *JourneyCreationRequestV2Settings `tfsdk:"settings"` - Steps []JourneyCreationRequestV2Steps `tfsdk:"steps"` + BrandID types.String `tfsdk:"brand_id"` + Design *tfTypes.JourneyCreationRequestV2Design `tfsdk:"design"` + JourneyID types.String `tfsdk:"journey_id"` + Logics []tfTypes.JourneyCreationRequestV2Logics `tfsdk:"logics"` + Name types.String `tfsdk:"name"` + Rules []tfTypes.JourneyCreationRequestV2Rules `tfsdk:"rules"` + Settings *tfTypes.JourneyCreationRequestV2Settings `tfsdk:"settings"` + Steps []tfTypes.JourneyCreationRequestV2Steps `tfsdk:"steps"` } // Metadata returns the data source type name. @@ -282,6 +283,10 @@ func (r *JourneyDataSource) Read(ctx context.Context, req datasource.ReadRequest resp.Diagnostics.AddError("unexpected response from API", fmt.Sprintf("%v", res)) return } + if res.StatusCode == 404 { + resp.State.RemoveResource(ctx) + return + } if res.StatusCode != 200 { resp.Diagnostics.AddError(fmt.Sprintf("unexpected response from API. Got an unexpected response code %v", res.StatusCode), debugResponse(res.RawResponse)) return diff --git a/internal/provider/journey_data_source_sdk.go b/internal/provider/journey_data_source_sdk.go index 220f194..7bafab9 100644 --- a/internal/provider/journey_data_source_sdk.go +++ b/internal/provider/journey_data_source_sdk.go @@ -4,152 +4,155 @@ package provider import ( "encoding/json" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/shared" + tfTypes "github.com/epilot-dev/terraform-provider-epilot-journey/internal/provider/types" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/shared" "github.com/hashicorp/terraform-plugin-framework/types" ) func (r *JourneyDataSourceModel) RefreshFromSharedJourneyCreationRequestV2(resp *shared.JourneyCreationRequestV2) { - r.BrandID = types.StringPointerValue(resp.BrandID) - if resp.Design == nil { - r.Design = nil - } else { - r.Design = &JourneyCreationRequestV2Design{} - r.Design.LogoURL = types.StringPointerValue(resp.Design.LogoURL) - if len(resp.Design.Theme) > 0 { - r.Design.Theme = make(map[string]types.String) - for key, value := range resp.Design.Theme { - result, _ := json.Marshal(value) - r.Design.Theme[key] = types.StringValue(string(result)) + if resp != nil { + r.BrandID = types.StringPointerValue(resp.BrandID) + if resp.Design == nil { + r.Design = nil + } else { + r.Design = &tfTypes.JourneyCreationRequestV2Design{} + r.Design.LogoURL = types.StringPointerValue(resp.Design.LogoURL) + if len(resp.Design.Theme) > 0 { + r.Design.Theme = make(map[string]types.String) + for key, value := range resp.Design.Theme { + result, _ := json.Marshal(value) + r.Design.Theme[key] = types.StringValue(string(result)) + } } } - } - r.JourneyID = types.StringPointerValue(resp.JourneyID) - if len(r.Logics) > len(resp.Logics) { - r.Logics = r.Logics[:len(resp.Logics)] - } - for logicsCount, logicsItem := range resp.Logics { - var logics1 JourneyCreationRequestV2Logics - logics1.Actions = nil - for _, v := range logicsItem.Actions { - logics1.Actions = append(logics1.Actions, types.StringValue(v)) + r.JourneyID = types.StringPointerValue(resp.JourneyID) + if len(r.Logics) > len(resp.Logics) { + r.Logics = r.Logics[:len(resp.Logics)] } - logics1.AutoGeneratedID = types.StringPointerValue(logicsItem.AutoGeneratedID) - logics1.Conditions = nil - for _, v := range logicsItem.Conditions { - logics1.Conditions = append(logics1.Conditions, types.StringValue(v)) + for logicsCount, logicsItem := range resp.Logics { + var logics1 tfTypes.JourneyCreationRequestV2Logics + logics1.Actions = []types.String{} + for _, v := range logicsItem.Actions { + logics1.Actions = append(logics1.Actions, types.StringValue(v)) + } + logics1.AutoGeneratedID = types.StringPointerValue(logicsItem.AutoGeneratedID) + logics1.Conditions = []types.String{} + for _, v := range logicsItem.Conditions { + logics1.Conditions = append(logics1.Conditions, types.StringValue(v)) + } + if logicsCount+1 > len(r.Logics) { + r.Logics = append(r.Logics, logics1) + } else { + r.Logics[logicsCount].Actions = logics1.Actions + r.Logics[logicsCount].AutoGeneratedID = logics1.AutoGeneratedID + r.Logics[logicsCount].Conditions = logics1.Conditions + } } - if logicsCount+1 > len(r.Logics) { - r.Logics = append(r.Logics, logics1) - } else { - r.Logics[logicsCount].Actions = logics1.Actions - r.Logics[logicsCount].AutoGeneratedID = logics1.AutoGeneratedID - r.Logics[logicsCount].Conditions = logics1.Conditions + r.Name = types.StringValue(resp.Name) + if len(r.Rules) > len(resp.Rules) { + r.Rules = r.Rules[:len(resp.Rules)] } - } - r.Name = types.StringValue(resp.Name) - if len(r.Rules) > len(resp.Rules) { - r.Rules = r.Rules[:len(resp.Rules)] - } - for rulesCount, rulesItem := range resp.Rules { - var rules1 JourneyCreationRequestV2Rules - rules1.Source = types.StringValue(rulesItem.Source) - rules1.SourceType = types.StringValue(string(rulesItem.SourceType)) - rules1.Target = types.StringValue(rulesItem.Target) - rules1.Type = types.StringValue(string(rulesItem.Type)) - if rulesCount+1 > len(r.Rules) { - r.Rules = append(r.Rules, rules1) - } else { - r.Rules[rulesCount].Source = rules1.Source - r.Rules[rulesCount].SourceType = rules1.SourceType - r.Rules[rulesCount].Target = rules1.Target - r.Rules[rulesCount].Type = rules1.Type + for rulesCount, rulesItem := range resp.Rules { + var rules1 tfTypes.JourneyCreationRequestV2Rules + rules1.Source = types.StringValue(rulesItem.Source) + rules1.SourceType = types.StringValue(string(rulesItem.SourceType)) + rules1.Target = types.StringValue(rulesItem.Target) + rules1.Type = types.StringValue(string(rulesItem.Type)) + if rulesCount+1 > len(r.Rules) { + r.Rules = append(r.Rules, rules1) + } else { + r.Rules[rulesCount].Source = rules1.Source + r.Rules[rulesCount].SourceType = rules1.SourceType + r.Rules[rulesCount].Target = rules1.Target + r.Rules[rulesCount].Type = rules1.Type + } } - } - if resp.Settings == nil { - r.Settings = nil - } else { - r.Settings = &JourneyCreationRequestV2Settings{} - r.Settings.AddressSuggestionsFileURL = types.StringPointerValue(resp.Settings.AddressSuggestionsFileURL) - r.Settings.Description = types.StringPointerValue(resp.Settings.Description) - r.Settings.DesignID = types.StringPointerValue(resp.Settings.DesignID) - if resp.Settings.EmbedOptions == nil { - r.Settings.EmbedOptions = nil + if resp.Settings == nil { + r.Settings = nil } else { - r.Settings.EmbedOptions = &JourneyCreationRequestV2EmbedOptions{} - if resp.Settings.EmbedOptions.Button == nil { - r.Settings.EmbedOptions.Button = nil + r.Settings = &tfTypes.JourneyCreationRequestV2Settings{} + r.Settings.AddressSuggestionsFileURL = types.StringPointerValue(resp.Settings.AddressSuggestionsFileURL) + r.Settings.Description = types.StringPointerValue(resp.Settings.Description) + r.Settings.DesignID = types.StringPointerValue(resp.Settings.DesignID) + if resp.Settings.EmbedOptions == nil { + r.Settings.EmbedOptions = nil } else { - r.Settings.EmbedOptions.Button = &JourneyCreationRequestV2Button{} - if resp.Settings.EmbedOptions.Button.Align != nil { - r.Settings.EmbedOptions.Button.Align = types.StringValue(string(*resp.Settings.EmbedOptions.Button.Align)) + r.Settings.EmbedOptions = &tfTypes.JourneyCreationRequestV2EmbedOptions{} + if resp.Settings.EmbedOptions.Button == nil { + r.Settings.EmbedOptions.Button = nil } else { - r.Settings.EmbedOptions.Button.Align = types.StringNull() + r.Settings.EmbedOptions.Button = &tfTypes.JourneyCreationRequestV2Button{} + if resp.Settings.EmbedOptions.Button.Align != nil { + r.Settings.EmbedOptions.Button.Align = types.StringValue(string(*resp.Settings.EmbedOptions.Button.Align)) + } else { + r.Settings.EmbedOptions.Button.Align = types.StringNull() + } + r.Settings.EmbedOptions.Button.Text = types.StringPointerValue(resp.Settings.EmbedOptions.Button.Text) } - r.Settings.EmbedOptions.Button.Text = types.StringPointerValue(resp.Settings.EmbedOptions.Button.Text) + if resp.Settings.EmbedOptions.Lang != nil { + r.Settings.EmbedOptions.Lang = types.StringValue(string(*resp.Settings.EmbedOptions.Lang)) + } else { + r.Settings.EmbedOptions.Lang = types.StringNull() + } + if resp.Settings.EmbedOptions.Mode != nil { + r.Settings.EmbedOptions.Mode = types.StringValue(string(*resp.Settings.EmbedOptions.Mode)) + } else { + r.Settings.EmbedOptions.Mode = types.StringNull() + } + r.Settings.EmbedOptions.ScrollToTop = types.BoolPointerValue(resp.Settings.EmbedOptions.ScrollToTop) + r.Settings.EmbedOptions.TopBar = types.BoolPointerValue(resp.Settings.EmbedOptions.TopBar) + r.Settings.EmbedOptions.Width = types.StringPointerValue(resp.Settings.EmbedOptions.Width) } - if resp.Settings.EmbedOptions.Lang != nil { - r.Settings.EmbedOptions.Lang = types.StringValue(string(*resp.Settings.EmbedOptions.Lang)) - } else { - r.Settings.EmbedOptions.Lang = types.StringNull() + r.Settings.EntityTags = []types.String{} + for _, v := range resp.Settings.EntityTags { + r.Settings.EntityTags = append(r.Settings.EntityTags, types.StringValue(v)) } - if resp.Settings.EmbedOptions.Mode != nil { - r.Settings.EmbedOptions.Mode = types.StringValue(string(*resp.Settings.EmbedOptions.Mode)) - } else { - r.Settings.EmbedOptions.Mode = types.StringNull() + r.Settings.FilePurposes = []types.String{} + for _, v := range resp.Settings.FilePurposes { + r.Settings.FilePurposes = append(r.Settings.FilePurposes, types.StringValue(v)) } - r.Settings.EmbedOptions.ScrollToTop = types.BoolPointerValue(resp.Settings.EmbedOptions.ScrollToTop) - r.Settings.EmbedOptions.TopBar = types.BoolPointerValue(resp.Settings.EmbedOptions.TopBar) - r.Settings.EmbedOptions.Width = types.StringPointerValue(resp.Settings.EmbedOptions.Width) - } - r.Settings.EntityTags = nil - for _, v := range resp.Settings.EntityTags { - r.Settings.EntityTags = append(r.Settings.EntityTags, types.StringValue(v)) - } - r.Settings.FilePurposes = nil - for _, v := range resp.Settings.FilePurposes { - r.Settings.FilePurposes = append(r.Settings.FilePurposes, types.StringValue(v)) + r.Settings.MappingsAutomationID = types.StringPointerValue(resp.Settings.MappingsAutomationID) + r.Settings.RuntimeEntities = []types.String{} + for _, v := range resp.Settings.RuntimeEntities { + r.Settings.RuntimeEntities = append(r.Settings.RuntimeEntities, types.StringValue(string(v))) + } + r.Settings.SafeModeAutomation = types.BoolPointerValue(resp.Settings.SafeModeAutomation) + r.Settings.TargetedCustomer = types.StringPointerValue(resp.Settings.TargetedCustomer) + r.Settings.TemplateID = types.StringPointerValue(resp.Settings.TemplateID) } - r.Settings.MappingsAutomationID = types.StringPointerValue(resp.Settings.MappingsAutomationID) - r.Settings.RuntimeEntities = nil - for _, v := range resp.Settings.RuntimeEntities { - r.Settings.RuntimeEntities = append(r.Settings.RuntimeEntities, types.StringValue(string(v))) + if len(r.Steps) > len(resp.Steps) { + r.Steps = r.Steps[:len(resp.Steps)] } - r.Settings.SafeModeAutomation = types.BoolPointerValue(resp.Settings.SafeModeAutomation) - r.Settings.TargetedCustomer = types.StringPointerValue(resp.Settings.TargetedCustomer) - r.Settings.TemplateID = types.StringPointerValue(resp.Settings.TemplateID) - } - if len(r.Steps) > len(resp.Steps) { - r.Steps = r.Steps[:len(resp.Steps)] - } - for stepsCount, stepsItem := range resp.Steps { - var steps1 JourneyCreationRequestV2Steps - steps1.HideNextButton = types.BoolPointerValue(stepsItem.HideNextButton) - steps1.Name = types.StringValue(stepsItem.Name) - schemaResult, _ := json.Marshal(stepsItem.Schema) - steps1.Schema = types.StringValue(string(schemaResult)) - steps1.ShowStepName = types.BoolPointerValue(stepsItem.ShowStepName) - steps1.ShowStepper = types.BoolPointerValue(stepsItem.ShowStepper) - steps1.ShowStepperLabels = types.BoolPointerValue(stepsItem.ShowStepperLabels) - steps1.ShowStepSubtitle = types.BoolPointerValue(stepsItem.ShowStepSubtitle) - steps1.StepID = types.StringPointerValue(stepsItem.StepID) - steps1.SubTitle = types.StringPointerValue(stepsItem.SubTitle) - steps1.Title = types.StringPointerValue(stepsItem.Title) - uischemaResult, _ := json.Marshal(stepsItem.Uischema) - steps1.Uischema = types.StringValue(string(uischemaResult)) - if stepsCount+1 > len(r.Steps) { - r.Steps = append(r.Steps, steps1) - } else { - r.Steps[stepsCount].HideNextButton = steps1.HideNextButton - r.Steps[stepsCount].Name = steps1.Name - r.Steps[stepsCount].Schema = steps1.Schema - r.Steps[stepsCount].ShowStepName = steps1.ShowStepName - r.Steps[stepsCount].ShowStepper = steps1.ShowStepper - r.Steps[stepsCount].ShowStepperLabels = steps1.ShowStepperLabels - r.Steps[stepsCount].ShowStepSubtitle = steps1.ShowStepSubtitle - r.Steps[stepsCount].StepID = steps1.StepID - r.Steps[stepsCount].SubTitle = steps1.SubTitle - r.Steps[stepsCount].Title = steps1.Title - r.Steps[stepsCount].Uischema = steps1.Uischema + for stepsCount, stepsItem := range resp.Steps { + var steps1 tfTypes.JourneyCreationRequestV2Steps + steps1.HideNextButton = types.BoolPointerValue(stepsItem.HideNextButton) + steps1.Name = types.StringValue(stepsItem.Name) + schemaResult, _ := json.Marshal(stepsItem.Schema) + steps1.Schema = types.StringValue(string(schemaResult)) + steps1.ShowStepName = types.BoolPointerValue(stepsItem.ShowStepName) + steps1.ShowStepper = types.BoolPointerValue(stepsItem.ShowStepper) + steps1.ShowStepperLabels = types.BoolPointerValue(stepsItem.ShowStepperLabels) + steps1.ShowStepSubtitle = types.BoolPointerValue(stepsItem.ShowStepSubtitle) + steps1.StepID = types.StringPointerValue(stepsItem.StepID) + steps1.SubTitle = types.StringPointerValue(stepsItem.SubTitle) + steps1.Title = types.StringPointerValue(stepsItem.Title) + uischemaResult, _ := json.Marshal(stepsItem.Uischema) + steps1.Uischema = types.StringValue(string(uischemaResult)) + if stepsCount+1 > len(r.Steps) { + r.Steps = append(r.Steps, steps1) + } else { + r.Steps[stepsCount].HideNextButton = steps1.HideNextButton + r.Steps[stepsCount].Name = steps1.Name + r.Steps[stepsCount].Schema = steps1.Schema + r.Steps[stepsCount].ShowStepName = steps1.ShowStepName + r.Steps[stepsCount].ShowStepper = steps1.ShowStepper + r.Steps[stepsCount].ShowStepperLabels = steps1.ShowStepperLabels + r.Steps[stepsCount].ShowStepSubtitle = steps1.ShowStepSubtitle + r.Steps[stepsCount].StepID = steps1.StepID + r.Steps[stepsCount].SubTitle = steps1.SubTitle + r.Steps[stepsCount].Title = steps1.Title + r.Steps[stepsCount].Uischema = steps1.Uischema + } } } } diff --git a/internal/provider/journey_resource.go b/internal/provider/journey_resource.go index a280f9a..e511e53 100644 --- a/internal/provider/journey_resource.go +++ b/internal/provider/journey_resource.go @@ -5,8 +5,9 @@ package provider import ( "context" "fmt" + tfTypes "github.com/epilot-dev/terraform-provider-epilot-journey/internal/provider/types" "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/operations" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/operations" "github.com/epilot-dev/terraform-provider-epilot-journey/internal/validators" speakeasy_listvalidators "github.com/epilot-dev/terraform-provider-epilot-journey/internal/validators/listvalidators" speakeasy_stringvalidators "github.com/epilot-dev/terraform-provider-epilot-journey/internal/validators/stringvalidators" @@ -35,14 +36,14 @@ type JourneyResource struct { // JourneyResourceModel describes the resource data model. type JourneyResourceModel struct { - BrandID types.String `tfsdk:"brand_id"` - Design *JourneyCreationRequestV2Design `tfsdk:"design"` - JourneyID types.String `tfsdk:"journey_id"` - Logics []JourneyCreationRequestV2Logics `tfsdk:"logics"` - Name types.String `tfsdk:"name"` - Rules []JourneyCreationRequestV2Rules `tfsdk:"rules"` - Settings *JourneyCreationRequestV2Settings `tfsdk:"settings"` - Steps []JourneyCreationRequestV2Steps `tfsdk:"steps"` + BrandID types.String `tfsdk:"brand_id"` + Design *tfTypes.JourneyCreationRequestV2Design `tfsdk:"design"` + JourneyID types.String `tfsdk:"journey_id"` + Logics []tfTypes.JourneyCreationRequestV2Logics `tfsdk:"logics"` + Name types.String `tfsdk:"name"` + Rules []tfTypes.JourneyCreationRequestV2Rules `tfsdk:"rules"` + Settings *tfTypes.JourneyCreationRequestV2Settings `tfsdk:"settings"` + Steps []tfTypes.JourneyCreationRequestV2Steps `tfsdk:"steps"` } func (r *JourneyResource) Metadata(ctx context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) { @@ -52,7 +53,6 @@ func (r *JourneyResource) Metadata(ctx context.Context, req resource.MetadataReq func (r *JourneyResource) Schema(ctx context.Context, req resource.SchemaRequest, resp *resource.SchemaResponse) { resp.Schema = schema.Schema{ MarkdownDescription: "Journey Resource", - Attributes: map[string]schema.Attribute{ "brand_id": schema.StringAttribute{ Computed: true, @@ -444,6 +444,10 @@ func (r *JourneyResource) Read(ctx context.Context, req resource.ReadRequest, re resp.Diagnostics.AddError("unexpected response from API", fmt.Sprintf("%v", res)) return } + if res.StatusCode == 404 { + resp.State.RemoveResource(ctx) + return + } if res.StatusCode != 200 { resp.Diagnostics.AddError(fmt.Sprintf("unexpected response from API. Got an unexpected response code %v", res.StatusCode), debugResponse(res.RawResponse)) return diff --git a/internal/provider/journey_resource_sdk.go b/internal/provider/journey_resource_sdk.go index 1caa9ff..15adeee 100644 --- a/internal/provider/journey_resource_sdk.go +++ b/internal/provider/journey_resource_sdk.go @@ -4,7 +4,8 @@ package provider import ( "encoding/json" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/shared" + tfTypes "github.com/epilot-dev/terraform-provider-epilot-journey/internal/provider/types" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/shared" "github.com/hashicorp/terraform-plugin-framework/types" ) @@ -40,9 +41,9 @@ func (r *JourneyResourceModel) ToSharedJourneyCreationRequestV2() *shared.Journe } else { journeyID = nil } - var logics []shared.JourneyCreationRequestV2Logics = nil + var logics []shared.JourneyCreationRequestV2Logics = []shared.JourneyCreationRequestV2Logics{} for _, logicsItem := range r.Logics { - var actions []string = nil + var actions []string = []string{} for _, actionsItem := range logicsItem.Actions { actions = append(actions, actionsItem.ValueString()) } @@ -52,7 +53,7 @@ func (r *JourneyResourceModel) ToSharedJourneyCreationRequestV2() *shared.Journe } else { autoGeneratedID = nil } - var conditions []string = nil + var conditions []string = []string{} for _, conditionsItem := range logicsItem.Conditions { conditions = append(conditions, conditionsItem.ValueString()) } @@ -63,7 +64,7 @@ func (r *JourneyResourceModel) ToSharedJourneyCreationRequestV2() *shared.Journe }) } name := r.Name.ValueString() - var rules []shared.JourneyCreationRequestV2Rules = nil + var rules []shared.JourneyCreationRequestV2Rules = []shared.JourneyCreationRequestV2Rules{} for _, rulesItem := range r.Rules { source := rulesItem.Source.ValueString() sourceType := shared.JourneyCreationRequestV2SourceType(rulesItem.SourceType.ValueString()) @@ -156,11 +157,11 @@ func (r *JourneyResourceModel) ToSharedJourneyCreationRequestV2() *shared.Journe Width: width, } } - var entityTags []string = nil + var entityTags []string = []string{} for _, entityTagsItem := range r.Settings.EntityTags { entityTags = append(entityTags, entityTagsItem.ValueString()) } - var filePurposes []string = nil + var filePurposes []string = []string{} for _, filePurposesItem := range r.Settings.FilePurposes { filePurposes = append(filePurposes, filePurposesItem.ValueString()) } @@ -170,7 +171,7 @@ func (r *JourneyResourceModel) ToSharedJourneyCreationRequestV2() *shared.Journe } else { mappingsAutomationID = nil } - var runtimeEntities []shared.JourneyCreationRequestV2RuntimeEntities = nil + var runtimeEntities []shared.JourneyCreationRequestV2RuntimeEntities = []shared.JourneyCreationRequestV2RuntimeEntities{} for _, runtimeEntitiesItem := range r.Settings.RuntimeEntities { runtimeEntities = append(runtimeEntities, shared.JourneyCreationRequestV2RuntimeEntities(runtimeEntitiesItem.ValueString())) } @@ -206,7 +207,7 @@ func (r *JourneyResourceModel) ToSharedJourneyCreationRequestV2() *shared.Journe TemplateID: templateID, } } - var steps []shared.JourneyCreationRequestV2Steps = nil + var steps []shared.JourneyCreationRequestV2Steps = []shared.JourneyCreationRequestV2Steps{} for _, stepsItem := range r.Steps { hideNextButton := new(bool) if !stepsItem.HideNextButton.IsUnknown() && !stepsItem.HideNextButton.IsNull() { @@ -289,147 +290,149 @@ func (r *JourneyResourceModel) ToSharedJourneyCreationRequestV2() *shared.Journe } func (r *JourneyResourceModel) RefreshFromSharedJourneyCreationRequestV2(resp *shared.JourneyCreationRequestV2) { - r.BrandID = types.StringPointerValue(resp.BrandID) - if resp.Design == nil { - r.Design = nil - } else { - r.Design = &JourneyCreationRequestV2Design{} - r.Design.LogoURL = types.StringPointerValue(resp.Design.LogoURL) - if len(resp.Design.Theme) > 0 { - r.Design.Theme = make(map[string]types.String) - for key, value := range resp.Design.Theme { - result, _ := json.Marshal(value) - r.Design.Theme[key] = types.StringValue(string(result)) + if resp != nil { + r.BrandID = types.StringPointerValue(resp.BrandID) + if resp.Design == nil { + r.Design = nil + } else { + r.Design = &tfTypes.JourneyCreationRequestV2Design{} + r.Design.LogoURL = types.StringPointerValue(resp.Design.LogoURL) + if len(resp.Design.Theme) > 0 { + r.Design.Theme = make(map[string]types.String) + for key, value := range resp.Design.Theme { + result, _ := json.Marshal(value) + r.Design.Theme[key] = types.StringValue(string(result)) + } } } - } - r.JourneyID = types.StringPointerValue(resp.JourneyID) - if len(r.Logics) > len(resp.Logics) { - r.Logics = r.Logics[:len(resp.Logics)] - } - for logicsCount, logicsItem := range resp.Logics { - var logics1 JourneyCreationRequestV2Logics - logics1.Actions = nil - for _, v := range logicsItem.Actions { - logics1.Actions = append(logics1.Actions, types.StringValue(v)) - } - logics1.AutoGeneratedID = types.StringPointerValue(logicsItem.AutoGeneratedID) - logics1.Conditions = nil - for _, v := range logicsItem.Conditions { - logics1.Conditions = append(logics1.Conditions, types.StringValue(v)) - } - if logicsCount+1 > len(r.Logics) { - r.Logics = append(r.Logics, logics1) - } else { - r.Logics[logicsCount].Actions = logics1.Actions - r.Logics[logicsCount].AutoGeneratedID = logics1.AutoGeneratedID - r.Logics[logicsCount].Conditions = logics1.Conditions + r.JourneyID = types.StringPointerValue(resp.JourneyID) + if len(r.Logics) > len(resp.Logics) { + r.Logics = r.Logics[:len(resp.Logics)] } - } - r.Name = types.StringValue(resp.Name) - if len(r.Rules) > len(resp.Rules) { - r.Rules = r.Rules[:len(resp.Rules)] - } - for rulesCount, rulesItem := range resp.Rules { - var rules1 JourneyCreationRequestV2Rules - rules1.Source = types.StringValue(rulesItem.Source) - rules1.SourceType = types.StringValue(string(rulesItem.SourceType)) - rules1.Target = types.StringValue(rulesItem.Target) - rules1.Type = types.StringValue(string(rulesItem.Type)) - if rulesCount+1 > len(r.Rules) { - r.Rules = append(r.Rules, rules1) - } else { - r.Rules[rulesCount].Source = rules1.Source - r.Rules[rulesCount].SourceType = rules1.SourceType - r.Rules[rulesCount].Target = rules1.Target - r.Rules[rulesCount].Type = rules1.Type + for logicsCount, logicsItem := range resp.Logics { + var logics1 tfTypes.JourneyCreationRequestV2Logics + logics1.Actions = []types.String{} + for _, v := range logicsItem.Actions { + logics1.Actions = append(logics1.Actions, types.StringValue(v)) + } + logics1.AutoGeneratedID = types.StringPointerValue(logicsItem.AutoGeneratedID) + logics1.Conditions = []types.String{} + for _, v := range logicsItem.Conditions { + logics1.Conditions = append(logics1.Conditions, types.StringValue(v)) + } + if logicsCount+1 > len(r.Logics) { + r.Logics = append(r.Logics, logics1) + } else { + r.Logics[logicsCount].Actions = logics1.Actions + r.Logics[logicsCount].AutoGeneratedID = logics1.AutoGeneratedID + r.Logics[logicsCount].Conditions = logics1.Conditions + } } - } - if resp.Settings == nil { - r.Settings = nil - } else { - r.Settings = &JourneyCreationRequestV2Settings{} - r.Settings.AddressSuggestionsFileURL = types.StringPointerValue(resp.Settings.AddressSuggestionsFileURL) - r.Settings.Description = types.StringPointerValue(resp.Settings.Description) - r.Settings.DesignID = types.StringPointerValue(resp.Settings.DesignID) - if resp.Settings.EmbedOptions == nil { - r.Settings.EmbedOptions = nil + r.Name = types.StringValue(resp.Name) + if len(r.Rules) > len(resp.Rules) { + r.Rules = r.Rules[:len(resp.Rules)] + } + for rulesCount, rulesItem := range resp.Rules { + var rules1 tfTypes.JourneyCreationRequestV2Rules + rules1.Source = types.StringValue(rulesItem.Source) + rules1.SourceType = types.StringValue(string(rulesItem.SourceType)) + rules1.Target = types.StringValue(rulesItem.Target) + rules1.Type = types.StringValue(string(rulesItem.Type)) + if rulesCount+1 > len(r.Rules) { + r.Rules = append(r.Rules, rules1) + } else { + r.Rules[rulesCount].Source = rules1.Source + r.Rules[rulesCount].SourceType = rules1.SourceType + r.Rules[rulesCount].Target = rules1.Target + r.Rules[rulesCount].Type = rules1.Type + } + } + if resp.Settings == nil { + r.Settings = nil } else { - r.Settings.EmbedOptions = &JourneyCreationRequestV2EmbedOptions{} - if resp.Settings.EmbedOptions.Button == nil { - r.Settings.EmbedOptions.Button = nil + r.Settings = &tfTypes.JourneyCreationRequestV2Settings{} + r.Settings.AddressSuggestionsFileURL = types.StringPointerValue(resp.Settings.AddressSuggestionsFileURL) + r.Settings.Description = types.StringPointerValue(resp.Settings.Description) + r.Settings.DesignID = types.StringPointerValue(resp.Settings.DesignID) + if resp.Settings.EmbedOptions == nil { + r.Settings.EmbedOptions = nil } else { - r.Settings.EmbedOptions.Button = &JourneyCreationRequestV2Button{} - if resp.Settings.EmbedOptions.Button.Align != nil { - r.Settings.EmbedOptions.Button.Align = types.StringValue(string(*resp.Settings.EmbedOptions.Button.Align)) + r.Settings.EmbedOptions = &tfTypes.JourneyCreationRequestV2EmbedOptions{} + if resp.Settings.EmbedOptions.Button == nil { + r.Settings.EmbedOptions.Button = nil + } else { + r.Settings.EmbedOptions.Button = &tfTypes.JourneyCreationRequestV2Button{} + if resp.Settings.EmbedOptions.Button.Align != nil { + r.Settings.EmbedOptions.Button.Align = types.StringValue(string(*resp.Settings.EmbedOptions.Button.Align)) + } else { + r.Settings.EmbedOptions.Button.Align = types.StringNull() + } + r.Settings.EmbedOptions.Button.Text = types.StringPointerValue(resp.Settings.EmbedOptions.Button.Text) + } + if resp.Settings.EmbedOptions.Lang != nil { + r.Settings.EmbedOptions.Lang = types.StringValue(string(*resp.Settings.EmbedOptions.Lang)) + } else { + r.Settings.EmbedOptions.Lang = types.StringNull() + } + if resp.Settings.EmbedOptions.Mode != nil { + r.Settings.EmbedOptions.Mode = types.StringValue(string(*resp.Settings.EmbedOptions.Mode)) } else { - r.Settings.EmbedOptions.Button.Align = types.StringNull() + r.Settings.EmbedOptions.Mode = types.StringNull() } - r.Settings.EmbedOptions.Button.Text = types.StringPointerValue(resp.Settings.EmbedOptions.Button.Text) + r.Settings.EmbedOptions.ScrollToTop = types.BoolPointerValue(resp.Settings.EmbedOptions.ScrollToTop) + r.Settings.EmbedOptions.TopBar = types.BoolPointerValue(resp.Settings.EmbedOptions.TopBar) + r.Settings.EmbedOptions.Width = types.StringPointerValue(resp.Settings.EmbedOptions.Width) } - if resp.Settings.EmbedOptions.Lang != nil { - r.Settings.EmbedOptions.Lang = types.StringValue(string(*resp.Settings.EmbedOptions.Lang)) - } else { - r.Settings.EmbedOptions.Lang = types.StringNull() + r.Settings.EntityTags = []types.String{} + for _, v := range resp.Settings.EntityTags { + r.Settings.EntityTags = append(r.Settings.EntityTags, types.StringValue(v)) + } + r.Settings.FilePurposes = []types.String{} + for _, v := range resp.Settings.FilePurposes { + r.Settings.FilePurposes = append(r.Settings.FilePurposes, types.StringValue(v)) + } + r.Settings.MappingsAutomationID = types.StringPointerValue(resp.Settings.MappingsAutomationID) + r.Settings.RuntimeEntities = []types.String{} + for _, v := range resp.Settings.RuntimeEntities { + r.Settings.RuntimeEntities = append(r.Settings.RuntimeEntities, types.StringValue(string(v))) } - if resp.Settings.EmbedOptions.Mode != nil { - r.Settings.EmbedOptions.Mode = types.StringValue(string(*resp.Settings.EmbedOptions.Mode)) + r.Settings.SafeModeAutomation = types.BoolPointerValue(resp.Settings.SafeModeAutomation) + r.Settings.TargetedCustomer = types.StringPointerValue(resp.Settings.TargetedCustomer) + r.Settings.TemplateID = types.StringPointerValue(resp.Settings.TemplateID) + } + if len(r.Steps) > len(resp.Steps) { + r.Steps = r.Steps[:len(resp.Steps)] + } + for stepsCount, stepsItem := range resp.Steps { + var steps1 tfTypes.JourneyCreationRequestV2Steps + steps1.HideNextButton = types.BoolPointerValue(stepsItem.HideNextButton) + steps1.Name = types.StringValue(stepsItem.Name) + schemaResult, _ := json.Marshal(stepsItem.Schema) + steps1.Schema = types.StringValue(string(schemaResult)) + steps1.ShowStepName = types.BoolPointerValue(stepsItem.ShowStepName) + steps1.ShowStepper = types.BoolPointerValue(stepsItem.ShowStepper) + steps1.ShowStepperLabels = types.BoolPointerValue(stepsItem.ShowStepperLabels) + steps1.ShowStepSubtitle = types.BoolPointerValue(stepsItem.ShowStepSubtitle) + steps1.StepID = types.StringPointerValue(stepsItem.StepID) + steps1.SubTitle = types.StringPointerValue(stepsItem.SubTitle) + steps1.Title = types.StringPointerValue(stepsItem.Title) + uischemaResult, _ := json.Marshal(stepsItem.Uischema) + steps1.Uischema = types.StringValue(string(uischemaResult)) + if stepsCount+1 > len(r.Steps) { + r.Steps = append(r.Steps, steps1) } else { - r.Settings.EmbedOptions.Mode = types.StringNull() + r.Steps[stepsCount].HideNextButton = steps1.HideNextButton + r.Steps[stepsCount].Name = steps1.Name + r.Steps[stepsCount].Schema = steps1.Schema + r.Steps[stepsCount].ShowStepName = steps1.ShowStepName + r.Steps[stepsCount].ShowStepper = steps1.ShowStepper + r.Steps[stepsCount].ShowStepperLabels = steps1.ShowStepperLabels + r.Steps[stepsCount].ShowStepSubtitle = steps1.ShowStepSubtitle + r.Steps[stepsCount].StepID = steps1.StepID + r.Steps[stepsCount].SubTitle = steps1.SubTitle + r.Steps[stepsCount].Title = steps1.Title + r.Steps[stepsCount].Uischema = steps1.Uischema } - r.Settings.EmbedOptions.ScrollToTop = types.BoolPointerValue(resp.Settings.EmbedOptions.ScrollToTop) - r.Settings.EmbedOptions.TopBar = types.BoolPointerValue(resp.Settings.EmbedOptions.TopBar) - r.Settings.EmbedOptions.Width = types.StringPointerValue(resp.Settings.EmbedOptions.Width) - } - r.Settings.EntityTags = nil - for _, v := range resp.Settings.EntityTags { - r.Settings.EntityTags = append(r.Settings.EntityTags, types.StringValue(v)) - } - r.Settings.FilePurposes = nil - for _, v := range resp.Settings.FilePurposes { - r.Settings.FilePurposes = append(r.Settings.FilePurposes, types.StringValue(v)) - } - r.Settings.MappingsAutomationID = types.StringPointerValue(resp.Settings.MappingsAutomationID) - r.Settings.RuntimeEntities = nil - for _, v := range resp.Settings.RuntimeEntities { - r.Settings.RuntimeEntities = append(r.Settings.RuntimeEntities, types.StringValue(string(v))) - } - r.Settings.SafeModeAutomation = types.BoolPointerValue(resp.Settings.SafeModeAutomation) - r.Settings.TargetedCustomer = types.StringPointerValue(resp.Settings.TargetedCustomer) - r.Settings.TemplateID = types.StringPointerValue(resp.Settings.TemplateID) - } - if len(r.Steps) > len(resp.Steps) { - r.Steps = r.Steps[:len(resp.Steps)] - } - for stepsCount, stepsItem := range resp.Steps { - var steps1 JourneyCreationRequestV2Steps - steps1.HideNextButton = types.BoolPointerValue(stepsItem.HideNextButton) - steps1.Name = types.StringValue(stepsItem.Name) - schemaResult, _ := json.Marshal(stepsItem.Schema) - steps1.Schema = types.StringValue(string(schemaResult)) - steps1.ShowStepName = types.BoolPointerValue(stepsItem.ShowStepName) - steps1.ShowStepper = types.BoolPointerValue(stepsItem.ShowStepper) - steps1.ShowStepperLabels = types.BoolPointerValue(stepsItem.ShowStepperLabels) - steps1.ShowStepSubtitle = types.BoolPointerValue(stepsItem.ShowStepSubtitle) - steps1.StepID = types.StringPointerValue(stepsItem.StepID) - steps1.SubTitle = types.StringPointerValue(stepsItem.SubTitle) - steps1.Title = types.StringPointerValue(stepsItem.Title) - uischemaResult, _ := json.Marshal(stepsItem.Uischema) - steps1.Uischema = types.StringValue(string(uischemaResult)) - if stepsCount+1 > len(r.Steps) { - r.Steps = append(r.Steps, steps1) - } else { - r.Steps[stepsCount].HideNextButton = steps1.HideNextButton - r.Steps[stepsCount].Name = steps1.Name - r.Steps[stepsCount].Schema = steps1.Schema - r.Steps[stepsCount].ShowStepName = steps1.ShowStepName - r.Steps[stepsCount].ShowStepper = steps1.ShowStepper - r.Steps[stepsCount].ShowStepperLabels = steps1.ShowStepperLabels - r.Steps[stepsCount].ShowStepSubtitle = steps1.ShowStepSubtitle - r.Steps[stepsCount].StepID = steps1.StepID - r.Steps[stepsCount].SubTitle = steps1.SubTitle - r.Steps[stepsCount].Title = steps1.Title - r.Steps[stepsCount].Uischema = steps1.Uischema } } } diff --git a/internal/provider/provider.go b/internal/provider/provider.go index e9fcbf1..478477b 100644 --- a/internal/provider/provider.go +++ b/internal/provider/provider.go @@ -5,12 +5,13 @@ package provider import ( "context" "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/shared" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/shared" "github.com/hashicorp/terraform-plugin-framework/datasource" "github.com/hashicorp/terraform-plugin-framework/provider" "github.com/hashicorp/terraform-plugin-framework/provider/schema" "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/types" + "net/http" ) var _ provider.Provider = &EpilotJourneyProvider{} @@ -73,6 +74,7 @@ func (p *EpilotJourneyProvider) Configure(ctx context.Context, req provider.Conf opts := []sdk.SDKOption{ sdk.WithServerURL(ServerURL), sdk.WithSecurity(security), + sdk.WithClient(http.DefaultClient), } client := sdk.New(opts...) diff --git a/internal/provider/reflect/helpers.go b/internal/provider/reflect/helpers.go index 82b9515..42d19f2 100644 --- a/internal/provider/reflect/helpers.go +++ b/internal/provider/reflect/helpers.go @@ -46,7 +46,7 @@ func commaSeparatedString(in []string) string { // getStructTags returns a map of Terraform field names to their position in // the tags of the struct `in`. `in` must be a struct. -func getStructTags(_ context.Context, in reflect.Value, path path.Path) (map[string]int, error) { +func getStructTags(_ context.Context, in reflect.Value, path path.Path, opts Options) (map[string]int, error) { tags := map[string]int{} typ := trueReflectValue(in).Type() if typ.Kind() != reflect.Struct { diff --git a/internal/provider/reflect/options.go b/internal/provider/reflect/options.go index 490c5f1..d735aff 100644 --- a/internal/provider/reflect/options.go +++ b/internal/provider/reflect/options.go @@ -2,6 +2,11 @@ package reflect +const ( + SourceTypeState = iota + SourceTypePlan +) + // Options provides configuration settings for how the reflection behavior // works, letting callers tweak different behaviors based on their needs. type Options struct { @@ -19,4 +24,8 @@ type Options struct { // perfectly in the types they're being stored in, rather than // returning errors. Numbers will always be rounded towards 0. AllowRoundingNumbers bool + // SourceType informs the reflection system what the source is + // such that it can make decisions based on the tfPlanOnly annotation + // The default is SourceTypeState + SourceType int } diff --git a/internal/provider/reflect/struct.go b/internal/provider/reflect/struct.go index b670228..c730135 100644 --- a/internal/provider/reflect/struct.go +++ b/internal/provider/reflect/struct.go @@ -73,7 +73,7 @@ func Struct(ctx context.Context, typ attr.Type, object tftypes.Value, target ref // collect a map of fields that are defined in the tags of the struct // passed in - targetFields, err := getStructTags(ctx, target, path) + targetFields, err := getStructTags(ctx, target, path, opts) if err != nil { diags.Append(diag.WithPath(path, DiagIntoIncompatibleType{ Val: object, @@ -125,7 +125,8 @@ func Struct(ctx context.Context, typ attr.Type, object tftypes.Value, target ref } else { result = reflect.New(target.Type()).Elem() } - // Fork End + structType := trueReflectValue(target).Type() + for field, structFieldPos := range targetFields { attrType, ok := attrTypes[field] if !ok { @@ -136,6 +137,13 @@ func Struct(ctx context.Context, typ attr.Type, object tftypes.Value, target ref })) return target, diags } + + fieldReflected := structType.Field(structFieldPos) + if opts.SourceType == SourceTypeState && fieldReflected.Tag.Get(`tfPlanOnly`) == "true" { + // skip explicitly excluded fields + continue + } + // Fork End structField := result.Field(structFieldPos) fieldVal, fieldValDiags := BuildValue(ctx, attrType, objectFields[field], structField, opts, path.AtName(field)) diags.Append(fieldValDiags...) @@ -162,7 +170,7 @@ func FromStruct(ctx context.Context, typ attr.TypeWithAttributeTypes, val reflec // collect a map of fields that are defined in the tags of the struct // passed in - targetFields, err := getStructTags(ctx, val, path) + targetFields, err := getStructTags(ctx, val, path, Options{}) if err != nil { err = fmt.Errorf("error retrieving field names from struct tags: %w", err) diags.AddAttributeError( diff --git a/internal/provider/type_journey_creation_request_v2_button.go b/internal/provider/types/journey_creation_request_v2_button.go similarity index 93% rename from internal/provider/type_journey_creation_request_v2_button.go rename to internal/provider/types/journey_creation_request_v2_button.go index e763cce..8f803a9 100644 --- a/internal/provider/type_journey_creation_request_v2_button.go +++ b/internal/provider/types/journey_creation_request_v2_button.go @@ -1,6 +1,6 @@ // Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. -package provider +package types import "github.com/hashicorp/terraform-plugin-framework/types" diff --git a/internal/provider/type_journey_creation_request_v2_design.go b/internal/provider/types/journey_creation_request_v2_design.go similarity index 94% rename from internal/provider/type_journey_creation_request_v2_design.go rename to internal/provider/types/journey_creation_request_v2_design.go index 54e82c3..367cd77 100644 --- a/internal/provider/type_journey_creation_request_v2_design.go +++ b/internal/provider/types/journey_creation_request_v2_design.go @@ -1,6 +1,6 @@ // Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. -package provider +package types import "github.com/hashicorp/terraform-plugin-framework/types" diff --git a/internal/provider/type_journey_creation_request_v2_embed_options.go b/internal/provider/types/journey_creation_request_v2_embed_options.go similarity index 97% rename from internal/provider/type_journey_creation_request_v2_embed_options.go rename to internal/provider/types/journey_creation_request_v2_embed_options.go index 6353bdf..6950064 100644 --- a/internal/provider/type_journey_creation_request_v2_embed_options.go +++ b/internal/provider/types/journey_creation_request_v2_embed_options.go @@ -1,6 +1,6 @@ // Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. -package provider +package types import "github.com/hashicorp/terraform-plugin-framework/types" diff --git a/internal/provider/type_journey_creation_request_v2_logics.go b/internal/provider/types/journey_creation_request_v2_logics.go similarity index 95% rename from internal/provider/type_journey_creation_request_v2_logics.go rename to internal/provider/types/journey_creation_request_v2_logics.go index f88fb60..214801d 100644 --- a/internal/provider/type_journey_creation_request_v2_logics.go +++ b/internal/provider/types/journey_creation_request_v2_logics.go @@ -1,6 +1,6 @@ // Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. -package provider +package types import "github.com/hashicorp/terraform-plugin-framework/types" diff --git a/internal/provider/type_journey_creation_request_v2_rules.go b/internal/provider/types/journey_creation_request_v2_rules.go similarity index 95% rename from internal/provider/type_journey_creation_request_v2_rules.go rename to internal/provider/types/journey_creation_request_v2_rules.go index cae4b06..1ca3038 100644 --- a/internal/provider/type_journey_creation_request_v2_rules.go +++ b/internal/provider/types/journey_creation_request_v2_rules.go @@ -1,6 +1,6 @@ // Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. -package provider +package types import "github.com/hashicorp/terraform-plugin-framework/types" diff --git a/internal/provider/type_journey_creation_request_v2_settings.go b/internal/provider/types/journey_creation_request_v2_settings.go similarity index 98% rename from internal/provider/type_journey_creation_request_v2_settings.go rename to internal/provider/types/journey_creation_request_v2_settings.go index f2c643b..1c02585 100644 --- a/internal/provider/type_journey_creation_request_v2_settings.go +++ b/internal/provider/types/journey_creation_request_v2_settings.go @@ -1,6 +1,6 @@ // Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. -package provider +package types import "github.com/hashicorp/terraform-plugin-framework/types" diff --git a/internal/provider/type_journey_creation_request_v2_steps.go b/internal/provider/types/journey_creation_request_v2_steps.go similarity index 97% rename from internal/provider/type_journey_creation_request_v2_steps.go rename to internal/provider/types/journey_creation_request_v2_steps.go index f5952e6..82cc4ef 100644 --- a/internal/provider/type_journey_creation_request_v2_steps.go +++ b/internal/provider/types/journey_creation_request_v2_steps.go @@ -1,6 +1,6 @@ // Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. -package provider +package types import "github.com/hashicorp/terraform-plugin-framework/types" diff --git a/internal/provider/utils.go b/internal/provider/utils.go index 6d6b609..3303ecc 100644 --- a/internal/provider/utils.go +++ b/internal/provider/utils.go @@ -11,13 +11,15 @@ import ( "github.com/hashicorp/terraform-plugin-framework/path" "github.com/hashicorp/terraform-plugin-framework/resource" "github.com/hashicorp/terraform-plugin-framework/types" - "github.com/hashicorp/terraform-plugin-framework/types/basetypes" "net/http" "net/http/httputil" "reflect" ) func debugResponse(response *http.Response) string { + if v := response.Request.Header.Get("Authorization"); v != "" { + response.Request.Header.Set("Authorization", "(sensitive)") + } dumpReq, err := httputil.DumpRequest(response.Request, true) if err != nil { dumpReq, err = httputil.DumpRequest(response.Request, false) @@ -60,11 +62,15 @@ func merge(ctx context.Context, req resource.UpdateRequest, resp *resource.Updat if resp.Diagnostics.HasError() { return } - - resp.Diagnostics.Append(state.As(ctx, target, basetypes.ObjectAsOptions{ + val, err := state.ToTerraformValue(ctx) + if err != nil { + resp.Diagnostics.Append(diag.NewErrorDiagnostic("Object Conversion Error", "An unexpected error was encountered trying to convert object. This is always an error in the provider. Please report the following to the provider developer:\n\n"+err.Error())) + return + } + resp.Diagnostics.Append(tfReflect.Into(ctx, types.ObjectType{AttrTypes: state.AttributeTypes(ctx)}, val, target, tfReflect.Options{ UnhandledNullAsEmpty: true, UnhandledUnknownAsEmpty: true, - })...) + }, path.Empty())...) if resp.Diagnostics.HasError() { return } @@ -82,5 +88,6 @@ func refreshPlan(ctx context.Context, plan types.Object, target interface{}, dia diagnostics.Append(tfReflect.Into(ctx, obj, val, target, tfReflect.Options{ UnhandledNullAsEmpty: true, UnhandledUnknownAsEmpty: true, + SourceType: tfReflect.SourceTypePlan, }, path.Empty())...) } diff --git a/internal/sdk/.gitattributes b/internal/sdk/.gitattributes new file mode 100644 index 0000000..e6a9944 --- /dev/null +++ b/internal/sdk/.gitattributes @@ -0,0 +1,2 @@ +# This allows generated code to be indexed correctly +*.go linguist-generated=false \ No newline at end of file diff --git a/internal/sdk/.gitignore b/internal/sdk/.gitignore new file mode 100644 index 0000000..d3c2f59 --- /dev/null +++ b/internal/sdk/.gitignore @@ -0,0 +1 @@ +# .gitignore diff --git a/internal/sdk/internal/hooks/hooks.go b/internal/sdk/internal/hooks/hooks.go new file mode 100644 index 0000000..ee97182 --- /dev/null +++ b/internal/sdk/internal/hooks/hooks.go @@ -0,0 +1,144 @@ +// Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. + +package hooks + +import ( + "context" + "errors" + "net/http" +) + +type FailEarly struct { + Cause error +} + +var _ error = (*FailEarly)(nil) + +func (f *FailEarly) Error() string { + return f.Cause.Error() +} + +// HTTPClient provides an interface for supplying the SDK with a custom HTTP client +type HTTPClient interface { + Do(req *http.Request) (*http.Response, error) +} + +type HookContext struct { + Context context.Context + OperationID string + OAuth2Scopes []string + SecuritySource func(context.Context) (interface{}, error) +} + +type BeforeRequestContext struct { + HookContext +} + +type AfterSuccessContext struct { + HookContext +} + +type AfterErrorContext struct { + HookContext +} + +// sdkInitHook is called when the SDK is initializing. The hook can modify and return a new baseURL and HTTP client to be used by the SDK. +type sdkInitHook interface { + SDKInit(baseURL string, client HTTPClient) (string, HTTPClient) +} + +// beforeRequestHook is called before the SDK sends a request. The hook can modify the request before it is sent or return an error to stop the request from being sent. +type beforeRequestHook interface { + BeforeRequest(hookCtx BeforeRequestContext, req *http.Request) (*http.Request, error) +} + +// afterSuccessHook is called after the SDK receives a response. The hook can modify the response before it is handled or return an error to stop the response from being handled. +type afterSuccessHook interface { + AfterSuccess(hookCtx AfterSuccessContext, res *http.Response) (*http.Response, error) +} + +// afterErrorHook is called after the SDK encounters an error, or a non-successful response. The hook can modify the response if available otherwise modify the error. +// All afterErrorHook hooks are called and returning an error won't stop the other hooks from being called. But if you want to stop the other hooks from being called, you can return a FailEarly error wrapping your error. +type afterErrorHook interface { + AfterError(hookCtx AfterErrorContext, res *http.Response, err error) (*http.Response, error) +} + +type Hooks struct { + sdkInitHooks []sdkInitHook + beforeRequestHook []beforeRequestHook + afterSuccessHook []afterSuccessHook + afterErrorHook []afterErrorHook +} + +func New() *Hooks { + h := &Hooks{ + sdkInitHooks: []sdkInitHook{}, + beforeRequestHook: []beforeRequestHook{}, + afterSuccessHook: []afterSuccessHook{}, + afterErrorHook: []afterErrorHook{}, + } + + initHooks(h) + + return h +} + +// registerSDKInitHook registers a hook to be used by the SDK for the initialization event. +func (h *Hooks) registerSDKInitHook(hook sdkInitHook) { + h.sdkInitHooks = append(h.sdkInitHooks, hook) +} + +// registerBeforeRequestHook registers a hook to be used by the SDK for the before request event. +func (h *Hooks) registerBeforeRequestHook(hook beforeRequestHook) { + h.beforeRequestHook = append(h.beforeRequestHook, hook) +} + +// registerAfterSuccessHook registers a hook to be used by the SDK for the after success event. +func (h *Hooks) registerAfterSuccessHook(hook afterSuccessHook) { + h.afterSuccessHook = append(h.afterSuccessHook, hook) +} + +// registerAfterErrorHook registers a hook to be used by the SDK for the after error event. +func (h *Hooks) registerAfterErrorHook(hook afterErrorHook) { + h.afterErrorHook = append(h.afterErrorHook, hook) +} + +func (h *Hooks) SDKInit(baseURL string, client HTTPClient) (string, HTTPClient) { + for _, hook := range h.sdkInitHooks { + baseURL, client = hook.SDKInit(baseURL, client) + } + return baseURL, client +} + +func (h *Hooks) BeforeRequest(hookCtx BeforeRequestContext, req *http.Request) (*http.Request, error) { + for _, hook := range h.beforeRequestHook { + var err error + req, err = hook.BeforeRequest(hookCtx, req) + if err != nil { + return req, err + } + } + return req, nil +} + +func (h *Hooks) AfterSuccess(hookCtx AfterSuccessContext, res *http.Response) (*http.Response, error) { + for _, hook := range h.afterSuccessHook { + var err error + res, err = hook.AfterSuccess(hookCtx, res) + if err != nil { + return res, err + } + } + return res, nil +} + +func (h *Hooks) AfterError(hookCtx AfterErrorContext, res *http.Response, err error) (*http.Response, error) { + for _, hook := range h.afterErrorHook { + res, err = hook.AfterError(hookCtx, res, err) + var fe *FailEarly + if errors.As(err, &fe) { + return nil, fe.Cause + } + } + return res, err +} diff --git a/internal/sdk/internal/hooks/registration.go b/internal/sdk/internal/hooks/registration.go new file mode 100644 index 0000000..e68bf4c --- /dev/null +++ b/internal/sdk/internal/hooks/registration.go @@ -0,0 +1,15 @@ +// Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. + +package hooks + +/* + * This file is only ever generated once on the first generation and then is free to be modified. + * Any hooks you wish to add should be registered in the InitHooks function. Feel free to define them + * in this file or in separate files in the hooks package. + */ + +func initHooks(h *Hooks) { + // Add hooks by calling h.register{SDKInit/BeforeRequest/AfterSuccess/AfterError}Hook + // with an instance of a hook that implements that specific Hook interface + // Hooks are registered per SDK instance, and are valid for the lifetime of the SDK instance +} diff --git a/internal/sdk/pkg/utils/contenttype.go b/internal/sdk/internal/utils/contenttype.go similarity index 100% rename from internal/sdk/pkg/utils/contenttype.go rename to internal/sdk/internal/utils/contenttype.go diff --git a/internal/sdk/pkg/utils/form.go b/internal/sdk/internal/utils/form.go similarity index 99% rename from internal/sdk/pkg/utils/form.go rename to internal/sdk/internal/utils/form.go index 36cf249..f4f2f9c 100644 --- a/internal/sdk/pkg/utils/form.go +++ b/internal/sdk/internal/utils/form.go @@ -12,7 +12,7 @@ import ( "github.com/ericlagergren/decimal" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/types" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/types" ) func populateForm(paramName string, explode bool, objType reflect.Type, objValue reflect.Value, delimiter string, getFieldName func(reflect.StructField) string) url.Values { diff --git a/internal/sdk/pkg/utils/headers.go b/internal/sdk/internal/utils/headers.go similarity index 72% rename from internal/sdk/pkg/utils/headers.go rename to internal/sdk/internal/utils/headers.go index 0837022..0249876 100644 --- a/internal/sdk/pkg/utils/headers.go +++ b/internal/sdk/internal/utils/headers.go @@ -10,14 +10,35 @@ import ( "strings" ) -func PopulateHeaders(ctx context.Context, req *http.Request, headers interface{}) { +func PopulateHeaders(_ context.Context, req *http.Request, headers interface{}, globals interface{}) { + globalsAlreadyPopulated := populateHeaders(headers, globals, req.Header, []string{}) + if globals != nil { + _ = populateHeaders(globals, nil, req.Header, globalsAlreadyPopulated) + } +} + +func populateHeaders(headers interface{}, globals interface{}, reqHeaders http.Header, skipFields []string) []string { headerParamsStructType := reflect.TypeOf(headers) headerParamsValType := reflect.ValueOf(headers) + globalsAlreadyPopulated := []string{} + for i := 0; i < headerParamsStructType.NumField(); i++ { fieldType := headerParamsStructType.Field(i) valType := headerParamsValType.Field(i) + if contains(skipFields, fieldType.Name) { + continue + } + + if globals != nil { + var globalFound bool + fieldType, valType, globalFound = populateFromGlobals(fieldType, valType, headerParamTagKey, globals) + if globalFound { + globalsAlreadyPopulated = append(globalsAlreadyPopulated, fieldType.Name) + } + } + tag := parseParamTag(headerParamTagKey, fieldType, "simple", false) if tag == nil { continue @@ -25,9 +46,11 @@ func PopulateHeaders(ctx context.Context, req *http.Request, headers interface{} value := serializeHeader(fieldType.Type, valType, tag.Explode) if value != "" { - req.Header.Add(tag.ParamName, value) + reqHeaders.Add(tag.ParamName, value) } } + + return globalsAlreadyPopulated } func serializeHeader(objType reflect.Type, objValue reflect.Value, explode bool) string { diff --git a/internal/sdk/pkg/utils/json.go b/internal/sdk/internal/utils/json.go similarity index 89% rename from internal/sdk/pkg/utils/json.go rename to internal/sdk/internal/utils/json.go index e3fb2fe..bec164a 100644 --- a/internal/sdk/pkg/utils/json.go +++ b/internal/sdk/internal/utils/json.go @@ -8,11 +8,12 @@ import ( "fmt" "math/big" "reflect" + "strconv" "strings" "time" "unsafe" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/types" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/types" "github.com/ericlagergren/decimal" ) @@ -260,6 +261,18 @@ func marshalValue(v interface{}, tag reflect.StructTag) (json.RawMessage, error) typ, val := dereferencePointers(reflect.TypeOf(v), reflect.ValueOf(v)) switch typ.Kind() { + case reflect.Int64: + format := tag.Get("integer") + if format == "string" { + b := val.Interface().(int64) + return []byte(fmt.Sprintf(`"%d"`, b)), nil + } + case reflect.Float64: + format := tag.Get("number") + if format == "string" { + b := val.Interface().(float64) + return []byte(fmt.Sprintf(`"%g"`, b)), nil + } case reflect.Map: if isNil(typ, val) { return []byte("null"), nil @@ -349,6 +362,16 @@ func handleDefaultConstValue(tagValue string, val interface{}, tag reflect.Struc if bigIntTag == "string" { return []byte(fmt.Sprintf(`"%s"`, tagValue)) } + case reflect.TypeOf(int64(0)): + format := tag.Get("integer") + if format == "string" { + return []byte(fmt.Sprintf(`"%s"`, tagValue)) + } + case reflect.TypeOf(float64(0)): + format := tag.Get("number") + if format == "string" { + return []byte(fmt.Sprintf(`"%s"`, tagValue)) + } case reflect.TypeOf(decimal.Big{}): decimalTag := tag.Get("decimal") if decimalTag != "number" { @@ -358,7 +381,7 @@ func handleDefaultConstValue(tagValue string, val interface{}, tag reflect.Struc return []byte(fmt.Sprintf(`"%s"`, tagValue)) default: if typ.Kind() == reflect.String { - return []byte(fmt.Sprintf(`"%s"`, tagValue)) + return []byte(fmt.Sprintf("%q", tagValue)) } } @@ -377,6 +400,57 @@ func unmarshalValue(value json.RawMessage, v reflect.Value, tag reflect.StructTa typ := dereferenceTypePointer(v.Type()) switch typ.Kind() { + case reflect.Int64: + var b int64 + + format := tag.Get("integer") + if format == "string" { + var s string + if err := json.Unmarshal(value, &s); err != nil { + return err + } + + var err error + b, err = strconv.ParseInt(s, 10, 64) + if err != nil { + return fmt.Errorf("failed to parse string as int64: %w", err) + } + if v.Kind() == reflect.Ptr { + if v.IsNil() { + v.Set(reflect.New(typ)) + } + v = v.Elem() + } + + v.Set(reflect.ValueOf(b)) + return nil + } + case reflect.Float64: + var b float64 + + format := tag.Get("number") + if format == "string" { + var s string + if err := json.Unmarshal(value, &s); err != nil { + return err + } + + var err error + b, err = strconv.ParseFloat(s, 64) + if err != nil { + return fmt.Errorf("failed to parse string as float64: %w", err) + } + + if v.Kind() == reflect.Ptr { + if v.IsNil() { + v.Set(reflect.New(typ)) + } + v = v.Elem() + } + + v.Set(reflect.ValueOf(b)) + return nil + } case reflect.Map: if bytes.Equal(value, []byte("null")) || !isComplexValueType(dereferenceTypePointer(typ.Elem())) { if v.CanAddr() { diff --git a/internal/sdk/pkg/utils/pathparams.go b/internal/sdk/internal/utils/pathparams.go similarity index 73% rename from internal/sdk/pkg/utils/pathparams.go rename to internal/sdk/internal/utils/pathparams.go index b0c5eca..53d527d 100644 --- a/internal/sdk/pkg/utils/pathparams.go +++ b/internal/sdk/internal/utils/pathparams.go @@ -13,21 +13,44 @@ import ( "github.com/ericlagergren/decimal" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/types" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/types" ) -func GenerateURL(ctx context.Context, serverURL, path string, pathParams interface{}, globals map[string]map[string]map[string]interface{}) (string, error) { +func GenerateURL(_ context.Context, serverURL, path string, pathParams interface{}, globals interface{}) (string, error) { uri := strings.TrimSuffix(serverURL, "/") + path + parsedParameters := map[string]string{} + + globalsAlreadyPopulated, err := populateParsedParameters(pathParams, globals, parsedParameters, []string{}) + if err != nil { + return "", err + } + + if globals != nil { + _, err = populateParsedParameters(globals, nil, parsedParameters, globalsAlreadyPopulated) + if err != nil { + return "", err + } + } + + // TODO should we handle the case where there are no matching path params? + return ReplaceParameters(uri, parsedParameters), nil +} + +func populateParsedParameters(pathParams interface{}, globals interface{}, parsedParameters map[string]string, skipFields []string) ([]string, error) { pathParamsStructType := reflect.TypeOf(pathParams) pathParamsValType := reflect.ValueOf(pathParams) - parsedParameters := map[string]string{} + globalsAlreadyPopulated := []string{} for i := 0; i < pathParamsStructType.NumField(); i++ { fieldType := pathParamsStructType.Field(i) valType := pathParamsValType.Field(i) + if contains(skipFields, fieldType.Name) { + continue + } + requestTag := getRequestTag(fieldType) if requestTag != nil { continue @@ -38,12 +61,18 @@ func GenerateURL(ctx context.Context, serverURL, path string, pathParams interfa continue } - valType = populateFromGlobals(fieldType, valType, "pathParam", globals) + if globals != nil { + var globalFound bool + fieldType, valType, globalFound = populateFromGlobals(fieldType, valType, pathParamTagKey, globals) + if globalFound { + globalsAlreadyPopulated = append(globalsAlreadyPopulated, fieldType.Name) + } + } if ppTag.Serialization != "" { vals, err := populateSerializedParams(ppTag, fieldType.Type, valType) if err != nil { - return "", err + return nil, err } for k, v := range vals { parsedParameters[k] = url.PathEscape(v) @@ -52,7 +81,7 @@ func GenerateURL(ctx context.Context, serverURL, path string, pathParams interfa // TODO: support other styles switch ppTag.Style { case "simple": - simpleParams := getSimplePathParams(ctx, ppTag.ParamName, fieldType.Type, valType, ppTag.Explode) + simpleParams := getSimplePathParams(ppTag.ParamName, fieldType.Type, valType, ppTag.Explode) for k, v := range simpleParams { parsedParameters[k] = v } @@ -60,11 +89,10 @@ func GenerateURL(ctx context.Context, serverURL, path string, pathParams interfa } } - // TODO should we handle the case where there are no matching path params? - return ReplaceParameters(uri, parsedParameters), nil + return globalsAlreadyPopulated, nil } -func getSimplePathParams(ctx context.Context, parentName string, objType reflect.Type, objValue reflect.Value, explode bool) map[string]string { +func getSimplePathParams(parentName string, objType reflect.Type, objValue reflect.Value, explode bool) map[string]string { pathParams := make(map[string]string) if isNil(objType, objValue) { diff --git a/internal/sdk/pkg/utils/queryparams.go b/internal/sdk/internal/utils/queryparams.go similarity index 71% rename from internal/sdk/pkg/utils/queryparams.go rename to internal/sdk/internal/utils/queryparams.go index 0e94bce..8d1bf47 100644 --- a/internal/sdk/pkg/utils/queryparams.go +++ b/internal/sdk/internal/utils/queryparams.go @@ -11,16 +11,40 @@ import ( "reflect" ) -func PopulateQueryParams(ctx context.Context, req *http.Request, queryParams interface{}, globals map[string]map[string]map[string]interface{}) error { +func PopulateQueryParams(_ context.Context, req *http.Request, queryParams interface{}, globals interface{}) error { + values := url.Values{} + + globalsAlreadyPopulated, err := populateQueryParams(queryParams, globals, values, []string{}) + if err != nil { + return err + } + + if globals != nil { + _, err = populateQueryParams(globals, nil, values, globalsAlreadyPopulated) + if err != nil { + return err + } + } + + req.URL.RawQuery = values.Encode() + + return nil +} + +func populateQueryParams(queryParams interface{}, globals interface{}, values url.Values, skipFields []string) ([]string, error) { queryParamsStructType := reflect.TypeOf(queryParams) queryParamsValType := reflect.ValueOf(queryParams) - values := url.Values{} + globalsAlreadyPopulated := []string{} for i := 0; i < queryParamsStructType.NumField(); i++ { fieldType := queryParamsStructType.Field(i) valType := queryParamsValType.Field(i) + if contains(skipFields, fieldType.Name) { + continue + } + requestTag := getRequestTag(fieldType) if requestTag != nil { continue @@ -31,12 +55,18 @@ func PopulateQueryParams(ctx context.Context, req *http.Request, queryParams int continue } - valType = populateFromGlobals(fieldType, valType, "queryParam", globals) + if globals != nil { + var globalFound bool + fieldType, valType, globalFound = populateFromGlobals(fieldType, valType, queryParamTagKey, globals) + if globalFound { + globalsAlreadyPopulated = append(globalsAlreadyPopulated, fieldType.Name) + } + } if qpTag.Serialization != "" { vals, err := populateSerializedParams(qpTag, fieldType.Type, valType) if err != nil { - return err + return nil, err } for k, v := range vals { values.Add(k, v) @@ -44,35 +74,33 @@ func PopulateQueryParams(ctx context.Context, req *http.Request, queryParams int } else { switch qpTag.Style { case "deepObject": - vals := populateDeepObjectParams(req, qpTag, fieldType.Type, valType) + vals := populateDeepObjectParams(qpTag, fieldType.Type, valType) for k, v := range vals { for _, vv := range v { values.Add(k, vv) } } case "form": - vals := populateFormParams(req, qpTag, fieldType.Type, valType, ",") + vals := populateFormParams(qpTag, fieldType.Type, valType, ",") for k, v := range vals { for _, vv := range v { values.Add(k, vv) } } case "pipeDelimited": - vals := populateFormParams(req, qpTag, fieldType.Type, valType, "|") + vals := populateFormParams(qpTag, fieldType.Type, valType, "|") for k, v := range vals { for _, vv := range v { values.Add(k, vv) } } default: - return fmt.Errorf("unsupported style: %s", qpTag.Style) + return nil, fmt.Errorf("unsupported style: %s", qpTag.Style) } } } - req.URL.RawQuery = values.Encode() - - return nil + return globalsAlreadyPopulated, nil } func populateSerializedParams(tag *paramTag, objType reflect.Type, objValue reflect.Value) (map[string]string, error) { @@ -98,7 +126,7 @@ func populateSerializedParams(tag *paramTag, objType reflect.Type, objValue refl return values, nil } -func populateDeepObjectParams(req *http.Request, tag *paramTag, objType reflect.Type, objValue reflect.Value) url.Values { +func populateDeepObjectParams(tag *paramTag, objType reflect.Type, objValue reflect.Value) url.Values { values := url.Values{} if isNil(objType, objValue) { @@ -155,7 +183,7 @@ func populateDeepObjectParams(req *http.Request, tag *paramTag, objType reflect. return values } -func populateFormParams(req *http.Request, tag *paramTag, objType reflect.Type, objValue reflect.Value, delimiter string) url.Values { +func populateFormParams(tag *paramTag, objType reflect.Type, objValue reflect.Value, delimiter string) url.Values { return populateForm(tag.ParamName, tag.Explode, objType, objValue, delimiter, func(fieldType reflect.StructField) string { qpTag := parseQueryParamTag(fieldType) if qpTag == nil { diff --git a/internal/sdk/pkg/utils/requestbody.go b/internal/sdk/internal/utils/requestbody.go similarity index 93% rename from internal/sdk/pkg/utils/requestbody.go rename to internal/sdk/internal/utils/requestbody.go index 950f39a..cfb2ba6 100644 --- a/internal/sdk/pkg/utils/requestbody.go +++ b/internal/sdk/internal/utils/requestbody.go @@ -25,7 +25,20 @@ var ( urlEncodedEncodingRegex = regexp.MustCompile(`application\/x-www-form-urlencoded.*`) ) -func SerializeRequestBody(ctx context.Context, request interface{}, nullable, optional bool, requestFieldName, serializationMethod, tag string) (io.Reader, string, error) { +func SerializeRequestBody(_ context.Context, request interface{}, nullable, optional bool, requestFieldName, serializationMethod, tag string) (io.Reader, string, error) { + bodyReader, contentType, err := serializeRequestBody(request, nullable, optional, requestFieldName, serializationMethod, tag) + if err != nil { + return nil, "", fmt.Errorf("error serializing request body: %w", err) + } + + if bodyReader == nil && !optional { + return nil, "", fmt.Errorf("request body is required") + } + + return bodyReader, contentType, nil +} + +func serializeRequestBody(request interface{}, nullable, optional bool, requestFieldName, serializationMethod, tag string) (io.Reader, string, error) { requestStructType := reflect.TypeOf(request) requestValType := reflect.ValueOf(request) diff --git a/internal/sdk/pkg/utils/retries.go b/internal/sdk/internal/utils/retries.go similarity index 100% rename from internal/sdk/pkg/utils/retries.go rename to internal/sdk/internal/utils/retries.go diff --git a/internal/sdk/pkg/utils/security.go b/internal/sdk/internal/utils/security.go similarity index 63% rename from internal/sdk/pkg/utils/security.go rename to internal/sdk/internal/utils/security.go index fa5eff7..8023225 100644 --- a/internal/sdk/pkg/utils/security.go +++ b/internal/sdk/internal/utils/security.go @@ -11,10 +11,6 @@ import ( "strings" ) -type HTTPClient interface { - Do(req *http.Request) (*http.Response, error) -} - const ( securityTagKey = "security" ) @@ -27,73 +23,24 @@ type securityTag struct { SubType string } -type securityConfig struct { - headers map[string]string - queryParams map[string]string -} - -type SecurityClient struct { - HTTPClient - security func(ctx context.Context) (interface{}, error) -} - -func newSecurityClient(client HTTPClient, security func(ctx context.Context) (interface{}, error)) *SecurityClient { - return &SecurityClient{ - HTTPClient: client, - security: security, +func PopulateSecurity(ctx context.Context, req *http.Request, securitySource func(context.Context) (interface{}, error)) error { + if securitySource == nil { + return nil } -} -func (c *SecurityClient) Do(req *http.Request) (*http.Response, error) { - securityCtx, err := c.security(req.Context()) + security, err := securitySource(ctx) if err != nil { - return nil, err - } - - ctx := securityConfig{ - headers: make(map[string]string), - queryParams: make(map[string]string), - } - parseSecurityStruct(&ctx, securityCtx) - - for k, v := range ctx.headers { - req.Header.Set(k, v) - } - - queryParams := req.URL.Query() - - for k, v := range ctx.queryParams { - queryParams.Add(k, v) + return err } - req.URL.RawQuery = queryParams.Encode() - - return c.HTTPClient.Do(req) -} - -func ConfigureSecurityClient(c HTTPClient, security func(ctx context.Context) (interface{}, error)) *SecurityClient { - return newSecurityClient(c, security) -} - -func trueReflectValue(val reflect.Value) reflect.Value { - kind := val.Type().Kind() - for kind == reflect.Interface || kind == reflect.Ptr { - innerVal := val.Elem() - if !innerVal.IsValid() { - break - } - val = innerVal - kind = val.Type().Kind() - } - return val -} + headers := make(map[string]string) + queryParams := make(map[string]string) -func parseSecurityStruct(c *securityConfig, security interface{}) { securityValType := trueReflectValue(reflect.ValueOf(security)) securityStructType := securityValType.Type() if isNil(securityStructType, securityValType) { - return + return nil } if securityStructType.Kind() == reflect.Ptr { @@ -118,25 +65,37 @@ func parseSecurityStruct(c *securityConfig, security interface{}) { secTag := parseSecurityTag(fieldType) if secTag != nil { if secTag.Option { - handleSecurityOption(c, valType.Interface()) + handleSecurityOption(headers, queryParams, valType.Interface()) } else if secTag.Scheme { // Special case for basic auth which could be a flattened struct if secTag.SubType == "basic" && kind != reflect.Struct { - parseSecurityScheme(c, secTag, security) + parseSecurityScheme(headers, queryParams, secTag, security) } else { - parseSecurityScheme(c, secTag, valType.Interface()) + parseSecurityScheme(headers, queryParams, secTag, valType.Interface()) } } } } + + for key, value := range headers { + req.Header.Add(key, value) + } + + query := req.URL.Query() + for key, value := range queryParams { + query.Add(key, value) + } + req.URL.RawQuery = query.Encode() + + return nil } -func handleSecurityOption(c *securityConfig, option interface{}) error { +func handleSecurityOption(headers, queryParams map[string]string, option interface{}) { optionValType := trueReflectValue(reflect.ValueOf(option)) optionStructType := optionValType.Type() if isNil(optionStructType, optionValType) { - return nil + return } for i := 0; i < optionStructType.NumField(); i++ { @@ -145,14 +104,12 @@ func handleSecurityOption(c *securityConfig, option interface{}) error { secTag := parseSecurityTag(fieldType) if secTag != nil && secTag.Scheme { - parseSecurityScheme(c, secTag, valType.Interface()) + parseSecurityScheme(headers, queryParams, secTag, valType.Interface()) } } - - return nil } -func parseSecurityScheme(client *securityConfig, schemeTag *securityTag, scheme interface{}) { +func parseSecurityScheme(headers, queryParams map[string]string, schemeTag *securityTag, scheme interface{}) { schemeVal := trueReflectValue(reflect.ValueOf(scheme)) schemeType := schemeVal.Type() @@ -162,7 +119,7 @@ func parseSecurityScheme(client *securityConfig, schemeTag *securityTag, scheme if schemeType.Kind() == reflect.Struct { if schemeTag.Type == "http" && schemeTag.SubType == "basic" { - handleBasicAuthScheme(client, schemeVal.Interface()) + handleBasicAuthScheme(headers, schemeVal.Interface()) return } @@ -183,34 +140,36 @@ func parseSecurityScheme(client *securityConfig, schemeTag *securityTag, scheme return } - parseSecuritySchemeValue(client, schemeTag, secTag, valType.Interface()) + parseSecuritySchemeValue(headers, queryParams, schemeTag, secTag, valType.Interface()) } } else { - parseSecuritySchemeValue(client, schemeTag, schemeTag, schemeVal.Interface()) + parseSecuritySchemeValue(headers, queryParams, schemeTag, schemeTag, schemeVal.Interface()) } } -func parseSecuritySchemeValue(client *securityConfig, schemeTag *securityTag, secTag *securityTag, val interface{}) { +func parseSecuritySchemeValue(headers, queryParams map[string]string, schemeTag *securityTag, secTag *securityTag, val interface{}) { switch schemeTag.Type { case "apiKey": switch schemeTag.SubType { case "header": - client.headers[secTag.Name] = valToString(val) + headers[secTag.Name] = valToString(val) case "query": - client.queryParams[secTag.Name] = valToString(val) + queryParams[secTag.Name] = valToString(val) case "cookie": - client.headers["Cookie"] = fmt.Sprintf("%s=%s", secTag.Name, valToString(val)) + headers["Cookie"] = fmt.Sprintf("%s=%s", secTag.Name, valToString(val)) default: panic("not supported") } case "openIdConnect": - client.headers[secTag.Name] = valToString(val) + headers[secTag.Name] = prefixBearer(valToString(val)) case "oauth2": - client.headers[secTag.Name] = valToString(val) + if schemeTag.SubType != "client_credentials" { + headers[secTag.Name] = prefixBearer(valToString(val)) + } case "http": switch schemeTag.SubType { case "bearer": - client.headers[secTag.Name] = prefixBearer(valToString(val)) + headers[secTag.Name] = prefixBearer(valToString(val)) default: panic("not supported") } @@ -227,7 +186,7 @@ func prefixBearer(authHeaderValue string) string { return fmt.Sprintf("Bearer %s", authHeaderValue) } -func handleBasicAuthScheme(client *securityConfig, scheme interface{}) { +func handleBasicAuthScheme(headers map[string]string, scheme interface{}) { schemeStructType := reflect.TypeOf(scheme) schemeValType := reflect.ValueOf(scheme) @@ -250,7 +209,7 @@ func handleBasicAuthScheme(client *securityConfig, scheme interface{}) { } } - client.headers["Authorization"] = fmt.Sprintf("Basic %s", base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", username, password)))) + headers["Authorization"] = fmt.Sprintf("Basic %s", base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", username, password)))) } func parseSecurityTag(field reflect.StructField) *securityTag { @@ -296,3 +255,16 @@ func parseSecurityTag(field reflect.StructField) *securityTag { SubType: securitySubType, } } + +func trueReflectValue(val reflect.Value) reflect.Value { + kind := val.Type().Kind() + for kind == reflect.Interface || kind == reflect.Ptr { + innerVal := val.Elem() + if !innerVal.IsValid() { + break + } + val = innerVal + kind = val.Type().Kind() + } + return val +} diff --git a/internal/sdk/pkg/utils/utils.go b/internal/sdk/internal/utils/utils.go similarity index 64% rename from internal/sdk/pkg/utils/utils.go rename to internal/sdk/internal/utils/utils.go index 8c8161a..a35dc9b 100644 --- a/internal/sdk/pkg/utils/utils.go +++ b/internal/sdk/internal/utils/utils.go @@ -8,6 +8,7 @@ import ( "math/big" "reflect" "regexp" + "strconv" "strings" "time" @@ -63,6 +64,29 @@ func Contains(slice []string, item string) bool { return false } +func MatchStatusCodes(expectedCodes []string, statusCode int) bool { + for _, codeStr := range expectedCodes { + code, err := strconv.Atoi(codeStr) + if err == nil { + if code == statusCode { + return true + } + continue + } + + codeRange, err := strconv.Atoi(string(codeStr[0])) + if err != nil { + continue + } + + if statusCode >= (codeRange*100) && statusCode < ((codeRange+1)*100) { + return true + } + } + + return false +} + func parseStructTag(tagKey string, field reflect.StructField) map[string]string { tag := field.Tag.Get(tagKey) if tag == "" { @@ -134,29 +158,66 @@ func valToString(val interface{}) string { } } -func populateFromGlobals(fieldType reflect.StructField, valType reflect.Value, paramType string, globals map[string]map[string]map[string]interface{}) reflect.Value { - if globals != nil && fieldType.Type.Kind() == reflect.Ptr { - parameters, ok := globals["parameters"] - if ok { - paramsOfType, ok := parameters[paramType] - if ok { - globalVal, ok := paramsOfType[fieldType.Name] - if ok { - if reflect.TypeOf(globalVal).Kind() == fieldType.Type.Elem().Kind() && valType.IsNil() { - valType = reflect.ValueOf(&globalVal) - } - } - } +func populateFromGlobals(fieldType reflect.StructField, valType reflect.Value, paramType string, globals interface{}) (reflect.StructField, reflect.Value, bool) { + if globals == nil { + return fieldType, valType, false + } + + globalsStruct := reflect.TypeOf(globals) + globalsStructVal := reflect.ValueOf(globals) + + globalsField, found := globalsStruct.FieldByName(fieldType.Name) + if !found { + return fieldType, valType, false + } + + if fieldType.Type.Kind() != reflect.Ptr || !valType.IsNil() { + return fieldType, valType, true + } + + globalsVal := globalsStructVal.FieldByName(fieldType.Name) + + if !globalsVal.IsValid() { + return fieldType, valType, false + } + + switch paramType { + case queryParamTagKey: + qpTag := parseQueryParamTag(globalsField) + if qpTag == nil { + return fieldType, valType, false + } + default: + tag := parseParamTag(paramType, fieldType, "simple", false) + if tag == nil { + return fieldType, valType, false } } - return valType + return globalsField, globalsVal, true } func isNil(typ reflect.Type, val reflect.Value) bool { + // `reflect.TypeOf(nil) == nil` so calling typ.Kind() will cause a nil pointer + // dereference panic. Catch it and return early. + // https://github.com/golang/go/issues/51649 + // https://github.com/golang/go/issues/54208 + if typ == nil { + return true + } + if typ.Kind() == reflect.Ptr || typ.Kind() == reflect.Map || typ.Kind() == reflect.Slice || typ.Kind() == reflect.Interface { return val.IsNil() } return false } + +func contains(arr []string, str string) bool { + for _, a := range arr { + if a == str { + return true + } + } + return false +} diff --git a/internal/sdk/journeys.go b/internal/sdk/journeys.go index b25ccb6..9680958 100644 --- a/internal/sdk/journeys.go +++ b/internal/sdk/journeys.go @@ -6,13 +6,15 @@ import ( "bytes" "context" "fmt" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/operations" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/sdkerrors" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/shared" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/utils" + "github.com/cenkalti/backoff/v4" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/internal/hooks" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/internal/utils" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/errors" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/operations" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/shared" "io" "net/http" - "strings" + "net/url" ) type Journeys struct { @@ -28,6 +30,13 @@ func newJourneys(sdkConfig sdkConfiguration) *Journeys { // CreateJourney - createJourney // Create a Journey func (s *Journeys) CreateJourney(ctx context.Context, request operations.CreateJourneyRequest, opts ...operations.Option) (*operations.CreateJourneyResponse, error) { + hookCtx := hooks.HookContext{ + Context: ctx, + OperationID: "createJourney", + OAuth2Scopes: []string{}, + SecuritySource: s.sdkConfiguration.Security, + } + o := operations.Options{} supportedOptions := []string{ operations.SupportedOptionRetries, @@ -39,29 +48,31 @@ func (s *Journeys) CreateJourney(ctx context.Context, request operations.CreateJ } } baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) - url := strings.TrimSuffix(baseURL, "/") + "/v1/journey/configuration" + opURL, err := url.JoinPath(baseURL, "/v1/journey/configuration") + if err != nil { + return nil, fmt.Errorf("error generating URL: %w", err) + } bodyReader, reqContentType, err := utils.SerializeRequestBody(ctx, request, false, true, "JourneyCreationRequest", "json", `request:"mediaType=application/json"`) if err != nil { - return nil, fmt.Errorf("error serializing request body: %w", err) + return nil, err } - debugBody := bytes.NewBuffer([]byte{}) - debugReader := io.TeeReader(bodyReader, debugBody) - req, err := http.NewRequestWithContext(ctx, "POST", url, debugReader) + req, err := http.NewRequestWithContext(ctx, "POST", opURL, bodyReader) if err != nil { return nil, fmt.Errorf("error creating request: %w", err) } req.Header.Set("Accept", "application/json") - req.Header.Set("user-agent", s.sdkConfiguration.UserAgent) - + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) req.Header.Set("Content-Type", reqContentType) if err := utils.PopulateQueryParams(ctx, req, request, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } - client := s.sdkConfiguration.SecurityClient + if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil { + return nil, err + } globalRetryConfig := s.sdkConfiguration.RetryConfig retryConfig := o.Retries @@ -88,34 +99,57 @@ func (s *Journeys) CreateJourney(ctx context.Context, request operations.CreateJ "5XX", }, }, func() (*http.Response, error) { - return client.Do(req) + if req.Body != nil { + copyBody, err := req.GetBody() + if err != nil { + return nil, err + } + req.Body = copyBody + } + + req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, backoff.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err }) if err != nil { - return nil, fmt.Errorf("error sending request: %w", err) + return nil, err + } else { + httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } } - if httpRes == nil { - return nil, fmt.Errorf("error sending request: no response") + + res := &operations.CreateJourneyResponse{ + StatusCode: httpRes.StatusCode, + ContentType: httpRes.Header.Get("Content-Type"), + RawResponse: httpRes, } rawBody, err := io.ReadAll(httpRes.Body) if err != nil { return nil, fmt.Errorf("error reading response body: %w", err) } - httpRes.Request.Body = io.NopCloser(debugBody) httpRes.Body.Close() httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody)) - contentType := httpRes.Header.Get("Content-Type") - - res := &operations.CreateJourneyResponse{ - StatusCode: httpRes.StatusCode, - ContentType: contentType, - RawResponse: httpRes, - } switch { case httpRes.StatusCode == 201: switch { - case utils.MatchContentType(contentType, `application/json`): + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): var out shared.Journey if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { return nil, err @@ -123,8 +157,10 @@ func (s *Journeys) CreateJourney(ctx context.Context, request operations.CreateJ res.Journey = &out default: - return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", contentType), httpRes.StatusCode, string(rawBody), httpRes) + return nil, errors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) } + default: + return nil, errors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) } return res, nil @@ -133,6 +169,13 @@ func (s *Journeys) CreateJourney(ctx context.Context, request operations.CreateJ // GetJourney - getJourney // Get journey by id func (s *Journeys) GetJourney(ctx context.Context, request operations.GetJourneyRequest, opts ...operations.Option) (*operations.GetJourneyResponse, error) { + hookCtx := hooks.HookContext{ + Context: ctx, + OperationID: "getJourney", + OAuth2Scopes: []string{}, + SecuritySource: nil, + } + o := operations.Options{} supportedOptions := []string{ operations.SupportedOptionRetries, @@ -144,24 +187,22 @@ func (s *Journeys) GetJourney(ctx context.Context, request operations.GetJourney } } baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) - url, err := utils.GenerateURL(ctx, baseURL, "/v1/journey/configuration/{id}", request, nil) + opURL, err := utils.GenerateURL(ctx, baseURL, "/v1/journey/configuration/{id}", request, nil) if err != nil { return nil, fmt.Errorf("error generating URL: %w", err) } - req, err := http.NewRequestWithContext(ctx, "GET", url, nil) + req, err := http.NewRequestWithContext(ctx, "GET", opURL, nil) if err != nil { return nil, fmt.Errorf("error creating request: %w", err) } req.Header.Set("Accept", "application/json") - req.Header.Set("user-agent", s.sdkConfiguration.UserAgent) + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) if err := utils.PopulateQueryParams(ctx, req, request, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } - client := s.sdkConfiguration.SecurityClient - globalRetryConfig := s.sdkConfiguration.RetryConfig retryConfig := o.Retries if retryConfig == nil { @@ -187,13 +228,44 @@ func (s *Journeys) GetJourney(ctx context.Context, request operations.GetJourney "5XX", }, }, func() (*http.Response, error) { - return client.Do(req) + if req.Body != nil { + copyBody, err := req.GetBody() + if err != nil { + return nil, err + } + req.Body = copyBody + } + + req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, backoff.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err }) if err != nil { - return nil, fmt.Errorf("error sending request: %w", err) + return nil, err + } else { + httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } } - if httpRes == nil { - return nil, fmt.Errorf("error sending request: no response") + + res := &operations.GetJourneyResponse{ + StatusCode: httpRes.StatusCode, + ContentType: httpRes.Header.Get("Content-Type"), + RawResponse: httpRes, } rawBody, err := io.ReadAll(httpRes.Body) @@ -203,17 +275,10 @@ func (s *Journeys) GetJourney(ctx context.Context, request operations.GetJourney httpRes.Body.Close() httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody)) - contentType := httpRes.Header.Get("Content-Type") - - res := &operations.GetJourneyResponse{ - StatusCode: httpRes.StatusCode, - ContentType: contentType, - RawResponse: httpRes, - } switch { case httpRes.StatusCode == 200: switch { - case utils.MatchContentType(contentType, `application/json`): + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): var out shared.Journey if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { return nil, err @@ -221,8 +286,10 @@ func (s *Journeys) GetJourney(ctx context.Context, request operations.GetJourney res.Journey = &out default: - return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", contentType), httpRes.StatusCode, string(rawBody), httpRes) + return nil, errors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) } + default: + return nil, errors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) } return res, nil @@ -231,6 +298,13 @@ func (s *Journeys) GetJourney(ctx context.Context, request operations.GetJourney // GetJourneyProducts - getJourneyProducts // Get products available in the journey by id func (s *Journeys) GetJourneyProducts(ctx context.Context, request operations.GetJourneyProductsRequest, opts ...operations.Option) (*operations.GetJourneyProductsResponse, error) { + hookCtx := hooks.HookContext{ + Context: ctx, + OperationID: "getJourneyProducts", + OAuth2Scopes: []string{}, + SecuritySource: nil, + } + o := operations.Options{} supportedOptions := []string{ operations.SupportedOptionRetries, @@ -242,24 +316,22 @@ func (s *Journeys) GetJourneyProducts(ctx context.Context, request operations.Ge } } baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) - url, err := utils.GenerateURL(ctx, baseURL, "/v1/journey/products/{id}", request, nil) + opURL, err := utils.GenerateURL(ctx, baseURL, "/v1/journey/products/{id}", request, nil) if err != nil { return nil, fmt.Errorf("error generating URL: %w", err) } - req, err := http.NewRequestWithContext(ctx, "GET", url, nil) + req, err := http.NewRequestWithContext(ctx, "GET", opURL, nil) if err != nil { return nil, fmt.Errorf("error creating request: %w", err) } req.Header.Set("Accept", "application/json") - req.Header.Set("user-agent", s.sdkConfiguration.UserAgent) + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) if err := utils.PopulateQueryParams(ctx, req, request, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } - client := s.sdkConfiguration.SecurityClient - globalRetryConfig := s.sdkConfiguration.RetryConfig retryConfig := o.Retries if retryConfig == nil { @@ -285,13 +357,44 @@ func (s *Journeys) GetJourneyProducts(ctx context.Context, request operations.Ge "5XX", }, }, func() (*http.Response, error) { - return client.Do(req) + if req.Body != nil { + copyBody, err := req.GetBody() + if err != nil { + return nil, err + } + req.Body = copyBody + } + + req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, backoff.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err }) if err != nil { - return nil, fmt.Errorf("error sending request: %w", err) + return nil, err + } else { + httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } } - if httpRes == nil { - return nil, fmt.Errorf("error sending request: no response") + + res := &operations.GetJourneyProductsResponse{ + StatusCode: httpRes.StatusCode, + ContentType: httpRes.Header.Get("Content-Type"), + RawResponse: httpRes, } rawBody, err := io.ReadAll(httpRes.Body) @@ -301,17 +404,10 @@ func (s *Journeys) GetJourneyProducts(ctx context.Context, request operations.Ge httpRes.Body.Close() httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody)) - contentType := httpRes.Header.Get("Content-Type") - - res := &operations.GetJourneyProductsResponse{ - StatusCode: httpRes.StatusCode, - ContentType: contentType, - RawResponse: httpRes, - } switch { case httpRes.StatusCode == 200: switch { - case utils.MatchContentType(contentType, `application/json`): + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): var out []shared.JourneyProductsResponse if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { return nil, err @@ -319,8 +415,10 @@ func (s *Journeys) GetJourneyProducts(ctx context.Context, request operations.Ge res.JourneyProductsResponse = out default: - return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", contentType), httpRes.StatusCode, string(rawBody), httpRes) + return nil, errors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) } + default: + return nil, errors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) } return res, nil @@ -329,6 +427,13 @@ func (s *Journeys) GetJourneyProducts(ctx context.Context, request operations.Ge // GetJourneysByOrgID - getJourneysByOrgId // Get all journeys by organization id func (s *Journeys) GetJourneysByOrgID(ctx context.Context, request operations.GetJourneysByOrgIDRequest, opts ...operations.Option) (*operations.GetJourneysByOrgIDResponse, error) { + hookCtx := hooks.HookContext{ + Context: ctx, + OperationID: "getJourneysByOrgId", + OAuth2Scopes: []string{}, + SecuritySource: s.sdkConfiguration.Security, + } + o := operations.Options{} supportedOptions := []string{ operations.SupportedOptionRetries, @@ -340,23 +445,25 @@ func (s *Journeys) GetJourneysByOrgID(ctx context.Context, request operations.Ge } } baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) - url, err := utils.GenerateURL(ctx, baseURL, "/v1/journey/organization/{id}", request, nil) + opURL, err := utils.GenerateURL(ctx, baseURL, "/v1/journey/organization/{id}", request, nil) if err != nil { return nil, fmt.Errorf("error generating URL: %w", err) } - req, err := http.NewRequestWithContext(ctx, "GET", url, nil) + req, err := http.NewRequestWithContext(ctx, "GET", opURL, nil) if err != nil { return nil, fmt.Errorf("error creating request: %w", err) } req.Header.Set("Accept", "application/json") - req.Header.Set("user-agent", s.sdkConfiguration.UserAgent) + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) if err := utils.PopulateQueryParams(ctx, req, request, nil); err != nil { return nil, fmt.Errorf("error populating query params: %w", err) } - client := s.sdkConfiguration.SecurityClient + if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil { + return nil, err + } globalRetryConfig := s.sdkConfiguration.RetryConfig retryConfig := o.Retries @@ -383,13 +490,44 @@ func (s *Journeys) GetJourneysByOrgID(ctx context.Context, request operations.Ge "5XX", }, }, func() (*http.Response, error) { - return client.Do(req) + if req.Body != nil { + copyBody, err := req.GetBody() + if err != nil { + return nil, err + } + req.Body = copyBody + } + + req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, backoff.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err }) if err != nil { - return nil, fmt.Errorf("error sending request: %w", err) + return nil, err + } else { + httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } } - if httpRes == nil { - return nil, fmt.Errorf("error sending request: no response") + + res := &operations.GetJourneysByOrgIDResponse{ + StatusCode: httpRes.StatusCode, + ContentType: httpRes.Header.Get("Content-Type"), + RawResponse: httpRes, } rawBody, err := io.ReadAll(httpRes.Body) @@ -399,17 +537,10 @@ func (s *Journeys) GetJourneysByOrgID(ctx context.Context, request operations.Ge httpRes.Body.Close() httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody)) - contentType := httpRes.Header.Get("Content-Type") - - res := &operations.GetJourneysByOrgIDResponse{ - StatusCode: httpRes.StatusCode, - ContentType: contentType, - RawResponse: httpRes, - } switch { case httpRes.StatusCode == 200: switch { - case utils.MatchContentType(contentType, `application/json`): + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): var out shared.GetJourneysResponse if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { return nil, err @@ -417,8 +548,10 @@ func (s *Journeys) GetJourneysByOrgID(ctx context.Context, request operations.Ge res.GetJourneysResponse = &out default: - return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", contentType), httpRes.StatusCode, string(rawBody), httpRes) + return nil, errors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) } + default: + return nil, errors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) } return res, nil @@ -427,6 +560,13 @@ func (s *Journeys) GetJourneysByOrgID(ctx context.Context, request operations.Ge // PatchUpdateJourney - patchUpdateJourney // Update a Journey (partially / patch). Support for nested properties updates (e.g. "property[0].name"). func (s *Journeys) PatchUpdateJourney(ctx context.Context, request *shared.PatchUpdateJourneyRequest, opts ...operations.Option) (*operations.PatchUpdateJourneyResponse, error) { + hookCtx := hooks.HookContext{ + Context: ctx, + OperationID: "patchUpdateJourney", + OAuth2Scopes: []string{}, + SecuritySource: s.sdkConfiguration.Security, + } + o := operations.Options{} supportedOptions := []string{ operations.SupportedOptionRetries, @@ -438,25 +578,27 @@ func (s *Journeys) PatchUpdateJourney(ctx context.Context, request *shared.Patch } } baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) - url := strings.TrimSuffix(baseURL, "/") + "/v1/journey/configuration" + opURL, err := url.JoinPath(baseURL, "/v1/journey/configuration") + if err != nil { + return nil, fmt.Errorf("error generating URL: %w", err) + } bodyReader, reqContentType, err := utils.SerializeRequestBody(ctx, request, false, true, "Request", "json", `request:"mediaType=application/json"`) if err != nil { - return nil, fmt.Errorf("error serializing request body: %w", err) + return nil, err } - debugBody := bytes.NewBuffer([]byte{}) - debugReader := io.TeeReader(bodyReader, debugBody) - req, err := http.NewRequestWithContext(ctx, "PATCH", url, debugReader) + req, err := http.NewRequestWithContext(ctx, "PATCH", opURL, bodyReader) if err != nil { return nil, fmt.Errorf("error creating request: %w", err) } req.Header.Set("Accept", "application/json") - req.Header.Set("user-agent", s.sdkConfiguration.UserAgent) - + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) req.Header.Set("Content-Type", reqContentType) - client := s.sdkConfiguration.SecurityClient + if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil { + return nil, err + } globalRetryConfig := s.sdkConfiguration.RetryConfig retryConfig := o.Retries @@ -483,34 +625,57 @@ func (s *Journeys) PatchUpdateJourney(ctx context.Context, request *shared.Patch "5XX", }, }, func() (*http.Response, error) { - return client.Do(req) + if req.Body != nil { + copyBody, err := req.GetBody() + if err != nil { + return nil, err + } + req.Body = copyBody + } + + req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, backoff.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err }) if err != nil { - return nil, fmt.Errorf("error sending request: %w", err) + return nil, err + } else { + httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } } - if httpRes == nil { - return nil, fmt.Errorf("error sending request: no response") + + res := &operations.PatchUpdateJourneyResponse{ + StatusCode: httpRes.StatusCode, + ContentType: httpRes.Header.Get("Content-Type"), + RawResponse: httpRes, } rawBody, err := io.ReadAll(httpRes.Body) if err != nil { return nil, fmt.Errorf("error reading response body: %w", err) } - httpRes.Request.Body = io.NopCloser(debugBody) httpRes.Body.Close() httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody)) - contentType := httpRes.Header.Get("Content-Type") - - res := &operations.PatchUpdateJourneyResponse{ - StatusCode: httpRes.StatusCode, - ContentType: contentType, - RawResponse: httpRes, - } switch { case httpRes.StatusCode == 200: switch { - case utils.MatchContentType(contentType, `application/json`): + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): var out shared.JourneyResponse if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { return nil, err @@ -518,8 +683,10 @@ func (s *Journeys) PatchUpdateJourney(ctx context.Context, request *shared.Patch res.JourneyResponse = &out default: - return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", contentType), httpRes.StatusCode, string(rawBody), httpRes) + return nil, errors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) } + default: + return nil, errors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) } return res, nil @@ -528,6 +695,13 @@ func (s *Journeys) PatchUpdateJourney(ctx context.Context, request *shared.Patch // RemoveJourney - removeJourney // Remove journey by id func (s *Journeys) RemoveJourney(ctx context.Context, request operations.RemoveJourneyRequest, opts ...operations.Option) (*operations.RemoveJourneyResponse, error) { + hookCtx := hooks.HookContext{ + Context: ctx, + OperationID: "removeJourney", + OAuth2Scopes: []string{}, + SecuritySource: s.sdkConfiguration.Security, + } + o := operations.Options{} supportedOptions := []string{ operations.SupportedOptionRetries, @@ -539,19 +713,21 @@ func (s *Journeys) RemoveJourney(ctx context.Context, request operations.RemoveJ } } baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) - url, err := utils.GenerateURL(ctx, baseURL, "/v1/journey/configuration/{id}", request, nil) + opURL, err := utils.GenerateURL(ctx, baseURL, "/v1/journey/configuration/{id}", request, nil) if err != nil { return nil, fmt.Errorf("error generating URL: %w", err) } - req, err := http.NewRequestWithContext(ctx, "DELETE", url, nil) + req, err := http.NewRequestWithContext(ctx, "DELETE", opURL, nil) if err != nil { return nil, fmt.Errorf("error creating request: %w", err) } req.Header.Set("Accept", "*/*") - req.Header.Set("user-agent", s.sdkConfiguration.UserAgent) + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) - client := s.sdkConfiguration.SecurityClient + if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil { + return nil, err + } globalRetryConfig := s.sdkConfiguration.RetryConfig retryConfig := o.Retries @@ -578,13 +754,44 @@ func (s *Journeys) RemoveJourney(ctx context.Context, request operations.RemoveJ "5XX", }, }, func() (*http.Response, error) { - return client.Do(req) + if req.Body != nil { + copyBody, err := req.GetBody() + if err != nil { + return nil, err + } + req.Body = copyBody + } + + req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, backoff.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err }) if err != nil { - return nil, fmt.Errorf("error sending request: %w", err) + return nil, err + } else { + httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } } - if httpRes == nil { - return nil, fmt.Errorf("error sending request: no response") + + res := &operations.RemoveJourneyResponse{ + StatusCode: httpRes.StatusCode, + ContentType: httpRes.Header.Get("Content-Type"), + RawResponse: httpRes, } rawBody, err := io.ReadAll(httpRes.Body) @@ -594,15 +801,10 @@ func (s *Journeys) RemoveJourney(ctx context.Context, request operations.RemoveJ httpRes.Body.Close() httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody)) - contentType := httpRes.Header.Get("Content-Type") - - res := &operations.RemoveJourneyResponse{ - StatusCode: httpRes.StatusCode, - ContentType: contentType, - RawResponse: httpRes, - } switch { case httpRes.StatusCode == 200: + default: + return nil, errors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) } return res, nil @@ -611,6 +813,13 @@ func (s *Journeys) RemoveJourney(ctx context.Context, request operations.RemoveJ // SearchJourneys - searchJourneys // Search Journeys func (s *Journeys) SearchJourneys(ctx context.Context, request *shared.SearchJourneysQueryRequest, opts ...operations.Option) (*operations.SearchJourneysResponse, error) { + hookCtx := hooks.HookContext{ + Context: ctx, + OperationID: "searchJourneys", + OAuth2Scopes: []string{}, + SecuritySource: s.sdkConfiguration.Security, + } + o := operations.Options{} supportedOptions := []string{ operations.SupportedOptionRetries, @@ -622,25 +831,27 @@ func (s *Journeys) SearchJourneys(ctx context.Context, request *shared.SearchJou } } baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) - url := strings.TrimSuffix(baseURL, "/") + "/v1/journey/configuration/search" + opURL, err := url.JoinPath(baseURL, "/v1/journey/configuration/search") + if err != nil { + return nil, fmt.Errorf("error generating URL: %w", err) + } bodyReader, reqContentType, err := utils.SerializeRequestBody(ctx, request, false, true, "Request", "json", `request:"mediaType=application/json"`) if err != nil { - return nil, fmt.Errorf("error serializing request body: %w", err) + return nil, err } - debugBody := bytes.NewBuffer([]byte{}) - debugReader := io.TeeReader(bodyReader, debugBody) - req, err := http.NewRequestWithContext(ctx, "POST", url, debugReader) + req, err := http.NewRequestWithContext(ctx, "POST", opURL, bodyReader) if err != nil { return nil, fmt.Errorf("error creating request: %w", err) } req.Header.Set("Accept", "application/json") - req.Header.Set("user-agent", s.sdkConfiguration.UserAgent) - + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) req.Header.Set("Content-Type", reqContentType) - client := s.sdkConfiguration.SecurityClient + if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil { + return nil, err + } globalRetryConfig := s.sdkConfiguration.RetryConfig retryConfig := o.Retries @@ -667,34 +878,57 @@ func (s *Journeys) SearchJourneys(ctx context.Context, request *shared.SearchJou "5XX", }, }, func() (*http.Response, error) { - return client.Do(req) + if req.Body != nil { + copyBody, err := req.GetBody() + if err != nil { + return nil, err + } + req.Body = copyBody + } + + req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, backoff.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err }) if err != nil { - return nil, fmt.Errorf("error sending request: %w", err) + return nil, err + } else { + httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } } - if httpRes == nil { - return nil, fmt.Errorf("error sending request: no response") + + res := &operations.SearchJourneysResponse{ + StatusCode: httpRes.StatusCode, + ContentType: httpRes.Header.Get("Content-Type"), + RawResponse: httpRes, } rawBody, err := io.ReadAll(httpRes.Body) if err != nil { return nil, fmt.Errorf("error reading response body: %w", err) } - httpRes.Request.Body = io.NopCloser(debugBody) httpRes.Body.Close() httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody)) - contentType := httpRes.Header.Get("Content-Type") - - res := &operations.SearchJourneysResponse{ - StatusCode: httpRes.StatusCode, - ContentType: contentType, - RawResponse: httpRes, - } switch { case httpRes.StatusCode == 200: switch { - case utils.MatchContentType(contentType, `application/json`): + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): var out shared.SearchJourneysResponse if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { return nil, err @@ -702,8 +936,10 @@ func (s *Journeys) SearchJourneys(ctx context.Context, request *shared.SearchJou res.SearchJourneysResponse = &out default: - return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", contentType), httpRes.StatusCode, string(rawBody), httpRes) + return nil, errors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) } + default: + return nil, errors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) } return res, nil @@ -712,6 +948,13 @@ func (s *Journeys) SearchJourneys(ctx context.Context, request *shared.SearchJou // UpdateJourney - updateJourney // Update a Journey func (s *Journeys) UpdateJourney(ctx context.Context, request *shared.JourneyCreationRequest, opts ...operations.Option) (*operations.UpdateJourneyResponse, error) { + hookCtx := hooks.HookContext{ + Context: ctx, + OperationID: "updateJourney", + OAuth2Scopes: []string{}, + SecuritySource: s.sdkConfiguration.Security, + } + o := operations.Options{} supportedOptions := []string{ operations.SupportedOptionRetries, @@ -723,25 +966,27 @@ func (s *Journeys) UpdateJourney(ctx context.Context, request *shared.JourneyCre } } baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) - url := strings.TrimSuffix(baseURL, "/") + "/v1/journey/configuration" + opURL, err := url.JoinPath(baseURL, "/v1/journey/configuration") + if err != nil { + return nil, fmt.Errorf("error generating URL: %w", err) + } bodyReader, reqContentType, err := utils.SerializeRequestBody(ctx, request, false, true, "Request", "json", `request:"mediaType=application/json"`) if err != nil { - return nil, fmt.Errorf("error serializing request body: %w", err) + return nil, err } - debugBody := bytes.NewBuffer([]byte{}) - debugReader := io.TeeReader(bodyReader, debugBody) - req, err := http.NewRequestWithContext(ctx, "PUT", url, debugReader) + req, err := http.NewRequestWithContext(ctx, "PUT", opURL, bodyReader) if err != nil { return nil, fmt.Errorf("error creating request: %w", err) } req.Header.Set("Accept", "application/json") - req.Header.Set("user-agent", s.sdkConfiguration.UserAgent) - + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) req.Header.Set("Content-Type", reqContentType) - client := s.sdkConfiguration.SecurityClient + if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil { + return nil, err + } globalRetryConfig := s.sdkConfiguration.RetryConfig retryConfig := o.Retries @@ -768,34 +1013,57 @@ func (s *Journeys) UpdateJourney(ctx context.Context, request *shared.JourneyCre "5XX", }, }, func() (*http.Response, error) { - return client.Do(req) + if req.Body != nil { + copyBody, err := req.GetBody() + if err != nil { + return nil, err + } + req.Body = copyBody + } + + req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, backoff.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err }) if err != nil { - return nil, fmt.Errorf("error sending request: %w", err) + return nil, err + } else { + httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } } - if httpRes == nil { - return nil, fmt.Errorf("error sending request: no response") + + res := &operations.UpdateJourneyResponse{ + StatusCode: httpRes.StatusCode, + ContentType: httpRes.Header.Get("Content-Type"), + RawResponse: httpRes, } rawBody, err := io.ReadAll(httpRes.Body) if err != nil { return nil, fmt.Errorf("error reading response body: %w", err) } - httpRes.Request.Body = io.NopCloser(debugBody) httpRes.Body.Close() httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody)) - contentType := httpRes.Header.Get("Content-Type") - - res := &operations.UpdateJourneyResponse{ - StatusCode: httpRes.StatusCode, - ContentType: contentType, - RawResponse: httpRes, - } switch { case httpRes.StatusCode == 200: switch { - case utils.MatchContentType(contentType, `application/json`): + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): var out shared.JourneyResponse if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { return nil, err @@ -803,8 +1071,10 @@ func (s *Journeys) UpdateJourney(ctx context.Context, request *shared.JourneyCre res.JourneyResponse = &out default: - return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", contentType), httpRes.StatusCode, string(rawBody), httpRes) + return nil, errors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) } + default: + return nil, errors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) } return res, nil diff --git a/internal/sdk/journeysv2.go b/internal/sdk/journeysv2.go index e548212..7f6b06f 100644 --- a/internal/sdk/journeysv2.go +++ b/internal/sdk/journeysv2.go @@ -6,13 +6,15 @@ import ( "bytes" "context" "fmt" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/operations" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/sdkerrors" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/shared" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/utils" + "github.com/cenkalti/backoff/v4" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/internal/hooks" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/internal/utils" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/errors" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/operations" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/shared" "io" "net/http" - "strings" + "net/url" ) type JourneysV2 struct { @@ -28,6 +30,13 @@ func newJourneysV2(sdkConfig sdkConfiguration) *JourneysV2 { // CreateJourneyV2 - createJourneyV2 // Create a Journey func (s *JourneysV2) CreateJourneyV2(ctx context.Context, request *shared.JourneyCreationRequestV2, opts ...operations.Option) (*operations.CreateJourneyV2Response, error) { + hookCtx := hooks.HookContext{ + Context: ctx, + OperationID: "createJourneyV2", + OAuth2Scopes: []string{}, + SecuritySource: s.sdkConfiguration.Security, + } + o := operations.Options{} supportedOptions := []string{ operations.SupportedOptionRetries, @@ -39,25 +48,27 @@ func (s *JourneysV2) CreateJourneyV2(ctx context.Context, request *shared.Journe } } baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) - url := strings.TrimSuffix(baseURL, "/") + "/v2/journey/configuration" + opURL, err := url.JoinPath(baseURL, "/v2/journey/configuration") + if err != nil { + return nil, fmt.Errorf("error generating URL: %w", err) + } bodyReader, reqContentType, err := utils.SerializeRequestBody(ctx, request, false, true, "Request", "json", `request:"mediaType=application/json"`) if err != nil { - return nil, fmt.Errorf("error serializing request body: %w", err) + return nil, err } - debugBody := bytes.NewBuffer([]byte{}) - debugReader := io.TeeReader(bodyReader, debugBody) - req, err := http.NewRequestWithContext(ctx, "POST", url, debugReader) + req, err := http.NewRequestWithContext(ctx, "POST", opURL, bodyReader) if err != nil { return nil, fmt.Errorf("error creating request: %w", err) } req.Header.Set("Accept", "application/json") - req.Header.Set("user-agent", s.sdkConfiguration.UserAgent) - + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) req.Header.Set("Content-Type", reqContentType) - client := s.sdkConfiguration.SecurityClient + if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil { + return nil, err + } globalRetryConfig := s.sdkConfiguration.RetryConfig retryConfig := o.Retries @@ -84,34 +95,57 @@ func (s *JourneysV2) CreateJourneyV2(ctx context.Context, request *shared.Journe "5XX", }, }, func() (*http.Response, error) { - return client.Do(req) + if req.Body != nil { + copyBody, err := req.GetBody() + if err != nil { + return nil, err + } + req.Body = copyBody + } + + req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, backoff.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err }) if err != nil { - return nil, fmt.Errorf("error sending request: %w", err) + return nil, err + } else { + httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } } - if httpRes == nil { - return nil, fmt.Errorf("error sending request: no response") + + res := &operations.CreateJourneyV2Response{ + StatusCode: httpRes.StatusCode, + ContentType: httpRes.Header.Get("Content-Type"), + RawResponse: httpRes, } rawBody, err := io.ReadAll(httpRes.Body) if err != nil { return nil, fmt.Errorf("error reading response body: %w", err) } - httpRes.Request.Body = io.NopCloser(debugBody) httpRes.Body.Close() httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody)) - contentType := httpRes.Header.Get("Content-Type") - - res := &operations.CreateJourneyV2Response{ - StatusCode: httpRes.StatusCode, - ContentType: contentType, - RawResponse: httpRes, - } switch { case httpRes.StatusCode == 201: switch { - case utils.MatchContentType(contentType, `application/json`): + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): var out shared.JourneyCreationRequestV2 if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { return nil, err @@ -119,8 +153,10 @@ func (s *JourneysV2) CreateJourneyV2(ctx context.Context, request *shared.Journe res.JourneyCreationRequestV2 = &out default: - return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", contentType), httpRes.StatusCode, string(rawBody), httpRes) + return nil, errors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) } + default: + return nil, errors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) } return res, nil @@ -129,6 +165,13 @@ func (s *JourneysV2) CreateJourneyV2(ctx context.Context, request *shared.Journe // GetJourneyV2 - getJourneyV2 // Get journey by id func (s *JourneysV2) GetJourneyV2(ctx context.Context, request operations.GetJourneyV2Request, opts ...operations.Option) (*operations.GetJourneyV2Response, error) { + hookCtx := hooks.HookContext{ + Context: ctx, + OperationID: "getJourneyV2", + OAuth2Scopes: []string{}, + SecuritySource: nil, + } + o := operations.Options{} supportedOptions := []string{ operations.SupportedOptionRetries, @@ -140,19 +183,17 @@ func (s *JourneysV2) GetJourneyV2(ctx context.Context, request operations.GetJou } } baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) - url, err := utils.GenerateURL(ctx, baseURL, "/v2/journey/configuration/{id}", request, nil) + opURL, err := utils.GenerateURL(ctx, baseURL, "/v2/journey/configuration/{id}", request, nil) if err != nil { return nil, fmt.Errorf("error generating URL: %w", err) } - req, err := http.NewRequestWithContext(ctx, "GET", url, nil) + req, err := http.NewRequestWithContext(ctx, "GET", opURL, nil) if err != nil { return nil, fmt.Errorf("error creating request: %w", err) } req.Header.Set("Accept", "application/json") - req.Header.Set("user-agent", s.sdkConfiguration.UserAgent) - - client := s.sdkConfiguration.SecurityClient + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) globalRetryConfig := s.sdkConfiguration.RetryConfig retryConfig := o.Retries @@ -179,13 +220,44 @@ func (s *JourneysV2) GetJourneyV2(ctx context.Context, request operations.GetJou "5XX", }, }, func() (*http.Response, error) { - return client.Do(req) + if req.Body != nil { + copyBody, err := req.GetBody() + if err != nil { + return nil, err + } + req.Body = copyBody + } + + req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, backoff.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err }) if err != nil { - return nil, fmt.Errorf("error sending request: %w", err) + return nil, err + } else { + httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } } - if httpRes == nil { - return nil, fmt.Errorf("error sending request: no response") + + res := &operations.GetJourneyV2Response{ + StatusCode: httpRes.StatusCode, + ContentType: httpRes.Header.Get("Content-Type"), + RawResponse: httpRes, } rawBody, err := io.ReadAll(httpRes.Body) @@ -195,17 +267,10 @@ func (s *JourneysV2) GetJourneyV2(ctx context.Context, request operations.GetJou httpRes.Body.Close() httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody)) - contentType := httpRes.Header.Get("Content-Type") - - res := &operations.GetJourneyV2Response{ - StatusCode: httpRes.StatusCode, - ContentType: contentType, - RawResponse: httpRes, - } switch { case httpRes.StatusCode == 200: switch { - case utils.MatchContentType(contentType, `application/json`): + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): var out shared.JourneyCreationRequestV2 if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { return nil, err @@ -213,8 +278,10 @@ func (s *JourneysV2) GetJourneyV2(ctx context.Context, request operations.GetJou res.JourneyCreationRequestV2 = &out default: - return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", contentType), httpRes.StatusCode, string(rawBody), httpRes) + return nil, errors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) } + default: + return nil, errors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) } return res, nil @@ -223,6 +290,13 @@ func (s *JourneysV2) GetJourneyV2(ctx context.Context, request operations.GetJou // PatchUpdateJourneyV2 - patchUpdateJourneyV2 // Update a Journey (partially / patch). Support for nested properties updates (e.g. "property[0].name"). func (s *JourneysV2) PatchUpdateJourneyV2(ctx context.Context, request *shared.PatchUpdateJourneyRequest, opts ...operations.Option) (*operations.PatchUpdateJourneyV2Response, error) { + hookCtx := hooks.HookContext{ + Context: ctx, + OperationID: "patchUpdateJourneyV2", + OAuth2Scopes: []string{}, + SecuritySource: s.sdkConfiguration.Security, + } + o := operations.Options{} supportedOptions := []string{ operations.SupportedOptionRetries, @@ -234,25 +308,27 @@ func (s *JourneysV2) PatchUpdateJourneyV2(ctx context.Context, request *shared.P } } baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) - url := strings.TrimSuffix(baseURL, "/") + "/v2/journey/configuration" + opURL, err := url.JoinPath(baseURL, "/v2/journey/configuration") + if err != nil { + return nil, fmt.Errorf("error generating URL: %w", err) + } bodyReader, reqContentType, err := utils.SerializeRequestBody(ctx, request, false, true, "Request", "json", `request:"mediaType=application/json"`) if err != nil { - return nil, fmt.Errorf("error serializing request body: %w", err) + return nil, err } - debugBody := bytes.NewBuffer([]byte{}) - debugReader := io.TeeReader(bodyReader, debugBody) - req, err := http.NewRequestWithContext(ctx, "PATCH", url, debugReader) + req, err := http.NewRequestWithContext(ctx, "PATCH", opURL, bodyReader) if err != nil { return nil, fmt.Errorf("error creating request: %w", err) } req.Header.Set("Accept", "application/json") - req.Header.Set("user-agent", s.sdkConfiguration.UserAgent) - + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) req.Header.Set("Content-Type", reqContentType) - client := s.sdkConfiguration.SecurityClient + if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil { + return nil, err + } globalRetryConfig := s.sdkConfiguration.RetryConfig retryConfig := o.Retries @@ -279,34 +355,57 @@ func (s *JourneysV2) PatchUpdateJourneyV2(ctx context.Context, request *shared.P "5XX", }, }, func() (*http.Response, error) { - return client.Do(req) + if req.Body != nil { + copyBody, err := req.GetBody() + if err != nil { + return nil, err + } + req.Body = copyBody + } + + req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, backoff.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err }) if err != nil { - return nil, fmt.Errorf("error sending request: %w", err) + return nil, err + } else { + httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } } - if httpRes == nil { - return nil, fmt.Errorf("error sending request: no response") + + res := &operations.PatchUpdateJourneyV2Response{ + StatusCode: httpRes.StatusCode, + ContentType: httpRes.Header.Get("Content-Type"), + RawResponse: httpRes, } rawBody, err := io.ReadAll(httpRes.Body) if err != nil { return nil, fmt.Errorf("error reading response body: %w", err) } - httpRes.Request.Body = io.NopCloser(debugBody) httpRes.Body.Close() httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody)) - contentType := httpRes.Header.Get("Content-Type") - - res := &operations.PatchUpdateJourneyV2Response{ - StatusCode: httpRes.StatusCode, - ContentType: contentType, - RawResponse: httpRes, - } switch { case httpRes.StatusCode == 200: switch { - case utils.MatchContentType(contentType, `application/json`): + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): var out shared.JourneyCreationRequestV2 if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { return nil, err @@ -314,8 +413,10 @@ func (s *JourneysV2) PatchUpdateJourneyV2(ctx context.Context, request *shared.P res.JourneyCreationRequestV2 = &out default: - return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", contentType), httpRes.StatusCode, string(rawBody), httpRes) + return nil, errors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) } + default: + return nil, errors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) } return res, nil @@ -324,6 +425,13 @@ func (s *JourneysV2) PatchUpdateJourneyV2(ctx context.Context, request *shared.P // RemoveJourneyV2 - removeJourneyV2 // Remove journey by id func (s *JourneysV2) RemoveJourneyV2(ctx context.Context, request operations.RemoveJourneyV2Request, opts ...operations.Option) (*operations.RemoveJourneyV2Response, error) { + hookCtx := hooks.HookContext{ + Context: ctx, + OperationID: "removeJourneyV2", + OAuth2Scopes: []string{}, + SecuritySource: s.sdkConfiguration.Security, + } + o := operations.Options{} supportedOptions := []string{ operations.SupportedOptionRetries, @@ -335,19 +443,21 @@ func (s *JourneysV2) RemoveJourneyV2(ctx context.Context, request operations.Rem } } baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) - url, err := utils.GenerateURL(ctx, baseURL, "/v2/journey/configuration/{id}", request, nil) + opURL, err := utils.GenerateURL(ctx, baseURL, "/v2/journey/configuration/{id}", request, nil) if err != nil { return nil, fmt.Errorf("error generating URL: %w", err) } - req, err := http.NewRequestWithContext(ctx, "DELETE", url, nil) + req, err := http.NewRequestWithContext(ctx, "DELETE", opURL, nil) if err != nil { return nil, fmt.Errorf("error creating request: %w", err) } req.Header.Set("Accept", "*/*") - req.Header.Set("user-agent", s.sdkConfiguration.UserAgent) + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) - client := s.sdkConfiguration.SecurityClient + if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil { + return nil, err + } globalRetryConfig := s.sdkConfiguration.RetryConfig retryConfig := o.Retries @@ -374,13 +484,44 @@ func (s *JourneysV2) RemoveJourneyV2(ctx context.Context, request operations.Rem "5XX", }, }, func() (*http.Response, error) { - return client.Do(req) + if req.Body != nil { + copyBody, err := req.GetBody() + if err != nil { + return nil, err + } + req.Body = copyBody + } + + req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, backoff.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err }) if err != nil { - return nil, fmt.Errorf("error sending request: %w", err) + return nil, err + } else { + httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } } - if httpRes == nil { - return nil, fmt.Errorf("error sending request: no response") + + res := &operations.RemoveJourneyV2Response{ + StatusCode: httpRes.StatusCode, + ContentType: httpRes.Header.Get("Content-Type"), + RawResponse: httpRes, } rawBody, err := io.ReadAll(httpRes.Body) @@ -390,15 +531,10 @@ func (s *JourneysV2) RemoveJourneyV2(ctx context.Context, request operations.Rem httpRes.Body.Close() httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody)) - contentType := httpRes.Header.Get("Content-Type") - - res := &operations.RemoveJourneyV2Response{ - StatusCode: httpRes.StatusCode, - ContentType: contentType, - RawResponse: httpRes, - } switch { case httpRes.StatusCode == 200: + default: + return nil, errors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) } return res, nil @@ -407,6 +543,13 @@ func (s *JourneysV2) RemoveJourneyV2(ctx context.Context, request operations.Rem // UpdateJourneyV2 - updateJourneyV2 // Update a Journey func (s *JourneysV2) UpdateJourneyV2(ctx context.Context, request *shared.JourneyCreationRequestV2, opts ...operations.Option) (*operations.UpdateJourneyV2Response, error) { + hookCtx := hooks.HookContext{ + Context: ctx, + OperationID: "updateJourneyV2", + OAuth2Scopes: []string{}, + SecuritySource: s.sdkConfiguration.Security, + } + o := operations.Options{} supportedOptions := []string{ operations.SupportedOptionRetries, @@ -418,25 +561,27 @@ func (s *JourneysV2) UpdateJourneyV2(ctx context.Context, request *shared.Journe } } baseURL := utils.ReplaceParameters(s.sdkConfiguration.GetServerDetails()) - url := strings.TrimSuffix(baseURL, "/") + "/v2/journey/configuration" + opURL, err := url.JoinPath(baseURL, "/v2/journey/configuration") + if err != nil { + return nil, fmt.Errorf("error generating URL: %w", err) + } bodyReader, reqContentType, err := utils.SerializeRequestBody(ctx, request, false, true, "Request", "json", `request:"mediaType=application/json"`) if err != nil { - return nil, fmt.Errorf("error serializing request body: %w", err) + return nil, err } - debugBody := bytes.NewBuffer([]byte{}) - debugReader := io.TeeReader(bodyReader, debugBody) - req, err := http.NewRequestWithContext(ctx, "PUT", url, debugReader) + req, err := http.NewRequestWithContext(ctx, "PUT", opURL, bodyReader) if err != nil { return nil, fmt.Errorf("error creating request: %w", err) } req.Header.Set("Accept", "application/json") - req.Header.Set("user-agent", s.sdkConfiguration.UserAgent) - + req.Header.Set("User-Agent", s.sdkConfiguration.UserAgent) req.Header.Set("Content-Type", reqContentType) - client := s.sdkConfiguration.SecurityClient + if err := utils.PopulateSecurity(ctx, req, s.sdkConfiguration.Security); err != nil { + return nil, err + } globalRetryConfig := s.sdkConfiguration.RetryConfig retryConfig := o.Retries @@ -463,34 +608,57 @@ func (s *JourneysV2) UpdateJourneyV2(ctx context.Context, request *shared.Journe "5XX", }, }, func() (*http.Response, error) { - return client.Do(req) + if req.Body != nil { + copyBody, err := req.GetBody() + if err != nil { + return nil, err + } + req.Body = copyBody + } + + req, err = s.sdkConfiguration.Hooks.BeforeRequest(hooks.BeforeRequestContext{HookContext: hookCtx}, req) + if err != nil { + return nil, backoff.Permanent(err) + } + + httpRes, err := s.sdkConfiguration.Client.Do(req) + if err != nil || httpRes == nil { + if err != nil { + err = fmt.Errorf("error sending request: %w", err) + } else { + err = fmt.Errorf("error sending request: no response") + } + + _, err = s.sdkConfiguration.Hooks.AfterError(hooks.AfterErrorContext{HookContext: hookCtx}, nil, err) + } + return httpRes, err }) if err != nil { - return nil, fmt.Errorf("error sending request: %w", err) + return nil, err + } else { + httpRes, err = s.sdkConfiguration.Hooks.AfterSuccess(hooks.AfterSuccessContext{HookContext: hookCtx}, httpRes) + if err != nil { + return nil, err + } } - if httpRes == nil { - return nil, fmt.Errorf("error sending request: no response") + + res := &operations.UpdateJourneyV2Response{ + StatusCode: httpRes.StatusCode, + ContentType: httpRes.Header.Get("Content-Type"), + RawResponse: httpRes, } rawBody, err := io.ReadAll(httpRes.Body) if err != nil { return nil, fmt.Errorf("error reading response body: %w", err) } - httpRes.Request.Body = io.NopCloser(debugBody) httpRes.Body.Close() httpRes.Body = io.NopCloser(bytes.NewBuffer(rawBody)) - contentType := httpRes.Header.Get("Content-Type") - - res := &operations.UpdateJourneyV2Response{ - StatusCode: httpRes.StatusCode, - ContentType: contentType, - RawResponse: httpRes, - } switch { case httpRes.StatusCode == 200: switch { - case utils.MatchContentType(contentType, `application/json`): + case utils.MatchContentType(httpRes.Header.Get("Content-Type"), `application/json`): var out shared.JourneyCreationRequestV2 if err := utils.UnmarshalJsonFromResponseBody(bytes.NewBuffer(rawBody), &out, ""); err != nil { return nil, err @@ -498,8 +666,10 @@ func (s *JourneysV2) UpdateJourneyV2(ctx context.Context, request *shared.Journe res.JourneyCreationRequestV2 = &out default: - return nil, sdkerrors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", contentType), httpRes.StatusCode, string(rawBody), httpRes) + return nil, errors.NewSDKError(fmt.Sprintf("unknown content-type received: %s", httpRes.Header.Get("Content-Type")), httpRes.StatusCode, string(rawBody), httpRes) } + default: + return nil, errors.NewSDKError("unknown status code returned", httpRes.StatusCode, string(rawBody), httpRes) } return res, nil diff --git a/internal/sdk/pkg/models/sdkerrors/sdkerror.go b/internal/sdk/models/errors/sdkerror.go similarity index 97% rename from internal/sdk/pkg/models/sdkerrors/sdkerror.go rename to internal/sdk/models/errors/sdkerror.go index 5c1affd..c5a89b6 100644 --- a/internal/sdk/pkg/models/sdkerrors/sdkerror.go +++ b/internal/sdk/models/errors/sdkerror.go @@ -1,6 +1,6 @@ // Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT. -package sdkerrors +package errors import ( "fmt" diff --git a/internal/sdk/pkg/models/operations/createjourney.go b/internal/sdk/models/operations/createjourney.go similarity index 98% rename from internal/sdk/pkg/models/operations/createjourney.go rename to internal/sdk/models/operations/createjourney.go index 4794981..d0f04f2 100644 --- a/internal/sdk/pkg/models/operations/createjourney.go +++ b/internal/sdk/models/operations/createjourney.go @@ -3,7 +3,7 @@ package operations import ( - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/shared" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/shared" "net/http" ) diff --git a/internal/sdk/pkg/models/operations/createjourneyv2.go b/internal/sdk/models/operations/createjourneyv2.go similarity index 97% rename from internal/sdk/pkg/models/operations/createjourneyv2.go rename to internal/sdk/models/operations/createjourneyv2.go index 0f64795..f42bf08 100644 --- a/internal/sdk/pkg/models/operations/createjourneyv2.go +++ b/internal/sdk/models/operations/createjourneyv2.go @@ -3,7 +3,7 @@ package operations import ( - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/shared" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/shared" "net/http" ) diff --git a/internal/sdk/pkg/models/operations/getjourney.go b/internal/sdk/models/operations/getjourney.go similarity index 98% rename from internal/sdk/pkg/models/operations/getjourney.go rename to internal/sdk/models/operations/getjourney.go index 3db210a..d8be26d 100644 --- a/internal/sdk/pkg/models/operations/getjourney.go +++ b/internal/sdk/models/operations/getjourney.go @@ -3,7 +3,7 @@ package operations import ( - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/shared" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/shared" "net/http" ) diff --git a/internal/sdk/pkg/models/operations/getjourneyproducts.go b/internal/sdk/models/operations/getjourneyproducts.go similarity index 98% rename from internal/sdk/pkg/models/operations/getjourneyproducts.go rename to internal/sdk/models/operations/getjourneyproducts.go index 7d4c5ed..7717aa3 100644 --- a/internal/sdk/pkg/models/operations/getjourneyproducts.go +++ b/internal/sdk/models/operations/getjourneyproducts.go @@ -3,7 +3,7 @@ package operations import ( - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/shared" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/shared" "net/http" ) diff --git a/internal/sdk/pkg/models/operations/getjourneysbyorgid.go b/internal/sdk/models/operations/getjourneysbyorgid.go similarity index 98% rename from internal/sdk/pkg/models/operations/getjourneysbyorgid.go rename to internal/sdk/models/operations/getjourneysbyorgid.go index b811349..96b1bb8 100644 --- a/internal/sdk/pkg/models/operations/getjourneysbyorgid.go +++ b/internal/sdk/models/operations/getjourneysbyorgid.go @@ -3,7 +3,7 @@ package operations import ( - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/shared" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/shared" "net/http" ) diff --git a/internal/sdk/pkg/models/operations/getjourneyv2.go b/internal/sdk/models/operations/getjourneyv2.go similarity index 97% rename from internal/sdk/pkg/models/operations/getjourneyv2.go rename to internal/sdk/models/operations/getjourneyv2.go index 4c67be0..d57d305 100644 --- a/internal/sdk/pkg/models/operations/getjourneyv2.go +++ b/internal/sdk/models/operations/getjourneyv2.go @@ -3,7 +3,7 @@ package operations import ( - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/shared" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/shared" "net/http" ) diff --git a/internal/sdk/pkg/models/operations/options.go b/internal/sdk/models/operations/options.go similarity index 99% rename from internal/sdk/pkg/models/operations/options.go rename to internal/sdk/models/operations/options.go index 6ecbd47..1b1a3b3 100644 --- a/internal/sdk/pkg/models/operations/options.go +++ b/internal/sdk/models/operations/options.go @@ -4,7 +4,7 @@ package operations import ( "errors" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/utils" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/internal/utils" ) var ErrUnsupportedOption = errors.New("unsupported option") diff --git a/internal/sdk/pkg/models/operations/patchupdatejourney.go b/internal/sdk/models/operations/patchupdatejourney.go similarity index 97% rename from internal/sdk/pkg/models/operations/patchupdatejourney.go rename to internal/sdk/models/operations/patchupdatejourney.go index f74b6f8..456851d 100644 --- a/internal/sdk/pkg/models/operations/patchupdatejourney.go +++ b/internal/sdk/models/operations/patchupdatejourney.go @@ -3,7 +3,7 @@ package operations import ( - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/shared" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/shared" "net/http" ) diff --git a/internal/sdk/pkg/models/operations/patchupdatejourneyv2.go b/internal/sdk/models/operations/patchupdatejourneyv2.go similarity index 97% rename from internal/sdk/pkg/models/operations/patchupdatejourneyv2.go rename to internal/sdk/models/operations/patchupdatejourneyv2.go index 2acd444..f617e90 100644 --- a/internal/sdk/pkg/models/operations/patchupdatejourneyv2.go +++ b/internal/sdk/models/operations/patchupdatejourneyv2.go @@ -3,7 +3,7 @@ package operations import ( - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/shared" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/shared" "net/http" ) diff --git a/internal/sdk/pkg/models/operations/removejourney.go b/internal/sdk/models/operations/removejourney.go similarity index 100% rename from internal/sdk/pkg/models/operations/removejourney.go rename to internal/sdk/models/operations/removejourney.go diff --git a/internal/sdk/pkg/models/operations/removejourneyv2.go b/internal/sdk/models/operations/removejourneyv2.go similarity index 100% rename from internal/sdk/pkg/models/operations/removejourneyv2.go rename to internal/sdk/models/operations/removejourneyv2.go diff --git a/internal/sdk/pkg/models/operations/searchjourneys.go b/internal/sdk/models/operations/searchjourneys.go similarity index 97% rename from internal/sdk/pkg/models/operations/searchjourneys.go rename to internal/sdk/models/operations/searchjourneys.go index 796d5d0..4ff3db6 100644 --- a/internal/sdk/pkg/models/operations/searchjourneys.go +++ b/internal/sdk/models/operations/searchjourneys.go @@ -3,7 +3,7 @@ package operations import ( - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/shared" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/shared" "net/http" ) diff --git a/internal/sdk/pkg/models/operations/updatejourney.go b/internal/sdk/models/operations/updatejourney.go similarity index 97% rename from internal/sdk/pkg/models/operations/updatejourney.go rename to internal/sdk/models/operations/updatejourney.go index d3f062c..2ec18b2 100644 --- a/internal/sdk/pkg/models/operations/updatejourney.go +++ b/internal/sdk/models/operations/updatejourney.go @@ -3,7 +3,7 @@ package operations import ( - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/shared" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/shared" "net/http" ) diff --git a/internal/sdk/pkg/models/operations/updatejourneyv2.go b/internal/sdk/models/operations/updatejourneyv2.go similarity index 97% rename from internal/sdk/pkg/models/operations/updatejourneyv2.go rename to internal/sdk/models/operations/updatejourneyv2.go index d72aa2c..d54efb3 100644 --- a/internal/sdk/pkg/models/operations/updatejourneyv2.go +++ b/internal/sdk/models/operations/updatejourneyv2.go @@ -3,7 +3,7 @@ package operations import ( - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/shared" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/shared" "net/http" ) diff --git a/internal/sdk/pkg/models/shared/getjourneysresponse.go b/internal/sdk/models/shared/getjourneysresponse.go similarity index 100% rename from internal/sdk/pkg/models/shared/getjourneysresponse.go rename to internal/sdk/models/shared/getjourneysresponse.go diff --git a/internal/sdk/pkg/models/shared/journey.go b/internal/sdk/models/shared/journey.go similarity index 99% rename from internal/sdk/pkg/models/shared/journey.go rename to internal/sdk/models/shared/journey.go index 00cc97f..65497b0 100644 --- a/internal/sdk/pkg/models/shared/journey.go +++ b/internal/sdk/models/shared/journey.go @@ -5,7 +5,7 @@ package shared import ( "encoding/json" "fmt" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/utils" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/internal/utils" ) type Design struct { diff --git a/internal/sdk/pkg/models/shared/journeycreationrequest.go b/internal/sdk/models/shared/journeycreationrequest.go similarity index 99% rename from internal/sdk/pkg/models/shared/journeycreationrequest.go rename to internal/sdk/models/shared/journeycreationrequest.go index 48ffc33..b3b67b8 100644 --- a/internal/sdk/pkg/models/shared/journeycreationrequest.go +++ b/internal/sdk/models/shared/journeycreationrequest.go @@ -5,7 +5,7 @@ package shared import ( "encoding/json" "fmt" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/utils" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/internal/utils" ) type JourneyCreationRequestDesign struct { diff --git a/internal/sdk/pkg/models/shared/journeycreationrequestv2.go b/internal/sdk/models/shared/journeycreationrequestv2.go similarity index 100% rename from internal/sdk/pkg/models/shared/journeycreationrequestv2.go rename to internal/sdk/models/shared/journeycreationrequestv2.go diff --git a/internal/sdk/pkg/models/shared/journeyproductsresponse.go b/internal/sdk/models/shared/journeyproductsresponse.go similarity index 100% rename from internal/sdk/pkg/models/shared/journeyproductsresponse.go rename to internal/sdk/models/shared/journeyproductsresponse.go diff --git a/internal/sdk/pkg/models/shared/journeyresponse.go b/internal/sdk/models/shared/journeyresponse.go similarity index 100% rename from internal/sdk/pkg/models/shared/journeyresponse.go rename to internal/sdk/models/shared/journeyresponse.go diff --git a/internal/sdk/pkg/models/shared/patchupdatejourneyrequest.go b/internal/sdk/models/shared/patchupdatejourneyrequest.go similarity index 97% rename from internal/sdk/pkg/models/shared/patchupdatejourneyrequest.go rename to internal/sdk/models/shared/patchupdatejourneyrequest.go index 54ee9c4..9bddb9c 100644 --- a/internal/sdk/pkg/models/shared/patchupdatejourneyrequest.go +++ b/internal/sdk/models/shared/patchupdatejourneyrequest.go @@ -3,7 +3,7 @@ package shared import ( - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/utils" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/internal/utils" ) // PatchUpdateJourneyRequest - Patch request to update a journey (journey id is required) Support for nested properties (e.g. steps[0].uischema.elements[0].products) is supported. diff --git a/internal/sdk/pkg/models/shared/searchjourneysqueryrequest.go b/internal/sdk/models/shared/searchjourneysqueryrequest.go similarity index 98% rename from internal/sdk/pkg/models/shared/searchjourneysqueryrequest.go rename to internal/sdk/models/shared/searchjourneysqueryrequest.go index 7297e73..3f08fdd 100644 --- a/internal/sdk/pkg/models/shared/searchjourneysqueryrequest.go +++ b/internal/sdk/models/shared/searchjourneysqueryrequest.go @@ -3,7 +3,7 @@ package shared import ( - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/utils" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/internal/utils" ) type SearchJourneysQueryRequest struct { diff --git a/internal/sdk/pkg/models/shared/searchjourneysresponse.go b/internal/sdk/models/shared/searchjourneysresponse.go similarity index 99% rename from internal/sdk/pkg/models/shared/searchjourneysresponse.go rename to internal/sdk/models/shared/searchjourneysresponse.go index 76f09db..147837a 100644 --- a/internal/sdk/pkg/models/shared/searchjourneysresponse.go +++ b/internal/sdk/models/shared/searchjourneysresponse.go @@ -5,7 +5,7 @@ package shared import ( "encoding/json" "fmt" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/utils" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/internal/utils" "time" ) diff --git a/internal/sdk/pkg/models/shared/security.go b/internal/sdk/models/shared/security.go similarity index 100% rename from internal/sdk/pkg/models/shared/security.go rename to internal/sdk/models/shared/security.go diff --git a/internal/sdk/sdk.go b/internal/sdk/sdk.go index 0fd7f5b..9069ee3 100644 --- a/internal/sdk/sdk.go +++ b/internal/sdk/sdk.go @@ -5,8 +5,9 @@ package sdk import ( "context" "fmt" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/models/shared" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/utils" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/internal/hooks" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/internal/utils" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/models/shared" "net/http" "time" ) @@ -40,8 +41,7 @@ func Float32(f float32) *float32 { return &f } func Float64(f float64) *float64 { return &f } type sdkConfiguration struct { - DefaultClient HTTPClient - SecurityClient HTTPClient + Client HTTPClient Security func(context.Context) (interface{}, error) ServerURL string ServerIndex int @@ -51,6 +51,7 @@ type sdkConfiguration struct { GenVersion string UserAgent string RetryConfig *utils.RetryConfig + Hooks *hooks.Hooks } func (c *sdkConfiguration) GetServerDetails() (string, map[string]string) { @@ -103,13 +104,13 @@ func WithServerIndex(serverIndex int) SDKOption { // WithClient allows the overriding of the default HTTP client used by the SDK func WithClient(client HTTPClient) SDKOption { return func(sdk *SDK) { - sdk.sdkConfiguration.DefaultClient = client + sdk.sdkConfiguration.Client = client } } func withSecurity(security interface{}) func(context.Context) (interface{}, error) { return func(context.Context) (interface{}, error) { - return &security, nil + return security, nil } } @@ -141,9 +142,10 @@ func New(opts ...SDKOption) *SDK { sdkConfiguration: sdkConfiguration{ Language: "go", OpenAPIDocVersion: "1.0.0", - SDKVersion: "0.2.7", - GenVersion: "2.230.1", - UserAgent: "speakeasy-sdk/go 0.2.7 2.230.1 1.0.0 epilot-journey", + SDKVersion: "0.0.1", + GenVersion: "2.322.5", + UserAgent: "speakeasy-sdk/go 0.0.1 2.322.5 1.0.0 github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk", + Hooks: hooks.New(), }, } for _, opt := range opts { @@ -151,15 +153,15 @@ func New(opts ...SDKOption) *SDK { } // Use WithClient to override the default client if you would like to customize the timeout - if sdk.sdkConfiguration.DefaultClient == nil { - sdk.sdkConfiguration.DefaultClient = &http.Client{Timeout: 60 * time.Second} + if sdk.sdkConfiguration.Client == nil { + sdk.sdkConfiguration.Client = &http.Client{Timeout: 60 * time.Second} } - if sdk.sdkConfiguration.SecurityClient == nil { - if sdk.sdkConfiguration.Security != nil { - sdk.sdkConfiguration.SecurityClient = utils.ConfigureSecurityClient(sdk.sdkConfiguration.DefaultClient, sdk.sdkConfiguration.Security) - } else { - sdk.sdkConfiguration.SecurityClient = sdk.sdkConfiguration.DefaultClient - } + + currentServerURL, _ := sdk.sdkConfiguration.GetServerDetails() + serverURL := currentServerURL + serverURL, sdk.sdkConfiguration.Client = sdk.sdkConfiguration.Hooks.SDKInit(currentServerURL, sdk.sdkConfiguration.Client) + if serverURL != currentServerURL { + sdk.sdkConfiguration.ServerURL = serverURL } sdk.Journeys = newJourneys(sdk.sdkConfiguration) diff --git a/internal/sdk/pkg/types/bigint.go b/internal/sdk/types/bigint.go similarity index 100% rename from internal/sdk/pkg/types/bigint.go rename to internal/sdk/types/bigint.go diff --git a/internal/sdk/pkg/types/date.go b/internal/sdk/types/date.go similarity index 100% rename from internal/sdk/pkg/types/date.go rename to internal/sdk/types/date.go diff --git a/internal/sdk/pkg/types/datetime.go b/internal/sdk/types/datetime.go similarity index 100% rename from internal/sdk/pkg/types/datetime.go rename to internal/sdk/types/datetime.go diff --git a/internal/sdk/pkg/types/decimal.go b/internal/sdk/types/decimal.go similarity index 100% rename from internal/sdk/pkg/types/decimal.go rename to internal/sdk/types/decimal.go diff --git a/internal/sdk/pkg/types/pointers.go b/internal/sdk/types/pointers.go similarity index 100% rename from internal/sdk/pkg/types/pointers.go rename to internal/sdk/types/pointers.go diff --git a/internal/validators/DateValidator.go b/internal/validators/DateValidator.go index 76420e3..1e050e1 100644 --- a/internal/validators/DateValidator.go +++ b/internal/validators/DateValidator.go @@ -4,7 +4,7 @@ package validators import ( "context" - "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/pkg/types" + "github.com/epilot-dev/terraform-provider-epilot-journey/internal/sdk/types" "github.com/hashicorp/terraform-plugin-framework-validators/helpers/validatordiag" "github.com/hashicorp/terraform-plugin-framework/schema/validator" ) diff --git a/main.go b/main.go index eeef494..340c3ec 100644 --- a/main.go +++ b/main.go @@ -15,7 +15,7 @@ import ( // Run the docs generation tool, check its repository for more information on how it works and how docs // can be customized. -//go:generate go run github.com/hashicorp/terraform-plugin-docs/cmd/tfplugindocs generate --rendered-provider-name terraform-provider-epilot-journey +//go:generate go run github.com/hashicorp/terraform-plugin-docs/cmd/tfplugindocs generate --provider-name terraform-provider-epilot-journey --rendered-provider-name terraform-provider-epilot-journey var ( // these will be set by the goreleaser configuration