Skip to content

Commit 554d0a2

Browse files
authored
refactor(fieldselector): introduce fielddescriptors (#3485)
1 parent b432632 commit 554d0a2

32 files changed

+1707
-475
lines changed

openmeter/productcatalog/addon.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ func ValidateAddonHasSingleBillingCadence() models.ValidatorFunc[Addon] {
280280
}
281281

282282
return models.ErrorWithFieldPrefix(
283-
models.NewFieldSelectors(models.NewFieldSelector("ratecards").WithExpression(models.WildCard)),
283+
models.NewFieldSelectorGroup(models.NewFieldSelector("ratecards").WithExpression(models.WildCard)),
284284
ErrRateCardMultipleBillingCadence,
285285
)
286286
}
@@ -295,7 +295,7 @@ func ValidateAddonHasCompatiblePrices() models.ValidatorFunc[Addon] {
295295
for _, rc := range a.RateCards {
296296
if price := rc.AsMeta().Price; price != nil && price.Type() != FlatPriceType {
297297
return models.ErrorWithFieldPrefix(
298-
models.NewFieldSelectors(models.NewFieldSelector("ratecards").
298+
models.NewFieldSelectorGroup(models.NewFieldSelector("ratecards").
299299
WithExpression(models.NewFieldAttrValue("key", rc.Key()))),
300300
ErrAddonInvalidPriceForMultiInstance,
301301
)

openmeter/productcatalog/discount.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ func (d *Discounts) Validate() error {
174174
if d.Percentage != nil {
175175
if err := d.Percentage.Validate(); err != nil {
176176
errs = append(errs, models.ErrorWithFieldPrefix(
177-
models.NewFieldSelectors(models.NewFieldSelector("percentage")),
177+
models.NewFieldSelectorGroup(models.NewFieldSelector("percentage")),
178178
err),
179179
)
180180
}
@@ -183,15 +183,15 @@ func (d *Discounts) Validate() error {
183183
if d.Usage != nil {
184184
if err := d.Usage.Validate(); err != nil {
185185
errs = append(errs, models.ErrorWithFieldPrefix(
186-
models.NewFieldSelectors(models.NewFieldSelector("usage")),
186+
models.NewFieldSelectorGroup(models.NewFieldSelector("usage")),
187187
err),
188188
)
189189
}
190190
}
191191

192192
if err := errors.Join(errs...); err != nil {
193193
return models.NewGenericValidationError(models.ErrorWithFieldPrefix(
194-
models.NewFieldSelectors(models.NewFieldSelector("discounts")),
194+
models.NewFieldSelectorGroup(models.NewFieldSelector("discounts")),
195195
err),
196196
)
197197
}
@@ -209,7 +209,7 @@ func (d Discounts) ValidateForPrice(price *Price) error {
209209
if d.Percentage != nil {
210210
if err := d.Percentage.ValidateForPrice(price); err != nil {
211211
errs = append(errs, models.ErrorWithFieldPrefix(
212-
models.NewFieldSelectors(models.NewFieldSelector("percentage")),
212+
models.NewFieldSelectorGroup(models.NewFieldSelector("percentage")),
213213
err),
214214
)
215215
}
@@ -218,15 +218,15 @@ func (d Discounts) ValidateForPrice(price *Price) error {
218218
if d.Usage != nil {
219219
if err := d.Usage.ValidateForPrice(price); err != nil {
220220
errs = append(errs, models.ErrorWithFieldPrefix(
221-
models.NewFieldSelectors(models.NewFieldSelector("usage")),
221+
models.NewFieldSelectorGroup(models.NewFieldSelector("usage")),
222222
err),
223223
)
224224
}
225225
}
226226

227227
if err := errors.Join(errs...); err != nil {
228228
return models.NewGenericValidationError(models.ErrorWithFieldPrefix(
229-
models.NewFieldSelectors(models.NewFieldSelector("discounts")),
229+
models.NewFieldSelectorGroup(models.NewFieldSelector("discounts")),
230230
err),
231231
)
232232
}

openmeter/productcatalog/effectiveperiod_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ func TestEffectivePeriod_Validate(t *testing.T) {
8383

8484
issues, err := models.AsValidationIssues(err)
8585
assert.NoError(t, err)
86-
assert.Equalf(t, test.ExpectedValidationIssues, issues, "expected validation issues %v, got %v", test.ExpectedValidationIssues, issues)
86+
87+
models.RequireValidationIssuesMatch(t, test.ExpectedValidationIssues, issues)
8788
} else {
8889
assert.NoErrorf(t, test.EffectivePeriod.Validate(), "expected valid effective period")
8990
}

openmeter/productcatalog/entitlement.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ func (t *MeteredEntitlementTemplate) Validate() error {
346346
if err := errors.Join(errs...); err != nil {
347347
return models.NewGenericValidationError(
348348
models.ErrorWithFieldPrefix(
349-
models.NewFieldSelectors(models.NewFieldSelector("entitlementTemplate")),
349+
models.NewFieldSelectorGroup(models.NewFieldSelector("entitlementTemplate")),
350350
err),
351351
)
352352
}

openmeter/productcatalog/plan.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func ValidatePlanPhases() models.ValidatorFunc[Plan] {
7373
lastPhaseIdx := len(p.Phases) - 1
7474

7575
for idx, phase := range p.Phases {
76-
phaseFieldSelector := models.NewFieldSelectors(
76+
phaseFieldSelector := models.NewFieldSelectorGroup(
7777
models.NewFieldSelector("phases").
7878
WithExpression(
7979
models.NewFieldAttrValue("key", phase.Key),
@@ -92,7 +92,7 @@ func ValidatePlanPhases() models.ValidatorFunc[Plan] {
9292

9393
// Check for duplicated phase keys
9494
if _, ok := phaseKeys[phase.Key]; ok {
95-
selector := models.NewFieldSelectors(
95+
selector := models.NewFieldSelectorGroup(
9696
models.NewFieldSelector("phases").
9797
WithExpression(
9898
models.NewFieldAttrValue("key", phase.Key),
@@ -135,7 +135,7 @@ func ValidatePlanHasAlignedBillingCadences() models.ValidatorFunc[Plan] {
135135

136136
for _, phase := range p.Phases {
137137
for _, rateCard := range phase.RateCards.Billables() {
138-
rateCardFieldSelector := models.NewFieldSelectors(
138+
rateCardFieldSelector := models.NewFieldSelectorGroup(
139139
models.NewFieldSelector("phases").
140140
WithExpression(
141141
models.NewFieldAttrValue("key", phase.Key),

openmeter/productcatalog/planaddon.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,14 @@ func (c PlanAddon) Validate() error {
6363
allowedPlanStatuses := []PlanStatus{PlanStatusDraft, PlanStatusActive, PlanStatusScheduled}
6464
if !lo.Contains(allowedPlanStatuses, c.Plan.Status()) {
6565
errs = append(errs, models.ErrorWithFieldPrefix(
66-
models.NewFieldSelectors(models.NewFieldSelector("plan")),
66+
models.NewFieldSelectorGroup(models.NewFieldSelector("plan")),
6767
ErrPlanAddonIncompatibleStatus,
6868
))
6969
}
7070

7171
// Validate add-on
7272

73-
addonPrefix := models.NewFieldSelectors(models.NewFieldSelector("addon"))
73+
addonPrefix := models.NewFieldSelectorGroup(models.NewFieldSelector("addon"))
7474

7575
// Add-on must be active and the effective period of add-on must be open-ended
7676
// as we do not support scheduled changes for add-ons.

openmeter/productcatalog/planaddon_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,7 @@ func TestPlanAddon_ValidationErrors(t *testing.T) {
595595
issues, err := test.planAddon.ValidationErrors()
596596
assert.NoErrorf(t, err, "expected no error")
597597

598-
assert.ElementsMatchf(t, test.expectedIssues, issues, "expected issues %v, got %v", test.expectedIssues, issues)
598+
models.RequireValidationIssuesMatch(t, test.expectedIssues, issues)
599599
})
600600
}
601601
}

openmeter/productcatalog/ratecard.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ func (r RateCardMeta) Validate() error {
195195
if err := r.TaxConfig.Validate(); err != nil {
196196
errs = append(errs, fmt.Errorf("invalid tax config: %w",
197197
models.ErrorWithFieldPrefix(
198-
models.NewFieldSelectors(models.NewFieldSelector("taxConfig")),
198+
models.NewFieldSelectorGroup(models.NewFieldSelector("taxConfig")),
199199
err),
200200
))
201201
}
@@ -205,7 +205,7 @@ func (r RateCardMeta) Validate() error {
205205
if err := r.Price.Validate(); err != nil {
206206
errs = append(errs, fmt.Errorf("invalid price: %w",
207207
models.ErrorWithFieldPrefix(
208-
models.NewFieldSelectors(models.NewFieldSelector("price")),
208+
models.NewFieldSelectorGroup(models.NewFieldSelector("price")),
209209
err),
210210
))
211211
}
@@ -607,7 +607,7 @@ func ValidateRateCards() models.ValidatorFunc[RateCards] {
607607
rateCardKeys := make(map[string]RateCard)
608608

609609
for _, rateCard := range ratecards {
610-
fieldSelector := models.NewFieldSelectors(
610+
fieldSelector := models.NewFieldSelectorGroup(
611611
models.NewFieldSelector("ratecards").WithExpression(
612612
models.NewFieldAttrValue("key", rateCard.Key())),
613613
)
@@ -668,7 +668,7 @@ var ValidateRateCardsShareSameKey = models.ValidatorFunc[RateCardWithOverlay](fu
668668
return nil
669669
}
670670

671-
fieldSelector := models.NewFieldSelectors(models.NewFieldSelector("ratecards").
671+
fieldSelector := models.NewFieldSelectorGroup(models.NewFieldSelector("ratecards").
672672
WithExpression(models.NewFieldAttrValue("key", r.base.Key())))
673673

674674
if r.base.Key() != r.overlay.Key() {
@@ -687,7 +687,7 @@ var ValidateRateCardsHaveCompatiblePrice = models.ValidatorFunc[RateCardWithOver
687687

688688
rMeta, vMeta := r.base.AsMeta(), r.overlay.AsMeta()
689689

690-
fieldSelector := models.NewFieldSelectors(models.NewFieldSelector("ratecards").
690+
fieldSelector := models.NewFieldSelectorGroup(models.NewFieldSelector("ratecards").
691691
WithExpression(models.NewFieldAttrValue("key", r.base.Key())))
692692

693693
// Validate Price
@@ -719,7 +719,7 @@ var ValidateRateCardsHaveCompatibleFeatureKey = models.ValidatorFunc[RateCardWit
719719

720720
rMeta, vMeta := r.base.AsMeta(), r.overlay.AsMeta()
721721

722-
fieldSelector := models.NewFieldSelectors(models.NewFieldSelector("ratecards").
722+
fieldSelector := models.NewFieldSelectorGroup(models.NewFieldSelector("ratecards").
723723
WithExpression(models.NewFieldAttrValue("key", r.base.Key())))
724724

725725
if rMeta.FeatureKey != nil && vMeta.FeatureKey != nil && *rMeta.FeatureKey != *vMeta.FeatureKey {
@@ -736,7 +736,7 @@ var ValidateRateCardsHaveCompatibleFeatureID = models.ValidatorFunc[RateCardWith
736736

737737
rMeta, vMeta := r.base.AsMeta(), r.overlay.AsMeta()
738738

739-
fieldSelector := models.NewFieldSelectors(models.NewFieldSelector("ratecards").
739+
fieldSelector := models.NewFieldSelectorGroup(models.NewFieldSelector("ratecards").
740740
WithExpression(models.NewFieldAttrValue("key", r.base.Key())))
741741

742742
if rMeta.FeatureID != nil && vMeta.FeatureID != nil && *rMeta.FeatureID != *vMeta.FeatureID {
@@ -755,7 +755,7 @@ var ValidateRateCardsHaveCompatibleBillingCadence = models.ValidatorFunc[RateCar
755755

756756
rBillingCadence, vBillingCadence := r.base.GetBillingCadence(), r.overlay.GetBillingCadence()
757757

758-
fieldSelector := models.NewFieldSelectors(models.NewFieldSelector("ratecards").
758+
fieldSelector := models.NewFieldSelectorGroup(models.NewFieldSelector("ratecards").
759759
WithExpression(models.NewFieldAttrValue("key", r.base.Key())))
760760

761761
if rBillingCadence != nil && vBillingCadence != nil && !rBillingCadence.Equal(vBillingCadence) {
@@ -802,7 +802,7 @@ var ValidateRateCardsHaveCompatibleEntitlementTemplate = models.ValidatorFunc[Ra
802802

803803
err := errors.Join(errs...)
804804
if err != nil {
805-
fieldSelector := models.NewFieldSelectors(
805+
fieldSelector := models.NewFieldSelectorGroup(
806806
models.NewFieldSelector("ratecards").
807807
WithExpression(models.NewFieldAttrValue("key", r.base.Key())),
808808
models.NewFieldSelector("entitlementTemplate"),
@@ -824,14 +824,14 @@ var ValidateRateCardsHaveCompatibleDiscounts = models.ValidatorFunc[RateCardWith
824824
rMeta, vMeta := r.base.AsMeta(), r.overlay.AsMeta()
825825

826826
if rMeta.Discounts.Percentage != nil && vMeta.Discounts.Percentage != nil {
827-
fieldSelector := models.NewFieldSelectors(models.NewFieldSelector("discounts"))
827+
fieldSelector := models.NewFieldSelectorGroup(models.NewFieldSelector("discounts"))
828828

829829
errs = append(errs, models.ErrorWithFieldPrefix(fieldSelector, ErrRateCardPercentageDiscountNotAllowed))
830830
}
831831

832832
err := errors.Join(errs...)
833833
if err != nil {
834-
fieldSelector := models.NewFieldSelectors(
834+
fieldSelector := models.NewFieldSelectorGroup(
835835
models.NewFieldSelector("ratecards").
836836
WithExpression(models.NewFieldAttrValue("key", r.base.Key())),
837837
)

openmeter/productcatalog/subscription/http/errors.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func errorEncoder() encoder.ErrorEncoder {
2424
if err == nil && len(issues) > 0 {
2525
// Let's map the FieldSelectors to the public schema
2626
mappedIssues, err := slicesx.MapWithErr(issues, func(issue models.ValidationIssue) (models.ValidationIssue, error) {
27-
return subscription.MapSubscriptionSpecValidationIssueFieldSelectors(issue)
27+
return subscription.MapSubscriptionSpecValidationIssueField(issue)
2828
})
2929
if err != nil {
3030
return false // Server dies if mapping fails

openmeter/productcatalog/subscription/service/plan.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func PlanFromPlanInput(input plan.CreatePlanInput) (subscription.Plan, error) {
6060
p.Version = 1
6161

6262
if err := p.Validate(); err != nil {
63-
return nil, models.ErrorWithFieldPrefix(models.NewFieldSelectors(
63+
return nil, models.ErrorWithFieldPrefix(models.NewFieldSelectorGroup(
6464
models.NewFieldSelector("plan")), err)
6565
}
6666

0 commit comments

Comments
 (0)