From 14791adea511f438a1cb7de388c8af9a675d0f62 Mon Sep 17 00:00:00 2001 From: Alex Goth <64845621+GAlexIHU@users.noreply.github.com> Date: Wed, 12 Feb 2025 13:27:38 +0100 Subject: [PATCH] Use UsagePeriod defaulting as written in docs (#2254) --- .../productcatalog/plan/httpdriver/mapping.go | 56 ++++++++++++------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/openmeter/productcatalog/plan/httpdriver/mapping.go b/openmeter/productcatalog/plan/httpdriver/mapping.go index 186f97fa1..f5fa20186 100644 --- a/openmeter/productcatalog/plan/httpdriver/mapping.go +++ b/openmeter/productcatalog/plan/httpdriver/mapping.go @@ -550,6 +550,14 @@ func AsFlatFeeRateCard(flat api.RateCardFlatFee) (productcatalog.FlatFeeRateCard }, } + if flat.BillingCadence != nil { + isoString := datex.ISOString(*flat.BillingCadence) + rc.BillingCadence, err = isoString.ParsePtrOrNil() + if err != nil { + return rc, fmt.Errorf("failed to cast BillingCadence: %w", err) + } + } + if flat.FeatureKey != nil { rc.RateCardMeta.Feature = &feature.Feature{ Key: *flat.FeatureKey, @@ -557,7 +565,7 @@ func AsFlatFeeRateCard(flat api.RateCardFlatFee) (productcatalog.FlatFeeRateCard } if flat.EntitlementTemplate != nil { - tmpl, err := AsEntitlementTemplate(*flat.EntitlementTemplate) + tmpl, err := AsEntitlementTemplate(*flat.EntitlementTemplate, rc.BillingCadence) if err != nil { return productcatalog.FlatFeeRateCard{}, fmt.Errorf("failed to cast EntitlementTemplate: %w", err) } @@ -569,14 +577,6 @@ func AsFlatFeeRateCard(flat api.RateCardFlatFee) (productcatalog.FlatFeeRateCard rc.TaxConfig = lo.ToPtr(AsTaxConfig(*flat.TaxConfig)) } - if flat.BillingCadence != nil { - isoString := datex.ISOString(*flat.BillingCadence) - rc.BillingCadence, err = isoString.ParsePtrOrNil() - if err != nil { - return rc, fmt.Errorf("failed to cast BillingCadence: %w", err) - } - } - if flat.Price != nil { amount, err := decimal.NewFromString(flat.Price.Amount) if err != nil { @@ -618,6 +618,12 @@ func AsUsageBasedRateCard(usage api.RateCardUsageBased) (productcatalog.UsageBas }, } + isoString := datex.ISOString(usage.BillingCadence) + rc.BillingCadence, err = isoString.Parse() + if err != nil { + return rc, fmt.Errorf("failed to cast BillingCadence: %w", err) + } + if usage.FeatureKey != nil { rc.RateCardMeta.Feature = &feature.Feature{ Key: *usage.FeatureKey, @@ -625,7 +631,7 @@ func AsUsageBasedRateCard(usage api.RateCardUsageBased) (productcatalog.UsageBas } if usage.EntitlementTemplate != nil { - tmpl, err := AsEntitlementTemplate(*usage.EntitlementTemplate) + tmpl, err := AsEntitlementTemplate(*usage.EntitlementTemplate, &rc.BillingCadence) if err != nil { return rc, fmt.Errorf("failed to cast EntitlementTemplate: %w", err) } @@ -637,12 +643,6 @@ func AsUsageBasedRateCard(usage api.RateCardUsageBased) (productcatalog.UsageBas rc.TaxConfig = lo.ToPtr(AsTaxConfig(*usage.TaxConfig)) } - isoString := datex.ISOString(usage.BillingCadence) - rc.BillingCadence, err = isoString.Parse() - if err != nil { - return rc, fmt.Errorf("failed to cast BillingCadence: %w", err) - } - if usage.Price != nil { price, err := AsPrice(*usage.Price) if err != nil { @@ -815,7 +815,7 @@ func AsPriceTier(t api.PriceTier) (productcatalog.PriceTier, error) { return tier, nil } -func AsEntitlementTemplate(e api.RateCardEntitlement) (*productcatalog.EntitlementTemplate, error) { +func AsEntitlementTemplate(e api.RateCardEntitlement, billingCadence *datex.Period) (*productcatalog.EntitlementTemplate, error) { tmpl := &productcatalog.EntitlementTemplate{} eType, err := e.Discriminator() @@ -830,10 +830,24 @@ func AsEntitlementTemplate(e api.RateCardEntitlement) (*productcatalog.Entitleme return nil, fmt.Errorf("failed to cast Metered EntitlementTemplate: %w", err) } - usagePeriodISO := datex.ISOString(lo.FromPtrOr(metered.UsagePeriod, "")) - usagePeriod, err := usagePeriodISO.Parse() - if err != nil { - return nil, fmt.Errorf("failed to cast UsagePeriod for Metered EntitlementTemplate: %w", err) + var usagePeriod datex.Period + + if metered.UsagePeriod != nil { + usagePeriodISO := datex.ISOString(lo.FromPtr(metered.UsagePeriod)) + + if usagePeriod, err = usagePeriodISO.Parse(); err != nil { + return nil, fmt.Errorf("failed to cast UsagePeriod for Metered EntitlementTemplate: %w", err) + } + } + + if usagePeriod.IsZero() { + if billingCadence == nil || billingCadence.IsZero() { + return nil, &models.GenericUserError{ + Inner: fmt.Errorf("missing UsagePeriod for Metered EntitlementTemplate where cannot infer from BillingCadence"), + } + } + + usagePeriod = *billingCadence } meteredTemplate := productcatalog.MeteredEntitlementTemplate{