From 9ca4a127c29945e37ad4364d4bbba0240ebc4d72 Mon Sep 17 00:00:00 2001 From: Alex Luong Date: Sun, 5 May 2024 01:23:40 +0700 Subject: [PATCH] refactor: Implement interface for source verification provider --- internal/provider/sourceverification/model.go | 52 +-------- .../provider/sourceverification/schema.go | 56 +-------- internal/provider/sourceverification/sdk.go | 107 +----------------- .../sourceverification/verification.go | 24 ++++ .../sourceverification/verification_apikey.go | 31 +++-- .../sourceverification/verification_stripe.go | 32 ++++-- 6 files changed, 79 insertions(+), 223 deletions(-) create mode 100644 internal/provider/sourceverification/verification.go diff --git a/internal/provider/sourceverification/model.go b/internal/provider/sourceverification/model.go index f712291..dc6988e 100644 --- a/internal/provider/sourceverification/model.go +++ b/internal/provider/sourceverification/model.go @@ -9,54 +9,6 @@ type sourceVerificationResourceModel struct { type sourceVerification struct { // generic - APIKey *apiKeySourceVerification `tfsdk:"api_key"` - BasicAuth *basicAuthSourceVerification `tfsdk:"basic_auth"` - HMAC *hmacSourceVerification `tfsdk:"hmac"` - JSON types.String `tfsdk:"json"` - // providers - Adyen *adyenSourceVerification `tfsdk:"adyen"` - Akeneo *akeneoSourceVerification `tfsdk:"akeneo"` - AWSSNS *awsSNSSourceVerification `tfsdk:"aws_sns"` - Cloudsignal *cloudsignalSourceVerification `tfsdk:"cloudsignal"` - Commercelayer *commercelayerSourceVerification `tfsdk:"commercelayer"` - Courier *courierSourceVerification `tfsdk:"courier"` - Ebay *ebaySourceVerification `tfsdk:"ebay"` - Enode *enodeSourceVerification `tfsdk:"enode"` - Favro *favroSourceVerification `tfsdk:"favro"` - FrontApp *frontAppSourceVerification `tfsdk:"frontapp"` - GitHub *githubSourceVerification `tfsdk:"github"` - GitLab *gitlabSourceVerification `tfsdk:"gitlab"` - Linear *linearSourceVerification `tfsdk:"linear"` - Mailgun *mailgunSourceVerification `tfsdk:"mailgun"` - Nmi *nmiSourceVerification `tfsdk:"nmi"` - Orb *orbSourceVerification `tfsdk:"orb"` - Oura *ouraSourceVerification `tfsdk:"oura"` - Persona *personaSourceVerification `tfsdk:"persona"` - Pipedrive *pipedriveSourceVerification `tfsdk:"pipedrive"` - Postmark *postmarkSourceVerification `tfsdk:"postmark"` - PropertyFinder *propertyFinderSourceVerification `tfsdk:"property_finder"` - Pylon *pylonSourceVerification `tfsdk:"pylon"` - Recharge *rechargeSourceVerification `tfsdk:"recharge"` - Repay *repaySourceVerification `tfsdk:"repay"` - Sanity *sanitySourceVerification `tfsdk:"sanity"` - SendGrid *sendgridSourceVerification `tfsdk:"sendgrid"` - Shopify *shopifySourceVerification `tfsdk:"shopify"` - Shopline *shoplineSourceVerification `tfsdk:"shopline"` - Solidgate *solidgateSourceVerification `tfsdk:"solidgate"` - Square *squareSourceVerification `tfsdk:"square"` - Stripe *stripeSourceVerification `tfsdk:"stripe"` - Svix *svixSourceVerification `tfsdk:"svix"` - Synctera *syncteraSourceVerification `tfsdk:"synctera"` - Telnyx *telnyxSourceVerification `tfsdk:"telnyx"` - ThreeDEye *threeDEyeSourceVerification `tfsdk:"threedeye"` - TokenIo *tokenIoSourceVerification `tfsdk:"tokenio"` - Trello *trelloSourceVerification `tfsdk:"trello"` - Twitch *twitchSourceVerification `tfsdk:"twitch"` - Twitter *twitterSourceVerification `tfsdk:"twitter"` - Typeform *typeformSourceVerification `tfsdk:"typeform"` - Wix *wixSourceVerification `tfsdk:"wix"` - WooCommerce *woocommerceSourceVerification `tfsdk:"woocommerce"` - WorkOS *workOSSourceVerification `tfsdk:"workos"` - Xero *xeroSourceVerification `tfsdk:"xero"` - Zoom *zoomSourceVerification `tfsdk:"zoom"` + APIKey *apiKeySourceVerification `tfsdk:"api_key"` + Stripe *stripeSourceVerification `tfsdk:"stripe"` } diff --git a/internal/provider/sourceverification/schema.go b/internal/provider/sourceverification/schema.go index 5992ca5..3662f2f 100644 --- a/internal/provider/sourceverification/schema.go +++ b/internal/provider/sourceverification/schema.go @@ -23,60 +23,8 @@ func (r *sourceVerificationResource) Schema(_ context.Context, _ resource.Schema Description: "ID of the source", }, "verification": schema.SingleNestedAttribute{ - Required: true, - Attributes: map[string]schema.Attribute{ - // generic - "api_key": apiKeyConfigSchema(), - "basic_auth": basicAuthConfigSchema(), - "hmac": hmacConfigSchema(), - "json": jsonConfigSchema(), - // providers - "adyen": adyenConfigSchema(), - "akeneo": akeneoConfigSchema(), - "aws_sns": awsSNSConfigSchema(), - "cloudsignal": cloudsignalConfigSchema(), - "commercelayer": commercelayerConfigSchema(), - "courier": courierConfigSchema(), - "ebay": ebayConfigSchema(), - "enode": enodeConfigSchema(), - "favro": favroConfigSchema(), - "frontapp": frontAppConfigSchema(), - "github": githubConfigSchema(), - "gitlab": gitlabConfigSchema(), - "linear": linearConfigSchema(), - "mailgun": mailgunConfigSchema(), - "nmi": nmiConfigSchema(), - "orb": orbConfigSchema(), - "oura": ouraConfigSchema(), - "persona": personaConfigSchema(), - "pipedrive": pipedriveConfigSchema(), - "postmark": postmarkConfigSchema(), - "property_finder": propertyFinderConfigSchema(), - "pylon": pylonConfigSchema(), - "recharge": rechargeConfigSchema(), - "repay": repayConfigSchema(), - "sanity": sanityConfigSchema(), - "sendgrid": sendgridConfigSchema(), - "shopify": shopifyConfigSchema(), - "shopline": shoplineConfigSchema(), - "solidgate": solidgateConfigSchema(), - "square": squareConfigSchema(), - "stripe": stripeConfigSchema(), - "svix": svixConfigSchema(), - "synctera": syncteraConfigSchema(), - "telnyx": telnyxConfigSchema(), - "threedeye": threeDEyeConfigSchema(), - "tokenio": tokenIoConfigSchema(), - "trello": trelloConfigSchema(), - "twitch": twitchConfigSchema(), - "twitter": twitterConfigSchema(), - "typeform": typeformConfigSchema(), - "wix": wixConfigSchema(), - "woocommerce": woocommerceConfigSchema(), - "workos": workOSConfigSchema(), - "xero": xeroConfigSchema(), - "zoom": zoomConfigSchema(), - }, + Required: true, + Attributes: getSourceVerificationSchemaAttributes(), Validators: []validator.Object{ validators.ExactlyOneChild(), }, diff --git a/internal/provider/sourceverification/sdk.go b/internal/provider/sourceverification/sdk.go index 96f8035..5341a19 100644 --- a/internal/provider/sourceverification/sdk.go +++ b/internal/provider/sourceverification/sdk.go @@ -14,110 +14,9 @@ func (m *sourceVerificationResourceModel) ToCreatePayload() *hookdeck.SourceUpda func (m *sourceVerificationResourceModel) ToUpdatePayload() *hookdeck.SourceUpdateRequest { var verification *hookdeck.VerificationConfig - // generic - if m.Verification.APIKey != nil { - verification = m.Verification.APIKey.toPayload() - } else if m.Verification.BasicAuth != nil { - verification = m.Verification.BasicAuth.toPayload() - } else if m.Verification.HMAC != nil { - verification = m.Verification.HMAC.toPayload() - } else if !m.Verification.JSON.IsUnknown() && !m.Verification.JSON.IsNull() { - verification = jsonToPayload(m.Verification.JSON.ValueString()) - - // providers - } else if m.Verification.Adyen != nil { - verification = m.Verification.Adyen.toPayload() - } else if m.Verification.Akeneo != nil { - verification = m.Verification.Akeneo.toPayload() - } else if m.Verification.AWSSNS != nil { - verification = m.Verification.AWSSNS.toPayload() - } else if m.Verification.Cloudsignal != nil { - verification = m.Verification.Cloudsignal.toPayload() - } else if m.Verification.Commercelayer != nil { - verification = m.Verification.Commercelayer.toPayload() - } else if m.Verification.Courier != nil { - verification = m.Verification.Courier.toPayload() - } else if m.Verification.Ebay != nil { - verification = m.Verification.Ebay.toPayload() - } else if m.Verification.Enode != nil { - verification = m.Verification.Enode.toPayload() - } else if m.Verification.Favro != nil { - verification = m.Verification.Favro.toPayload() - } else if m.Verification.FrontApp != nil { - verification = m.Verification.FrontApp.toPayload() - } else if m.Verification.GitHub != nil { - verification = m.Verification.GitHub.toPayload() - } else if m.Verification.GitLab != nil { - verification = m.Verification.GitLab.toPayload() - } else if m.Verification.Linear != nil { - verification = m.Verification.Linear.toPayload() - } else if m.Verification.Mailgun != nil { - verification = m.Verification.Mailgun.toPayload() - } else if m.Verification.Nmi != nil { - verification = m.Verification.Nmi.toPayload() - } else if m.Verification.Orb != nil { - verification = m.Verification.Orb.toPayload() - } else if m.Verification.Oura != nil { - verification = m.Verification.Oura.toPayload() - } else if m.Verification.Persona != nil { - verification = m.Verification.Persona.toPayload() - } else if m.Verification.Pipedrive != nil { - verification = m.Verification.Pipedrive.toPayload() - } else if m.Verification.Postmark != nil { - verification = m.Verification.Postmark.toPayload() - } else if m.Verification.PropertyFinder != nil { - verification = m.Verification.PropertyFinder.toPayload() - } else if m.Verification.Pylon != nil { - verification = m.Verification.Pylon.toPayload() - } else if m.Verification.Recharge != nil { - verification = m.Verification.Recharge.toPayload() - } else if m.Verification.Repay != nil { - verification = m.Verification.Repay.toPayload() - } else if m.Verification.Sanity != nil { - verification = m.Verification.Sanity.toPayload() - } else if m.Verification.SendGrid != nil { - verification = m.Verification.SendGrid.toPayload() - } else if m.Verification.Shopify != nil { - verification = m.Verification.Shopify.toPayload() - } else if m.Verification.Shopline != nil { - verification = m.Verification.Shopline.toPayload() - } else if m.Verification.Solidgate != nil { - verification = m.Verification.Solidgate.toPayload() - } else if m.Verification.Square != nil { - verification = m.Verification.Square.toPayload() - } else if m.Verification.Stripe != nil { - verification = m.Verification.Stripe.toPayload() - } else if m.Verification.Svix != nil { - verification = m.Verification.Svix.toPayload() - } else if m.Verification.Synctera != nil { - verification = m.Verification.Synctera.toPayload() - } else if m.Verification.Telnyx != nil { - verification = m.Verification.Telnyx.toPayload() - } else if m.Verification.ThreeDEye != nil { - verification = m.Verification.ThreeDEye.toPayload() - } else if m.Verification.TokenIo != nil { - verification = m.Verification.TokenIo.toPayload() - } else if m.Verification.Trello != nil { - verification = m.Verification.Trello.toPayload() - } else if m.Verification.Twitch != nil { - verification = m.Verification.Twitch.toPayload() - } else if m.Verification.Twitter != nil { - verification = m.Verification.Twitter.toPayload() - } else if m.Verification.Typeform != nil { - verification = m.Verification.Typeform.toPayload() - } else if m.Verification.Wix != nil { - verification = m.Verification.Wix.toPayload() - } else if m.Verification.WooCommerce != nil { - verification = m.Verification.WooCommerce.toPayload() - } else if m.Verification.WorkOS != nil { - verification = m.Verification.WorkOS.toPayload() - } else if m.Verification.Xero != nil { - verification = m.Verification.Xero.toPayload() - } else if m.Verification.Zoom != nil { - verification = m.Verification.Zoom.toPayload() - } else { - return &hookdeck.SourceUpdateRequest{ - Verification: hookdeck.Null[hookdeck.VerificationConfig](), + for _, provider := range providers { + if verification == nil { + verification = provider.toPayload(m.Verification) } } diff --git a/internal/provider/sourceverification/verification.go b/internal/provider/sourceverification/verification.go new file mode 100644 index 0000000..d617971 --- /dev/null +++ b/internal/provider/sourceverification/verification.go @@ -0,0 +1,24 @@ +package sourceverification + +import ( + "github.com/hashicorp/terraform-plugin-framework/resource/schema" + hookdeck "github.com/hookdeck/hookdeck-go-sdk" +) + +type sourceVerificationProvider interface { + getSchemaName() string + getSchemaValue() schema.SingleNestedAttribute + toPayload(sourceVerification *sourceVerification) *hookdeck.VerificationConfig +} + +var providers []sourceVerificationProvider + +func getSourceVerificationSchemaAttributes() map[string]schema.Attribute { + attributes := map[string]schema.Attribute{} + + for _, provider := range providers { + attributes[provider.getSchemaName()] = provider.getSchemaValue() + } + + return attributes +} diff --git a/internal/provider/sourceverification/verification_apikey.go b/internal/provider/sourceverification/verification_apikey.go index e63d6e0..03c0e35 100644 --- a/internal/provider/sourceverification/verification_apikey.go +++ b/internal/provider/sourceverification/verification_apikey.go @@ -6,7 +6,19 @@ import ( hookdeck "github.com/hookdeck/hookdeck-go-sdk" ) -func apiKeyConfigSchema() schema.SingleNestedAttribute { +type apiKeySourceVerification struct { + APIKey types.String `tfsdk:"api_key"` + HeaderKey types.String `tfsdk:"header_key"` +} + +type apiKeySourceVerificationProvider struct { +} + +func (p *apiKeySourceVerificationProvider) getSchemaName() string { + return "api_key" +} + +func (p *apiKeySourceVerificationProvider) getSchemaValue() schema.SingleNestedAttribute { return schema.SingleNestedAttribute{ Optional: true, Attributes: map[string]schema.Attribute{ @@ -21,17 +33,20 @@ func apiKeyConfigSchema() schema.SingleNestedAttribute { } } -type apiKeySourceVerification struct { - APIKey types.String `tfsdk:"api_key"` - HeaderKey types.String `tfsdk:"header_key"` -} +func (p *apiKeySourceVerificationProvider) toPayload(sourceVerification *sourceVerification) *hookdeck.VerificationConfig { + if sourceVerification.APIKey == nil { + return nil + } -func (m *apiKeySourceVerification) toPayload() *hookdeck.VerificationConfig { return hookdeck.NewVerificationConfigFromVerificationApiKey(&hookdeck.VerificationApiKey{ Type: hookdeck.VerificationApiKeyTypeApiKey, Configs: &hookdeck.VerificationApiKeyConfigs{ - ApiKey: m.APIKey.ValueString(), - HeaderKey: m.HeaderKey.ValueString(), + ApiKey: sourceVerification.APIKey.APIKey.ValueString(), + HeaderKey: sourceVerification.APIKey.HeaderKey.ValueString(), }, }) } + +func init() { + providers = append(providers, &apiKeySourceVerificationProvider{}) +} diff --git a/internal/provider/sourceverification/verification_stripe.go b/internal/provider/sourceverification/verification_stripe.go index b6ea89d..d12473b 100644 --- a/internal/provider/sourceverification/verification_stripe.go +++ b/internal/provider/sourceverification/verification_stripe.go @@ -6,27 +6,45 @@ import ( hookdeck "github.com/hookdeck/hookdeck-go-sdk" ) -func stripeConfigSchema() schema.SingleNestedAttribute { +type stripeSourceVerification struct { + WebhookSecretKey types.String `tfsdk:"webhook_secret_key"` +} + +type stripeSourceVerificationProvider struct { +} + +func (p *stripeSourceVerificationProvider) getSchemaName() string { + return "stripe" +} + +func (p *stripeSourceVerificationProvider) getSchemaValue() schema.SingleNestedAttribute { return schema.SingleNestedAttribute{ Optional: true, Attributes: map[string]schema.Attribute{ - "webhook_secret_key": schema.StringAttribute{ + "api_key": schema.StringAttribute{ Required: true, Sensitive: true, }, + "header_key": schema.StringAttribute{ + Required: true, + }, }, } } -type stripeSourceVerification struct { - WebhookSecretKey types.String `tfsdk:"webhook_secret_key"` -} +func (p *stripeSourceVerificationProvider) toPayload(sourceVerification *sourceVerification) *hookdeck.VerificationConfig { + if sourceVerification.Stripe == nil { + return nil + } -func (m *stripeSourceVerification) toPayload() *hookdeck.VerificationConfig { return hookdeck.NewVerificationConfigFromVerificationStripe(&hookdeck.VerificationStripe{ Type: hookdeck.VerificationStripeTypeStripe, Configs: &hookdeck.VerificationStripeConfigs{ - WebhookSecretKey: m.WebhookSecretKey.ValueString(), + WebhookSecretKey: sourceVerification.Stripe.WebhookSecretKey.ValueString(), }, }) } + +func init() { + providers = append(providers, &stripeSourceVerificationProvider{}) +}