diff --git a/api/api.gen.go b/api/api.gen.go index 2725baa10..bfcd30301 100644 --- a/api/api.gen.go +++ b/api/api.gen.go @@ -299,7 +299,7 @@ type EntitlementGrantCreateInput struct { Priority *int `json:"priority,omitempty"` // Recurrence Recurring period of an entitlement. - Recurrence *RecurringPeriod `json:"recurrence,omitempty"` + Recurrence *RecurringPeriodCreateInput `json:"recurrence,omitempty"` } // EntitlementMetered defines model for EntitlementMetered. @@ -3157,132 +3157,132 @@ var swaggerSpec = []string{ "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", - "c6pvP97+vwAAAP//2D93sgHvAAA=", + "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", + "7qerOaf69uPt/wsAAP//ssaA7EnvAAA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/client/go/client.gen.go b/api/client/go/client.gen.go index c735ee4e0..c99fa5892 100644 --- a/api/client/go/client.gen.go +++ b/api/client/go/client.gen.go @@ -299,7 +299,7 @@ type EntitlementGrantCreateInput struct { Priority *int `json:"priority,omitempty"` // Recurrence Recurring period of an entitlement. - Recurrence *RecurringPeriod `json:"recurrence,omitempty"` + Recurrence *RecurringPeriodCreateInput `json:"recurrence,omitempty"` } // EntitlementMetered defines model for EntitlementMetered. @@ -6746,132 +6746,132 @@ var swaggerSpec = []string{ "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", - "c6pvP97+vwAAAP//2D93sgHvAAA=", + "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", + "7qerOaf69uPt/wsAAP//ssaA7EnvAAA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/client/node/schemas/openapi.ts b/api/client/node/schemas/openapi.ts index b3f40163f..31beac654 100644 --- a/api/client/node/schemas/openapi.ts +++ b/api/client/node/schemas/openapi.ts @@ -784,7 +784,7 @@ export interface components { metadata?: { [key: string]: string } - recurrence?: components['schemas']['RecurringPeriod'] + recurrence?: components['schemas']['RecurringPeriodCreateInput'] } EntitlementGrant: components['schemas']['EntitlementGrantCreateInput'] & components['schemas']['SharedMetaFields'] & { @@ -813,6 +813,7 @@ export interface components { * @description The date and time the grant was voided (cannot be used after that). */ voidedAt?: string + recurrence?: components['schemas']['RecurringPeriod'] } EntitlementValue: { /** diff --git a/api/client/python/src/openmeter/_operations/_operations.py b/api/client/python/src/openmeter/_operations/_operations.py index 4699ba513..fc298a7b2 100644 --- a/api/client/python/src/openmeter/_operations/_operations.py +++ b/api/client/python/src/openmeter/_operations/_operations.py @@ -3902,12 +3902,13 @@ def create_grant( priorities and expiration dates, the system will use the grant that was created first. "recurrence": { - "anchor": "2020-02-20 00:00:00", # An arbitrary anchor to base the - recurring period on. Required. - "interval": "str" # List of pre-defined periods that can be used for - recurring & scheduling. DAY: Every day WEEK: Every week MONTH: + "interval": "str", # List of pre-defined periods that can be used + for recurring & scheduling. DAY: Every day WEEK: Every week MONTH: Every month YEAR: Every year. Required. Known values are: "DAY", "WEEK", "MONTH", and "YEAR". + "anchor": "2020-02-20 00:00:00" # Optional. An arbitrary anchor to + base the recurring period on. If not provided then defaults to now truncated + to the hour. } } @@ -4098,12 +4099,13 @@ def create_grant( priorities and expiration dates, the system will use the grant that was created first. "recurrence": { - "anchor": "2020-02-20 00:00:00", # An arbitrary anchor to base the - recurring period on. Required. - "interval": "str" # List of pre-defined periods that can be used for - recurring & scheduling. DAY: Every day WEEK: Every week MONTH: + "interval": "str", # List of pre-defined periods that can be used + for recurring & scheduling. DAY: Every day WEEK: Every week MONTH: Every month YEAR: Every year. Required. Known values are: "DAY", "WEEK", "MONTH", and "YEAR". + "anchor": "2020-02-20 00:00:00" # Optional. An arbitrary anchor to + base the recurring period on. If not provided then defaults to now truncated + to the hour. } } diff --git a/api/client/python/src/openmeter/aio/_operations/_operations.py b/api/client/python/src/openmeter/aio/_operations/_operations.py index 1798b0e10..cea7d1487 100644 --- a/api/client/python/src/openmeter/aio/_operations/_operations.py +++ b/api/client/python/src/openmeter/aio/_operations/_operations.py @@ -3201,12 +3201,13 @@ async def create_grant( priorities and expiration dates, the system will use the grant that was created first. "recurrence": { - "anchor": "2020-02-20 00:00:00", # An arbitrary anchor to base the - recurring period on. Required. - "interval": "str" # List of pre-defined periods that can be used for - recurring & scheduling. DAY: Every day WEEK: Every week MONTH: + "interval": "str", # List of pre-defined periods that can be used + for recurring & scheduling. DAY: Every day WEEK: Every week MONTH: Every month YEAR: Every year. Required. Known values are: "DAY", "WEEK", "MONTH", and "YEAR". + "anchor": "2020-02-20 00:00:00" # Optional. An arbitrary anchor to + base the recurring period on. If not provided then defaults to now truncated + to the hour. } } @@ -3397,12 +3398,13 @@ async def create_grant( priorities and expiration dates, the system will use the grant that was created first. "recurrence": { - "anchor": "2020-02-20 00:00:00", # An arbitrary anchor to base the - recurring period on. Required. - "interval": "str" # List of pre-defined periods that can be used for - recurring & scheduling. DAY: Every day WEEK: Every week MONTH: + "interval": "str", # List of pre-defined periods that can be used + for recurring & scheduling. DAY: Every day WEEK: Every week MONTH: Every month YEAR: Every year. Required. Known values are: "DAY", "WEEK", "MONTH", and "YEAR". + "anchor": "2020-02-20 00:00:00" # Optional. An arbitrary anchor to + base the recurring period on. If not provided then defaults to now truncated + to the hour. } } diff --git a/api/client/web/src/client/openapi.ts b/api/client/web/src/client/openapi.ts index b3f40163f..31beac654 100644 --- a/api/client/web/src/client/openapi.ts +++ b/api/client/web/src/client/openapi.ts @@ -784,7 +784,7 @@ export interface components { metadata?: { [key: string]: string } - recurrence?: components['schemas']['RecurringPeriod'] + recurrence?: components['schemas']['RecurringPeriodCreateInput'] } EntitlementGrant: components['schemas']['EntitlementGrantCreateInput'] & components['schemas']['SharedMetaFields'] & { @@ -813,6 +813,7 @@ export interface components { * @description The date and time the grant was voided (cannot be used after that). */ voidedAt?: string + recurrence?: components['schemas']['RecurringPeriod'] } EntitlementValue: { /** diff --git a/api/openapi.yaml b/api/openapi.yaml index d64e689e3..00ea1cdd8 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -1831,7 +1831,7 @@ components: example: stripePaymentId: "pi_4OrAkhLvyihio9p51h9iiFnB" recurrence: - $ref: "#/components/schemas/RecurringPeriod" + $ref: "#/components/schemas/RecurringPeriodCreateInput" EntitlementGrant: allOf: @@ -1865,6 +1865,8 @@ components: format: date-time description: The date and time the grant was voided (cannot be used after that). readOnly: true + recurrence: + $ref: "#/components/schemas/RecurringPeriod" EntitlementValue: type: object required: diff --git a/e2e/e2e_test.go b/e2e/e2e_test.go index 86ab1ffd6..497fa3ac6 100644 --- a/e2e/e2e_test.go +++ b/e2e/e2e_test.go @@ -571,8 +571,8 @@ func TestCredit(t *testing.T) { }, Priority: &priority, MaxRolloverAmount: &maxRolloverAmount, - Recurrence: &api.RecurringPeriod{ - Anchor: time.Date(2024, time.January, 1, 0, 0, 0, 0, time.UTC), + Recurrence: &api.RecurringPeriodCreateInput{ + Anchor: convert.ToPointer(time.Date(2024, time.January, 1, 0, 0, 0, 0, time.UTC)), Interval: "YEAR", }, }) diff --git a/internal/credit/postgresadapter/balance_snapshot.go b/internal/credit/postgresadapter/balance_snapshot.go index 3ec35beca..e8c4545f8 100644 --- a/internal/credit/postgresadapter/balance_snapshot.go +++ b/internal/credit/postgresadapter/balance_snapshot.go @@ -24,7 +24,7 @@ func NewPostgresBalanceSnapshotRepo(db *db.Client) credit.BalanceSnapshotConnect func (b *balanceSnapshotAdapter) InvalidateAfter(ctx context.Context, owner credit.NamespacedGrantOwner, at time.Time) error { return b.db.BalanceSnapshot.Update(). - Where(db_balancesnapshot.OwnerID(owner.ID), db_balancesnapshot.Namespace(owner.Namespace), db_balancesnapshot.AtGTE(at)). + Where(db_balancesnapshot.OwnerID(owner.ID), db_balancesnapshot.Namespace(owner.Namespace), db_balancesnapshot.AtGT(at)). SetDeletedAt(time.Now()). Exec(ctx) } diff --git a/internal/credit/postgresadapter/grant.go b/internal/credit/postgresadapter/grant.go index 224c79ad7..1af398474 100644 --- a/internal/credit/postgresadapter/grant.go +++ b/internal/credit/postgresadapter/grant.go @@ -113,6 +113,7 @@ func (g *grantDBADapter) ListActiveGrantsBetween(ctx context.Context, owner cred db_grant.Or( db_grant.And(db_grant.EffectiveAtLT(from), db_grant.ExpiresAtGT(from)), db_grant.And(db_grant.EffectiveAtGTE(from), db_grant.EffectiveAtLT(to)), + db_grant.EffectiveAt(from), ), ).Where( db_grant.Or(db_grant.DeletedAtGTE(to), db_grant.DeletedAtIsNil()), diff --git a/internal/entitlement/entitlement.go b/internal/entitlement/entitlement.go index 8e89eff77..93cde51df 100644 --- a/internal/entitlement/entitlement.go +++ b/internal/entitlement/entitlement.go @@ -12,10 +12,11 @@ type TypedEntitlement interface { } type CreateEntitlementInputs struct { - Namespace string `json:"namespace"` - FeatureID string `json:"featureId"` - SubjectKey string `json:"subjectKey"` - EntitlementType EntitlementType `json:"type"` + Namespace string `json:"namespace"` + FeatureID string `json:"featureId"` + SubjectKey string `json:"subjectKey"` + EntitlementType EntitlementType `json:"type"` + Metadata map[string]string `json:"metadata,omitempty"` MeasureUsageFrom *time.Time `json:"measureUsageFrom,omitempty"` IssueAfterReset *float64 `json:"issueAfterReset,omitempty"` @@ -76,6 +77,8 @@ type GenericProperties struct { models.NamespacedModel models.ManagedModel + Metadata map[string]string `json:"metadata,omitempty"` + ID string `json:"id,omitempty"` FeatureID string `json:"featureId,omitempty"` SubjectKey string `json:"subjectKey,omitempty"` diff --git a/internal/entitlement/httpdriver/entitlement.go b/internal/entitlement/httpdriver/entitlement.go index 27ba81de1..a79c900fa 100644 --- a/internal/entitlement/httpdriver/entitlement.go +++ b/internal/entitlement/httpdriver/entitlement.go @@ -84,6 +84,9 @@ func (h *entitlementHandler) CreateEntitlement() CreateEntitlementHandler { Interval: entitlement.UsagePeriodInterval(v.UsagePeriod.Interval), }, } + if v.Metadata != nil { + request.Metadata = *v.Metadata + } case api.EntitlementStaticCreateInputs: request = entitlement.CreateEntitlementInputs{ Namespace: ns, @@ -98,6 +101,9 @@ func (h *entitlementHandler) CreateEntitlement() CreateEntitlementHandler { Interval: entitlement.UsagePeriodInterval(v.UsagePeriod.Interval), } } + if v.Metadata != nil { + request.Metadata = *v.Metadata + } case api.EntitlementBooleanCreateInputs: request = entitlement.CreateEntitlementInputs{ Namespace: ns, @@ -111,6 +117,9 @@ func (h *entitlementHandler) CreateEntitlement() CreateEntitlementHandler { Interval: entitlement.UsagePeriodInterval(v.UsagePeriod.Interval), } } + if v.Metadata != nil { + request.Metadata = *v.Metadata + } default: return request, errors.New("unknown entitlement type") } diff --git a/internal/entitlement/httpdriver/metered.go b/internal/entitlement/httpdriver/metered.go index 98cf34bba..c007cb763 100644 --- a/internal/entitlement/httpdriver/metered.go +++ b/internal/entitlement/httpdriver/metered.go @@ -107,7 +107,7 @@ func (h *meteredEntitlementHandler) CreateGrant() CreateGrantHandler { if apiGrant.Recurrence != nil { inp.inp.Recurrence = &credit.Recurrence{ Period: credit.RecurrencePeriod(apiGrant.Recurrence.Interval), - Anchor: apiGrant.Recurrence.Anchor, + Anchor: defaultx.WithDefault(apiGrant.Recurrence.Anchor, apiGrant.EffectiveAt), } } diff --git a/internal/entitlement/httpdriver/parser.go b/internal/entitlement/httpdriver/parser.go index dd3a9c61e..f02b29b81 100644 --- a/internal/entitlement/httpdriver/parser.go +++ b/internal/entitlement/httpdriver/parser.go @@ -28,7 +28,7 @@ func (parser) ToMetered(e *entitlement.Entitlement) (*api.EntitlementMetered, er Id: &metered.ID, IsUnlimited: convert.ToPointer(false), // implement IssueAfterReset: metered.IssuesAfterReset, - Metadata: nil, // implement + Metadata: &metered.Metadata, SubjectKey: metered.SubjectKey, Type: api.EntitlementMeteredType(metered.EntitlementType), UpdatedAt: &metered.UpdatedAt, @@ -50,7 +50,7 @@ func (parser) ToStatic(e *entitlement.Entitlement) (*api.EntitlementStatic, erro DeletedAt: static.DeletedAt, FeatureId: static.FeatureID, Id: &static.ID, - Metadata: nil, // implement + Metadata: &static.Metadata, SubjectKey: static.SubjectKey, Type: api.EntitlementStaticType(static.EntitlementType), UpdatedAt: &static.UpdatedAt, @@ -78,7 +78,7 @@ func (parser) ToBoolean(e *entitlement.Entitlement) (*api.EntitlementBoolean, er DeletedAt: boolean.DeletedAt, FeatureId: boolean.FeatureID, Id: &boolean.ID, - Metadata: nil, // implement + Metadata: &boolean.Metadata, SubjectKey: boolean.SubjectKey, Type: api.EntitlementBooleanType(boolean.EntitlementType), UpdatedAt: &boolean.UpdatedAt, diff --git a/internal/entitlement/metered/balance.go b/internal/entitlement/metered/balance.go index 56b7e3cfc..2291cdfd9 100644 --- a/internal/entitlement/metered/balance.go +++ b/internal/entitlement/metered/balance.go @@ -144,6 +144,19 @@ func (e *connector) GetEntitlementBalanceHistory(ctx context.Context, entitlemen if err != nil { return nil, credit.GrantBurnDownHistory{}, fmt.Errorf("failed to query meter: %w", err) } + + // If we get 0 rows that means the windowsize is larger than the queried period. + // In this case we simply query for the entire period. + if len(meterRows) == 0 { + nonWindowedParams := *meterParams + nonWindowedParams.WindowSize = nil + nonWindowedParams.WindowTimeZone = nil + meterRows, err = e.streamingConnector.QueryMeter(ctx, owner.Namespace, meterSlug, &nonWindowedParams) + if err != nil { + return nil, credit.GrantBurnDownHistory{}, fmt.Errorf("failed to query meter: %w", err) + } + } + // 3. and then we merge the two // convert history segments to list of point in time balances diff --git a/internal/entitlement/metered/balance_test.go b/internal/entitlement/metered/balance_test.go index 451c793f7..45f1402bf 100644 --- a/internal/entitlement/metered/balance_test.go +++ b/internal/entitlement/metered/balance_test.go @@ -913,6 +913,73 @@ func TestResetEntitlementUsage(t *testing.T) { }, creditBalance.Balances) }, }, + { + name: "Should properly handle grants issued for the same time as reset", + run: func(t *testing.T, connector meteredentitlement.Connector, deps *testDependencies) { + ctx := context.Background() + startTime := testutils.GetRFC3339Time(t, "2024-03-01T00:00:00Z") + + // create featute in db + feature, err := deps.featureDB.CreateFeature(ctx, exampleFeature) + assert.NoError(t, err) + + // add 0 usage so meter is found in mock + deps.streaming.AddSimpleEvent(meterSlug, 0, startTime) + + // create entitlement in db + inp := getEntitlement(t, feature) + inp.MeasureUsageFrom = &startTime + ent, err := deps.entitlementDB.CreateEntitlement(ctx, inp) + assert.NoError(t, err) + + // issue grants + _, err = deps.grantDB.CreateGrant(ctx, credit.GrantRepoCreateGrantInput{ + OwnerID: credit.GrantOwner(ent.ID), + Namespace: namespace, + Amount: 1000, + Priority: 1, + EffectiveAt: startTime.Add(time.Hour * 2), + ExpiresAt: startTime.AddDate(0, 0, 3), + ResetMaxRollover: 0, // full amount can be rolled over + }) + assert.NoError(t, err) + + // do a reset + resetTime := startTime.Add(time.Hour * 5) + balanceAfterReset, err := connector.ResetEntitlementUsage(ctx, models.NamespacedID{Namespace: namespace, ID: ent.ID}, resetTime) + + // assert balance after reset is 0 for grant + assert.NoError(t, err) + assert.Equal(t, 0.0, balanceAfterReset.UsageInPeriod) // 0 usage right after reset + assert.Equal(t, 0.0, balanceAfterReset.Balance) // 1000 - 1000 = 0 + + // issue grants + g2, err := deps.grantDB.CreateGrant(ctx, credit.GrantRepoCreateGrantInput{ + OwnerID: credit.GrantOwner(ent.ID), + Namespace: namespace, + Amount: 1000, + Priority: 1, + EffectiveAt: resetTime, + ExpiresAt: resetTime.AddDate(0, 0, 3), + ResetMaxRollover: 1000, // full amount can be rolled over + }) + assert.NoError(t, err) + + // fetch balance for reset & grant, balance should be full grant amount + balanceAfterReset, err = connector.GetEntitlementBalance(ctx, models.NamespacedID{Namespace: namespace, ID: ent.ID}, resetTime) + assert.NoError(t, err) + + assert.Equal(t, 0.0, balanceAfterReset.UsageInPeriod) // 0 usage right after reset + assert.Equal(t, g2.Amount, balanceAfterReset.Balance) // 1000 - 0 = 1000 + + // fetch balance for AFTER reset & grant, balance should be full grant amount + balanceAfterReset, err = connector.GetEntitlementBalance(ctx, models.NamespacedID{Namespace: namespace, ID: ent.ID}, resetTime.Add(time.Minute)) + assert.NoError(t, err) + + assert.Equal(t, 0.0, balanceAfterReset.UsageInPeriod) // 0 usage right after reset + assert.Equal(t, g2.Amount, balanceAfterReset.Balance) // 1000 - 0 = 1000 + }, + }, } for _, tc := range tt { diff --git a/internal/entitlement/postgresadapter/entitlement.go b/internal/entitlement/postgresadapter/entitlement.go index 46f7500e0..7e6efdaf7 100644 --- a/internal/entitlement/postgresadapter/entitlement.go +++ b/internal/entitlement/postgresadapter/entitlement.go @@ -70,6 +70,7 @@ func (a *entitlementDBAdapter) CreateEntitlement(ctx context.Context, entitlemen SetEntitlementType(db_entitlement.EntitlementType(entitlement.EntitlementType)). SetNamespace(entitlement.Namespace). SetFeatureID(entitlement.FeatureID). + SetMetadata(entitlement.Metadata). SetSubjectKey(entitlement.SubjectKey). SetNillableMeasureUsageFrom(entitlement.MeasureUsageFrom). SetNillableIssueAfterReset(entitlement.IssueAfterReset). @@ -167,6 +168,7 @@ func mapEntitlementEntity(e *db.Entitlement) *entitlement.Entitlement { SubjectKey: e.SubjectKey, FeatureID: e.FeatureID, EntitlementType: entitlement.EntitlementType(e.EntitlementType), + Metadata: e.Metadata, }, MeasureUsageFrom: e.MeasureUsageFrom, IssueAfterReset: e.IssueAfterReset, diff --git a/internal/productcatalog/feature.go b/internal/productcatalog/feature.go index dc59b4556..c479e6090 100644 --- a/internal/productcatalog/feature.go +++ b/internal/productcatalog/feature.go @@ -32,7 +32,7 @@ type FeatureWithNameAlreadyExistsError struct { func (e *FeatureWithNameAlreadyExistsError) Error() string { // Is it an issue that we leak ID on another Feature here? // Shouldn't be an isue as it's namespaced. - return fmt.Sprintf("feature %s with name %s already exists", e.ID, e.Name) + return fmt.Sprintf("feature %s with key %s already exists", e.ID, e.Name) } type FeatureInvalidMeterAggregationError struct { @@ -69,6 +69,9 @@ type Feature struct { // MeterGroupByFilters Optional meter group by filters. Useful if the meter scope is broader than what feature tracks. MeterGroupByFilters *map[string]string `json:"meterGroupByFilters,omitempty"` + // Metadata Additional metadata. + Metadata map[string]string `json:"metadata,omitempty"` + // Read-only fields ArchivedAt *time.Time `json:"archivedAt,omitempty"` diff --git a/internal/productcatalog/feature_connector.go b/internal/productcatalog/feature_connector.go index 8b12d821e..c2faf374a 100644 --- a/internal/productcatalog/feature_connector.go +++ b/internal/productcatalog/feature_connector.go @@ -15,6 +15,7 @@ type CreateFeatureInputs struct { Namespace string `json:"namespace"` MeterSlug *string `json:"meterSlug"` MeterGroupByFilters map[string]string `json:"meterGroupByFilters"` + Metadata map[string]string `json:"metadata"` } type FeatureConnector interface { @@ -99,7 +100,7 @@ func (c *featureConnector) CreateFeature(ctx context.Context, feature CreateFeat return Feature{}, err } } else { - return Feature{}, &FeatureWithNameAlreadyExistsError{Name: feature.Name, ID: found.ID} + return Feature{}, &FeatureWithNameAlreadyExistsError{Name: feature.Key, ID: found.ID} } return c.featureRepo.CreateFeature(ctx, feature) diff --git a/internal/productcatalog/postgresadapter/ent/db/feature.go b/internal/productcatalog/postgresadapter/ent/db/feature.go index eec8e8a5c..58414a1a2 100644 --- a/internal/productcatalog/postgresadapter/ent/db/feature.go +++ b/internal/productcatalog/postgresadapter/ent/db/feature.go @@ -24,6 +24,8 @@ type Feature struct { UpdatedAt time.Time `json:"updated_at,omitempty"` // DeletedAt holds the value of the "deleted_at" field. DeletedAt *time.Time `json:"deleted_at,omitempty"` + // Metadata holds the value of the "metadata" field. + Metadata map[string]string `json:"metadata,omitempty"` // Namespace holds the value of the "namespace" field. Namespace string `json:"namespace,omitempty"` // Name holds the value of the "name" field. @@ -44,7 +46,7 @@ func (*Feature) scanValues(columns []string) ([]any, error) { values := make([]any, len(columns)) for i := range columns { switch columns[i] { - case feature.FieldMeterGroupByFilters: + case feature.FieldMetadata, feature.FieldMeterGroupByFilters: values[i] = new([]byte) case feature.FieldID, feature.FieldNamespace, feature.FieldName, feature.FieldKey, feature.FieldMeterSlug: values[i] = new(sql.NullString) @@ -90,6 +92,14 @@ func (f *Feature) assignValues(columns []string, values []any) error { f.DeletedAt = new(time.Time) *f.DeletedAt = value.Time } + case feature.FieldMetadata: + if value, ok := values[i].(*[]byte); !ok { + return fmt.Errorf("unexpected type %T for field metadata", values[i]) + } else if value != nil && len(*value) > 0 { + if err := json.Unmarshal(*value, &f.Metadata); err != nil { + return fmt.Errorf("unmarshal field metadata: %w", err) + } + } case feature.FieldNamespace: if value, ok := values[i].(*sql.NullString); !ok { return fmt.Errorf("unexpected type %T for field namespace", values[i]) @@ -177,6 +187,9 @@ func (f *Feature) String() string { builder.WriteString(v.Format(time.ANSIC)) } builder.WriteString(", ") + builder.WriteString("metadata=") + builder.WriteString(fmt.Sprintf("%v", f.Metadata)) + builder.WriteString(", ") builder.WriteString("namespace=") builder.WriteString(f.Namespace) builder.WriteString(", ") diff --git a/internal/productcatalog/postgresadapter/ent/db/feature/feature.go b/internal/productcatalog/postgresadapter/ent/db/feature/feature.go index d086b970b..415f00896 100644 --- a/internal/productcatalog/postgresadapter/ent/db/feature/feature.go +++ b/internal/productcatalog/postgresadapter/ent/db/feature/feature.go @@ -19,6 +19,8 @@ const ( FieldUpdatedAt = "updated_at" // FieldDeletedAt holds the string denoting the deleted_at field in the database. FieldDeletedAt = "deleted_at" + // FieldMetadata holds the string denoting the metadata field in the database. + FieldMetadata = "metadata" // FieldNamespace holds the string denoting the namespace field in the database. FieldNamespace = "namespace" // FieldName holds the string denoting the name field in the database. @@ -41,6 +43,7 @@ var Columns = []string{ FieldCreatedAt, FieldUpdatedAt, FieldDeletedAt, + FieldMetadata, FieldNamespace, FieldName, FieldKey, diff --git a/internal/productcatalog/postgresadapter/ent/db/feature/where.go b/internal/productcatalog/postgresadapter/ent/db/feature/where.go index 8bd937be7..6e45f63bb 100644 --- a/internal/productcatalog/postgresadapter/ent/db/feature/where.go +++ b/internal/productcatalog/postgresadapter/ent/db/feature/where.go @@ -234,6 +234,16 @@ func DeletedAtNotNil() predicate.Feature { return predicate.Feature(sql.FieldNotNull(FieldDeletedAt)) } +// MetadataIsNil applies the IsNil predicate on the "metadata" field. +func MetadataIsNil() predicate.Feature { + return predicate.Feature(sql.FieldIsNull(FieldMetadata)) +} + +// MetadataNotNil applies the NotNil predicate on the "metadata" field. +func MetadataNotNil() predicate.Feature { + return predicate.Feature(sql.FieldNotNull(FieldMetadata)) +} + // NamespaceEQ applies the EQ predicate on the "namespace" field. func NamespaceEQ(v string) predicate.Feature { return predicate.Feature(sql.FieldEQ(FieldNamespace, v)) diff --git a/internal/productcatalog/postgresadapter/ent/db/feature_create.go b/internal/productcatalog/postgresadapter/ent/db/feature_create.go index d2c1b4ba5..ea637c974 100644 --- a/internal/productcatalog/postgresadapter/ent/db/feature_create.go +++ b/internal/productcatalog/postgresadapter/ent/db/feature_create.go @@ -65,6 +65,12 @@ func (fc *FeatureCreate) SetNillableDeletedAt(t *time.Time) *FeatureCreate { return fc } +// SetMetadata sets the "metadata" field. +func (fc *FeatureCreate) SetMetadata(m map[string]string) *FeatureCreate { + fc.mutation.SetMetadata(m) + return fc +} + // SetNamespace sets the "namespace" field. func (fc *FeatureCreate) SetNamespace(s string) *FeatureCreate { fc.mutation.SetNamespace(s) @@ -260,6 +266,10 @@ func (fc *FeatureCreate) createSpec() (*Feature, *sqlgraph.CreateSpec) { _spec.SetField(feature.FieldDeletedAt, field.TypeTime, value) _node.DeletedAt = &value } + if value, ok := fc.mutation.Metadata(); ok { + _spec.SetField(feature.FieldMetadata, field.TypeJSON, value) + _node.Metadata = value + } if value, ok := fc.mutation.Namespace(); ok { _spec.SetField(feature.FieldNamespace, field.TypeString, value) _node.Namespace = value @@ -366,6 +376,24 @@ func (u *FeatureUpsert) ClearDeletedAt() *FeatureUpsert { return u } +// SetMetadata sets the "metadata" field. +func (u *FeatureUpsert) SetMetadata(v map[string]string) *FeatureUpsert { + u.Set(feature.FieldMetadata, v) + return u +} + +// UpdateMetadata sets the "metadata" field to the value that was provided on create. +func (u *FeatureUpsert) UpdateMetadata() *FeatureUpsert { + u.SetExcluded(feature.FieldMetadata) + return u +} + +// ClearMetadata clears the value of the "metadata" field. +func (u *FeatureUpsert) ClearMetadata() *FeatureUpsert { + u.SetNull(feature.FieldMetadata) + return u +} + // SetName sets the "name" field. func (u *FeatureUpsert) SetName(v string) *FeatureUpsert { u.Set(feature.FieldName, v) @@ -509,6 +537,27 @@ func (u *FeatureUpsertOne) ClearDeletedAt() *FeatureUpsertOne { }) } +// SetMetadata sets the "metadata" field. +func (u *FeatureUpsertOne) SetMetadata(v map[string]string) *FeatureUpsertOne { + return u.Update(func(s *FeatureUpsert) { + s.SetMetadata(v) + }) +} + +// UpdateMetadata sets the "metadata" field to the value that was provided on create. +func (u *FeatureUpsertOne) UpdateMetadata() *FeatureUpsertOne { + return u.Update(func(s *FeatureUpsert) { + s.UpdateMetadata() + }) +} + +// ClearMetadata clears the value of the "metadata" field. +func (u *FeatureUpsertOne) ClearMetadata() *FeatureUpsertOne { + return u.Update(func(s *FeatureUpsert) { + s.ClearMetadata() + }) +} + // SetName sets the "name" field. func (u *FeatureUpsertOne) SetName(v string) *FeatureUpsertOne { return u.Update(func(s *FeatureUpsert) { @@ -827,6 +876,27 @@ func (u *FeatureUpsertBulk) ClearDeletedAt() *FeatureUpsertBulk { }) } +// SetMetadata sets the "metadata" field. +func (u *FeatureUpsertBulk) SetMetadata(v map[string]string) *FeatureUpsertBulk { + return u.Update(func(s *FeatureUpsert) { + s.SetMetadata(v) + }) +} + +// UpdateMetadata sets the "metadata" field to the value that was provided on create. +func (u *FeatureUpsertBulk) UpdateMetadata() *FeatureUpsertBulk { + return u.Update(func(s *FeatureUpsert) { + s.UpdateMetadata() + }) +} + +// ClearMetadata clears the value of the "metadata" field. +func (u *FeatureUpsertBulk) ClearMetadata() *FeatureUpsertBulk { + return u.Update(func(s *FeatureUpsert) { + s.ClearMetadata() + }) +} + // SetName sets the "name" field. func (u *FeatureUpsertBulk) SetName(v string) *FeatureUpsertBulk { return u.Update(func(s *FeatureUpsert) { diff --git a/internal/productcatalog/postgresadapter/ent/db/feature_update.go b/internal/productcatalog/postgresadapter/ent/db/feature_update.go index 086f72bac..78e31792d 100644 --- a/internal/productcatalog/postgresadapter/ent/db/feature_update.go +++ b/internal/productcatalog/postgresadapter/ent/db/feature_update.go @@ -54,6 +54,18 @@ func (fu *FeatureUpdate) ClearDeletedAt() *FeatureUpdate { return fu } +// SetMetadata sets the "metadata" field. +func (fu *FeatureUpdate) SetMetadata(m map[string]string) *FeatureUpdate { + fu.mutation.SetMetadata(m) + return fu +} + +// ClearMetadata clears the value of the "metadata" field. +func (fu *FeatureUpdate) ClearMetadata() *FeatureUpdate { + fu.mutation.ClearMetadata() + return fu +} + // SetName sets the "name" field. func (fu *FeatureUpdate) SetName(s string) *FeatureUpdate { fu.mutation.SetName(s) @@ -172,6 +184,12 @@ func (fu *FeatureUpdate) sqlSave(ctx context.Context) (n int, err error) { if fu.mutation.DeletedAtCleared() { _spec.ClearField(feature.FieldDeletedAt, field.TypeTime) } + if value, ok := fu.mutation.Metadata(); ok { + _spec.SetField(feature.FieldMetadata, field.TypeJSON, value) + } + if fu.mutation.MetadataCleared() { + _spec.ClearField(feature.FieldMetadata, field.TypeJSON) + } if value, ok := fu.mutation.Name(); ok { _spec.SetField(feature.FieldName, field.TypeString, value) } @@ -236,6 +254,18 @@ func (fuo *FeatureUpdateOne) ClearDeletedAt() *FeatureUpdateOne { return fuo } +// SetMetadata sets the "metadata" field. +func (fuo *FeatureUpdateOne) SetMetadata(m map[string]string) *FeatureUpdateOne { + fuo.mutation.SetMetadata(m) + return fuo +} + +// ClearMetadata clears the value of the "metadata" field. +func (fuo *FeatureUpdateOne) ClearMetadata() *FeatureUpdateOne { + fuo.mutation.ClearMetadata() + return fuo +} + // SetName sets the "name" field. func (fuo *FeatureUpdateOne) SetName(s string) *FeatureUpdateOne { fuo.mutation.SetName(s) @@ -384,6 +414,12 @@ func (fuo *FeatureUpdateOne) sqlSave(ctx context.Context) (_node *Feature, err e if fuo.mutation.DeletedAtCleared() { _spec.ClearField(feature.FieldDeletedAt, field.TypeTime) } + if value, ok := fuo.mutation.Metadata(); ok { + _spec.SetField(feature.FieldMetadata, field.TypeJSON, value) + } + if fuo.mutation.MetadataCleared() { + _spec.ClearField(feature.FieldMetadata, field.TypeJSON) + } if value, ok := fuo.mutation.Name(); ok { _spec.SetField(feature.FieldName, field.TypeString, value) } diff --git a/internal/productcatalog/postgresadapter/ent/db/migrate/schema.go b/internal/productcatalog/postgresadapter/ent/db/migrate/schema.go index fe2925c4d..c6fe29924 100644 --- a/internal/productcatalog/postgresadapter/ent/db/migrate/schema.go +++ b/internal/productcatalog/postgresadapter/ent/db/migrate/schema.go @@ -14,9 +14,10 @@ var ( {Name: "created_at", Type: field.TypeTime}, {Name: "updated_at", Type: field.TypeTime}, {Name: "deleted_at", Type: field.TypeTime, Nullable: true}, + {Name: "metadata", Type: field.TypeJSON, Nullable: true, SchemaType: map[string]string{"postgres": "jsonb"}}, {Name: "namespace", Type: field.TypeString}, {Name: "name", Type: field.TypeString}, - {Name: "key", Type: field.TypeString, Unique: true}, + {Name: "key", Type: field.TypeString}, {Name: "meter_slug", Type: field.TypeString, Nullable: true}, {Name: "meter_group_by_filters", Type: field.TypeJSON, Nullable: true}, {Name: "archived_at", Type: field.TypeTime, Nullable: true}, @@ -35,7 +36,7 @@ var ( { Name: "feature_namespace_id", Unique: false, - Columns: []*schema.Column{FeaturesColumns[4], FeaturesColumns[0]}, + Columns: []*schema.Column{FeaturesColumns[5], FeaturesColumns[0]}, }, }, } diff --git a/internal/productcatalog/postgresadapter/ent/db/mutation.go b/internal/productcatalog/postgresadapter/ent/db/mutation.go index f234c6b88..5224e5b37 100644 --- a/internal/productcatalog/postgresadapter/ent/db/mutation.go +++ b/internal/productcatalog/postgresadapter/ent/db/mutation.go @@ -36,6 +36,7 @@ type FeatureMutation struct { created_at *time.Time updated_at *time.Time deleted_at *time.Time + metadata *map[string]string namespace *string name *string key *string @@ -273,6 +274,55 @@ func (m *FeatureMutation) ResetDeletedAt() { delete(m.clearedFields, feature.FieldDeletedAt) } +// SetMetadata sets the "metadata" field. +func (m *FeatureMutation) SetMetadata(value map[string]string) { + m.metadata = &value +} + +// Metadata returns the value of the "metadata" field in the mutation. +func (m *FeatureMutation) Metadata() (r map[string]string, exists bool) { + v := m.metadata + if v == nil { + return + } + return *v, true +} + +// OldMetadata returns the old "metadata" field's value of the Feature entity. +// If the Feature object wasn't provided to the builder, the object is fetched from the database. +// An error is returned if the mutation operation is not UpdateOne, or the database query fails. +func (m *FeatureMutation) OldMetadata(ctx context.Context) (v map[string]string, err error) { + if !m.op.Is(OpUpdateOne) { + return v, errors.New("OldMetadata is only allowed on UpdateOne operations") + } + if m.id == nil || m.oldValue == nil { + return v, errors.New("OldMetadata requires an ID field in the mutation") + } + oldValue, err := m.oldValue(ctx) + if err != nil { + return v, fmt.Errorf("querying old value for OldMetadata: %w", err) + } + return oldValue.Metadata, nil +} + +// ClearMetadata clears the value of the "metadata" field. +func (m *FeatureMutation) ClearMetadata() { + m.metadata = nil + m.clearedFields[feature.FieldMetadata] = struct{}{} +} + +// MetadataCleared returns if the "metadata" field was cleared in this mutation. +func (m *FeatureMutation) MetadataCleared() bool { + _, ok := m.clearedFields[feature.FieldMetadata] + return ok +} + +// ResetMetadata resets all changes to the "metadata" field. +func (m *FeatureMutation) ResetMetadata() { + m.metadata = nil + delete(m.clearedFields, feature.FieldMetadata) +} + // SetNamespace sets the "namespace" field. func (m *FeatureMutation) SetNamespace(s string) { m.namespace = &s @@ -562,7 +612,7 @@ func (m *FeatureMutation) Type() string { // order to get all numeric fields that were incremented/decremented, call // AddedFields(). func (m *FeatureMutation) Fields() []string { - fields := make([]string, 0, 9) + fields := make([]string, 0, 10) if m.created_at != nil { fields = append(fields, feature.FieldCreatedAt) } @@ -572,6 +622,9 @@ func (m *FeatureMutation) Fields() []string { if m.deleted_at != nil { fields = append(fields, feature.FieldDeletedAt) } + if m.metadata != nil { + fields = append(fields, feature.FieldMetadata) + } if m.namespace != nil { fields = append(fields, feature.FieldNamespace) } @@ -604,6 +657,8 @@ func (m *FeatureMutation) Field(name string) (ent.Value, bool) { return m.UpdatedAt() case feature.FieldDeletedAt: return m.DeletedAt() + case feature.FieldMetadata: + return m.Metadata() case feature.FieldNamespace: return m.Namespace() case feature.FieldName: @@ -631,6 +686,8 @@ func (m *FeatureMutation) OldField(ctx context.Context, name string) (ent.Value, return m.OldUpdatedAt(ctx) case feature.FieldDeletedAt: return m.OldDeletedAt(ctx) + case feature.FieldMetadata: + return m.OldMetadata(ctx) case feature.FieldNamespace: return m.OldNamespace(ctx) case feature.FieldName: @@ -673,6 +730,13 @@ func (m *FeatureMutation) SetField(name string, value ent.Value) error { } m.SetDeletedAt(v) return nil + case feature.FieldMetadata: + v, ok := value.(map[string]string) + if !ok { + return fmt.Errorf("unexpected type %T for field %s", value, name) + } + m.SetMetadata(v) + return nil case feature.FieldNamespace: v, ok := value.(string) if !ok { @@ -748,6 +812,9 @@ func (m *FeatureMutation) ClearedFields() []string { if m.FieldCleared(feature.FieldDeletedAt) { fields = append(fields, feature.FieldDeletedAt) } + if m.FieldCleared(feature.FieldMetadata) { + fields = append(fields, feature.FieldMetadata) + } if m.FieldCleared(feature.FieldMeterSlug) { fields = append(fields, feature.FieldMeterSlug) } @@ -774,6 +841,9 @@ func (m *FeatureMutation) ClearField(name string) error { case feature.FieldDeletedAt: m.ClearDeletedAt() return nil + case feature.FieldMetadata: + m.ClearMetadata() + return nil case feature.FieldMeterSlug: m.ClearMeterSlug() return nil @@ -800,6 +870,9 @@ func (m *FeatureMutation) ResetField(name string) error { case feature.FieldDeletedAt: m.ResetDeletedAt() return nil + case feature.FieldMetadata: + m.ResetMetadata() + return nil case feature.FieldNamespace: m.ResetNamespace() return nil diff --git a/internal/productcatalog/postgresadapter/ent/schema/feature.go b/internal/productcatalog/postgresadapter/ent/schema/feature.go index 8cf783a85..ed787a4bb 100644 --- a/internal/productcatalog/postgresadapter/ent/schema/feature.go +++ b/internal/productcatalog/postgresadapter/ent/schema/feature.go @@ -17,6 +17,7 @@ func (Feature) Mixin() []ent.Mixin { return []ent.Mixin{ entutils.IDMixin{}, entutils.TimeMixin{}, + entutils.MetadataAnnotationsMixin{}, } } @@ -25,7 +26,7 @@ func (Feature) Fields() []ent.Field { return []ent.Field{ field.String("namespace").NotEmpty().Immutable(), field.String("name").NotEmpty(), - field.String("key").NotEmpty().Immutable().Unique(), + field.String("key").NotEmpty().Immutable(), field.String("meter_slug").Optional().Nillable().Immutable(), field.JSON("meter_group_by_filters", map[string]string{}).Optional(), field.Time("archived_at").Optional().Nillable(), diff --git a/internal/productcatalog/postgresadapter/feature.go b/internal/productcatalog/postgresadapter/feature.go index 564206909..d3f812759 100644 --- a/internal/productcatalog/postgresadapter/feature.go +++ b/internal/productcatalog/postgresadapter/feature.go @@ -30,6 +30,7 @@ func (c *featureDBAdapter) CreateFeature(ctx context.Context, feature productcat SetName(feature.Name). SetKey(feature.Key). SetNamespace(feature.Namespace). + SetMetadata(feature.Metadata). SetNillableMeterSlug(feature.MeterSlug) if feature.MeterGroupByFilters != nil { @@ -136,6 +137,7 @@ func mapFeatureEntity(entity *db.Feature) productcatalog.Feature { ArchivedAt: entity.ArchivedAt, CreatedAt: entity.CreatedAt.In(time.UTC), UpdatedAt: entity.UpdatedAt.In(time.UTC), + Metadata: entity.Metadata, } if len(entity.MeterGroupByFilters) > 0 {