From c9c979b75624a3bfe16f267e080d983e36fbaa2a Mon Sep 17 00:00:00 2001 From: Peter Turi Date: Fri, 28 Jun 2024 17:08:39 +0200 Subject: [PATCH 1/4] fix: add more description to grant's effective at --- api/openapi.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/openapi.yaml b/api/openapi.yaml index 115223ae4..665d64d67 100644 --- a/api/openapi.yaml +++ b/api/openapi.yaml @@ -1847,7 +1847,7 @@ components: example: 1 effectiveAt: description: | - The effective time. Provided value will be ceiled to metering windowSize (minute). + Effective date for grants and anchor for recurring grants. Provided value will be ceiled to metering windowSize (minute). type: string format: date-time example: "2023-01-01T00:00:00Z" From 39109611a03c48d8aa71e4195431452d81a61f1b Mon Sep 17 00:00:00 2001 From: Peter Turi Date: Fri, 28 Jun 2024 17:45:31 +0200 Subject: [PATCH 2/4] fix: give proper bad request response if the errors are wrapped This patch ensures that in a safe way we are detecting specialzed wrapped errors and returning them properly. For example: ``` { "type": "about:blank", "title": "Bad Request", "status": 400, "detail": "expected entitlement type metered but got boolean", "instance": "urn:request:Peters-MacBook-Pro-2.local/pIczzAiUtF-000001" } ``` Instead of an internal server error --- internal/entitlement/httpdriver/errors.go | 59 +++----------------- internal/productcatalog/httpdriver/errors.go | 47 ++-------------- pkg/errorsx/convert.go | 11 ++++ pkg/framework/commonhttp/errors.go | 13 +++++ 4 files changed, 36 insertions(+), 94 deletions(-) create mode 100644 pkg/errorsx/convert.go diff --git a/internal/entitlement/httpdriver/errors.go b/internal/entitlement/httpdriver/errors.go index 5d4bb4cb9..5f73b4830 100644 --- a/internal/entitlement/httpdriver/errors.go +++ b/internal/entitlement/httpdriver/errors.go @@ -14,57 +14,12 @@ import ( func getErrorEncoder() httptransport.ErrorEncoder { return func(ctx context.Context, err error, w http.ResponseWriter) bool { // user errors - if _, ok := err.(*productcatalog.FeatureNotFoundError); ok { - commonhttp.NewHTTPError( - http.StatusNotFound, - err, - ).EncodeError(ctx, w) - return true - } - if _, ok := err.(*entitlement.NotFoundError); ok { - commonhttp.NewHTTPError( - http.StatusNotFound, - err, - ).EncodeError(ctx, w) - return true - } - if _, ok := err.(*models.GenericUserError); ok { - commonhttp.NewHTTPError( - http.StatusBadRequest, - err, - ).EncodeError(ctx, w) - return true - } - if err, ok := err.(*entitlement.AlreadyExistsError); ok { - commonhttp.NewHTTPError( - http.StatusConflict, - err, - commonhttp.ExtendProblem("conflictingEntityId", err.EntitlementID), - ).EncodeError(ctx, w) - return true - } - if err, ok := err.(*entitlement.InvalidValueError); ok { - commonhttp.NewHTTPError( - http.StatusBadRequest, - err, - ).EncodeError(ctx, w) - return true - } - if err, ok := err.(*entitlement.InvalidFeatureError); ok { - commonhttp.NewHTTPError( - http.StatusBadRequest, - err, - ).EncodeError(ctx, w) - return true - } - // system errors (naming known errors for transparency) - if _, ok := err.(*entitlement.WrongTypeError); ok { - commonhttp.NewHTTPError( - http.StatusInternalServerError, - err, - ).EncodeError(ctx, w) - return true - } - return false + return commonhttp.HandleErrorIfTypeMatches[*productcatalog.FeatureNotFoundError](ctx, http.StatusNotFound, err, w) || + commonhttp.HandleErrorIfTypeMatches[*entitlement.NotFoundError](ctx, http.StatusNotFound, err, w) || + commonhttp.HandleErrorIfTypeMatches[*models.GenericUserError](ctx, http.StatusBadRequest, err, w) || + commonhttp.HandleErrorIfTypeMatches[*entitlement.AlreadyExistsError](ctx, http.StatusConflict, err, w) || + commonhttp.HandleErrorIfTypeMatches[*entitlement.InvalidValueError](ctx, http.StatusBadRequest, err, w) || + commonhttp.HandleErrorIfTypeMatches[*entitlement.InvalidFeatureError](ctx, http.StatusBadRequest, err, w) || + commonhttp.HandleErrorIfTypeMatches[*entitlement.WrongTypeError](ctx, http.StatusBadRequest, err, w) } } diff --git a/internal/productcatalog/httpdriver/errors.go b/internal/productcatalog/httpdriver/errors.go index bb1a8882c..c65a43d29 100644 --- a/internal/productcatalog/httpdriver/errors.go +++ b/internal/productcatalog/httpdriver/errors.go @@ -12,47 +12,10 @@ import ( func getErrorEncoder() httptransport.ErrorEncoder { return func(ctx context.Context, err error, w http.ResponseWriter) bool { - // user errors - if _, ok := err.(*productcatalog.FeatureNotFoundError); ok { - commonhttp.NewHTTPError( - http.StatusNotFound, - err, - ).EncodeError(ctx, w) - return true - } - - if _, ok := err.(*productcatalog.FeatureInvalidFiltersError); ok { - commonhttp.NewHTTPError( - http.StatusBadRequest, - err, - ).EncodeError(ctx, w) - return true - } - - if _, ok := err.(*productcatalog.FeatureInvalidMeterAggregationError); ok { - commonhttp.NewHTTPError( - http.StatusBadRequest, - err, - ).EncodeError(ctx, w) - return true - } - - if _, ok := err.(*models.MeterNotFoundError); ok { - commonhttp.NewHTTPError( - http.StatusNotFound, - err, - ).EncodeError(ctx, w) - return true - } - - if _, ok := err.(*productcatalog.FeatureWithNameAlreadyExistsError); ok { - commonhttp.NewHTTPError( - http.StatusConflict, - err, - ).EncodeError(ctx, w) - return true - } - - return false + return commonhttp.HandleErrorIfTypeMatches[*productcatalog.FeatureNotFoundError](ctx, http.StatusNotFound, err, w) || + commonhttp.HandleErrorIfTypeMatches[*productcatalog.FeatureInvalidFiltersError](ctx, http.StatusBadRequest, err, w) || + commonhttp.HandleErrorIfTypeMatches[*productcatalog.FeatureInvalidMeterAggregationError](ctx, http.StatusBadRequest, err, w) || + commonhttp.HandleErrorIfTypeMatches[*models.MeterNotFoundError](ctx, http.StatusNotFound, err, w) || + commonhttp.HandleErrorIfTypeMatches[*productcatalog.FeatureWithNameAlreadyExistsError](ctx, http.StatusConflict, err, w) } } diff --git a/pkg/errorsx/convert.go b/pkg/errorsx/convert.go new file mode 100644 index 000000000..0c2481029 --- /dev/null +++ b/pkg/errorsx/convert.go @@ -0,0 +1,11 @@ +package errorsx + +import "errors" + +func ErrorAs[T error](err error) (T, bool) { + var outerr T + if errors.As(err, &outerr) { + return outerr, true + } + return outerr, false +} diff --git a/pkg/framework/commonhttp/errors.go b/pkg/framework/commonhttp/errors.go index f6892425b..bc016f852 100644 --- a/pkg/framework/commonhttp/errors.go +++ b/pkg/framework/commonhttp/errors.go @@ -5,6 +5,7 @@ import ( "errors" "net/http" + "github.com/openmeterio/openmeter/pkg/errorsx" "github.com/openmeterio/openmeter/pkg/models" ) @@ -50,3 +51,15 @@ func ErrorEncoder(ctx context.Context, _ error, w http.ResponseWriter) bool { return false } + +// HandleErrorIfTypeMatches checks if the error is of the given type and encodes it as an HTTP error. +// Using the generic feature we can mandate that the error implements the error interface. This is a +// must, as the errors.As would panic if the error does not implement the error interface. +func HandleErrorIfTypeMatches[T error](ctx context.Context, statusCode int, err error, w http.ResponseWriter) bool { + if err, ok := errorsx.ErrorAs[T](err); ok { + NewHTTPError(statusCode, err).EncodeError(ctx, w) + return true + } + + return false +} From 8accbfea956ad09d82c01a5fb4f3cb32dbc6293a Mon Sep 17 00:00:00 2001 From: Peter Turi Date: Fri, 28 Jun 2024 18:04:58 +0200 Subject: [PATCH 3/4] fix: regenerate api --- api/api.gen.go | 343 +++++++++--------- api/client/go/client.gen.go | 343 +++++++++--------- api/client/node/schemas/openapi.ts | 2 +- .../src/openmeter/_operations/_operations.py | 95 ++--- .../openmeter/aio/_operations/_operations.py | 95 ++--- api/client/web/src/client/openapi.ts | 8 +- 6 files changed, 451 insertions(+), 435 deletions(-) diff --git a/api/api.gen.go b/api/api.gen.go index cfa5d0e15..279f30dc8 100644 --- a/api/api.gen.go +++ b/api/api.gen.go @@ -245,7 +245,7 @@ type EntitlementGrant struct { // DeletedAt The date and time the resource was deleted. Null if not deleted. DeletedAt *time.Time `json:"deletedAt,omitempty"` - // EffectiveAt The effective time. Provided value will be ceiled to metering windowSize (minute). + // EffectiveAt Effective date for grants and anchor for recurring grants. Provided value will be ceiled to metering windowSize (minute). EffectiveAt time.Time `json:"effectiveAt"` // EntitlementId The unique entitlement ULID that the grant is associated with. @@ -297,7 +297,7 @@ type EntitlementGrantCreateInput struct { // Amount The amount to grant. Should be a positive number. Amount float64 `json:"amount"` - // EffectiveAt The effective time. Provided value will be ceiled to metering windowSize (minute). + // EffectiveAt Effective date for grants and anchor for recurring grants. Provided value will be ceiled to metering windowSize (minute). EffectiveAt time.Time `json:"effectiveAt"` Expiration ExpirationPeriod `json:"expiration"` @@ -3186,175 +3186,176 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "pJKk2vUAAA==", } // 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 a10ce9241..285bbd3c1 100644 --- a/api/client/go/client.gen.go +++ b/api/client/go/client.gen.go @@ -245,7 +245,7 @@ type EntitlementGrant struct { // DeletedAt The date and time the resource was deleted. Null if not deleted. DeletedAt *time.Time `json:"deletedAt,omitempty"` - // EffectiveAt The effective time. Provided value will be ceiled to metering windowSize (minute). + // EffectiveAt Effective date for grants and anchor for recurring grants. Provided value will be ceiled to metering windowSize (minute). EffectiveAt time.Time `json:"effectiveAt"` // EntitlementId The unique entitlement ULID that the grant is associated with. @@ -297,7 +297,7 @@ type EntitlementGrantCreateInput struct { // Amount The amount to grant. Should be a positive number. Amount float64 `json:"amount"` - // EffectiveAt The effective time. Provided value will be ceiled to metering windowSize (minute). + // EffectiveAt Effective date for grants and anchor for recurring grants. Provided value will be ceiled to metering windowSize (minute). EffectiveAt time.Time `json:"effectiveAt"` Expiration ExpirationPeriod `json:"expiration"` @@ -6786,175 +6786,176 @@ func ParseResetEntitlementUsageResponse(rsp *http.Response) (*ResetEntitlementUs // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "pJKk2vUAAA==", } // 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 a074320c4..8d350dd30 100644 --- a/api/client/node/schemas/openapi.ts +++ b/api/client/node/schemas/openapi.ts @@ -791,7 +791,7 @@ export interface components { priority?: number /** * Format: date-time - * @description The effective time. Provided value will be ceiled to metering windowSize (minute). + * @description Effective date for grants and anchor for recurring grants. Provided value will be ceiled to metering windowSize (minute). * * @example 2023-01-01T00:00:00Z */ diff --git a/api/client/python/src/openmeter/_operations/_operations.py b/api/client/python/src/openmeter/_operations/_operations.py index e1eed665d..45b03d98c 100644 --- a/api/client/python/src/openmeter/_operations/_operations.py +++ b/api/client/python/src/openmeter/_operations/_operations.py @@ -2695,16 +2695,16 @@ def list_features( { "createdAt": "2020-02-20 00:00:00", # The date and time the resource was created. Required. - "deletedAt": "2020-02-20 00:00:00", # The date and time the resource - was deleted. Required. "id": "str", # Readonly unique ULID identifier. Required. "key": "str", # The unique key of the feature to reference it from your application. Required. "name": "str", # The name of the feature. Required. "updatedAt": "2020-02-20 00:00:00", # The date and time the resource - was last updated. Required. + was last updated. Defaults to createdAt if not updated. Required. "archivedAt": "2020-02-20 00:00:00", # Optional. If the feature is archived, it will not be used for grants or usage. + "deletedAt": "2020-02-20 00:00:00", # Optional. The date and time + the resource was deleted. Null if not deleted. "metadata": { "str": "str" # Optional. Additional metadata for the feature. @@ -2805,16 +2805,16 @@ def create_feature(self, body: JSON, *, content_type: str = "application/json", response == { "createdAt": "2020-02-20 00:00:00", # The date and time the resource was created. Required. - "deletedAt": "2020-02-20 00:00:00", # The date and time the resource was - deleted. Required. "id": "str", # Readonly unique ULID identifier. Required. "key": "str", # The unique key of the feature to reference it from your application. Required. "name": "str", # The name of the feature. Required. "updatedAt": "2020-02-20 00:00:00", # The date and time the resource was - last updated. Required. + last updated. Defaults to createdAt if not updated. Required. "archivedAt": "2020-02-20 00:00:00", # Optional. If the feature is archived, it will not be used for grants or usage. + "deletedAt": "2020-02-20 00:00:00", # Optional. The date and time the + resource was deleted. Null if not deleted. "metadata": { "str": "str" # Optional. Additional metadata for the feature. }, @@ -2851,16 +2851,16 @@ def create_feature(self, body: IO[bytes], *, content_type: str = "application/js response == { "createdAt": "2020-02-20 00:00:00", # The date and time the resource was created. Required. - "deletedAt": "2020-02-20 00:00:00", # The date and time the resource was - deleted. Required. "id": "str", # Readonly unique ULID identifier. Required. "key": "str", # The unique key of the feature to reference it from your application. Required. "name": "str", # The name of the feature. Required. "updatedAt": "2020-02-20 00:00:00", # The date and time the resource was - last updated. Required. + last updated. Defaults to createdAt if not updated. Required. "archivedAt": "2020-02-20 00:00:00", # Optional. If the feature is archived, it will not be used for grants or usage. + "deletedAt": "2020-02-20 00:00:00", # Optional. The date and time the + resource was deleted. Null if not deleted. "metadata": { "str": "str" # Optional. Additional metadata for the feature. }, @@ -2911,16 +2911,16 @@ def create_feature(self, body: Union[JSON, IO[bytes]], **kwargs: Any) -> JSON: response == { "createdAt": "2020-02-20 00:00:00", # The date and time the resource was created. Required. - "deletedAt": "2020-02-20 00:00:00", # The date and time the resource was - deleted. Required. "id": "str", # Readonly unique ULID identifier. Required. "key": "str", # The unique key of the feature to reference it from your application. Required. "name": "str", # The name of the feature. Required. "updatedAt": "2020-02-20 00:00:00", # The date and time the resource was - last updated. Required. + last updated. Defaults to createdAt if not updated. Required. "archivedAt": "2020-02-20 00:00:00", # Optional. If the feature is archived, it will not be used for grants or usage. + "deletedAt": "2020-02-20 00:00:00", # Optional. The date and time the + resource was deleted. Null if not deleted. "metadata": { "str": "str" # Optional. Additional metadata for the feature. }, @@ -3009,16 +3009,16 @@ def get_feature(self, feature_id: str, **kwargs: Any) -> JSON: response == { "createdAt": "2020-02-20 00:00:00", # The date and time the resource was created. Required. - "deletedAt": "2020-02-20 00:00:00", # The date and time the resource was - deleted. Required. "id": "str", # Readonly unique ULID identifier. Required. "key": "str", # The unique key of the feature to reference it from your application. Required. "name": "str", # The name of the feature. Required. "updatedAt": "2020-02-20 00:00:00", # The date and time the resource was - last updated. Required. + last updated. Defaults to createdAt if not updated. Required. "archivedAt": "2020-02-20 00:00:00", # Optional. If the feature is archived, it will not be used for grants or usage. + "deletedAt": "2020-02-20 00:00:00", # Optional. The date and time the + resource was deleted. Null if not deleted. "metadata": { "str": "str" # Optional. Additional metadata for the feature. }, @@ -3160,10 +3160,9 @@ def list_grants( Required. "createdAt": "2020-02-20 00:00:00", # The date and time the resource was created. Required. - "deletedAt": "2020-02-20 00:00:00", # The date and time the resource - was deleted. Required. - "effectiveAt": "2020-02-20 00:00:00", # The effective time. Provided - value will be ceiled to metering windowSize (minute). Required. + "effectiveAt": "2020-02-20 00:00:00", # Effective date for grants + and anchor for recurring grants. Provided value will be ceiled to metering + windowSize (minute). Required. "entitlementId": "str", # The unique entitlement ULID that the grant is associated with. Required. "expiration": { @@ -3175,7 +3174,9 @@ def list_grants( }, "id": "str", # Readonly unique ULID identifier. Required. "updatedAt": "2020-02-20 00:00:00", # The date and time the resource - was last updated. Required. + was last updated. Defaults to createdAt if not updated. Required. + "deletedAt": "2020-02-20 00:00:00", # Optional. The date and time + the resource was deleted. Null if not deleted. "expiresAt": "2020-02-20 00:00:00", # Optional. The expiration date of the grant. "maxRolloverAmount": 0, # Optional. Default value is 0. Grants are @@ -3753,10 +3754,9 @@ def list_entitlement_grants( Required. "createdAt": "2020-02-20 00:00:00", # The date and time the resource was created. Required. - "deletedAt": "2020-02-20 00:00:00", # The date and time the resource - was deleted. Required. - "effectiveAt": "2020-02-20 00:00:00", # The effective time. Provided - value will be ceiled to metering windowSize (minute). Required. + "effectiveAt": "2020-02-20 00:00:00", # Effective date for grants + and anchor for recurring grants. Provided value will be ceiled to metering + windowSize (minute). Required. "entitlementId": "str", # The unique entitlement ULID that the grant is associated with. Required. "expiration": { @@ -3768,7 +3768,9 @@ def list_entitlement_grants( }, "id": "str", # Readonly unique ULID identifier. Required. "updatedAt": "2020-02-20 00:00:00", # The date and time the resource - was last updated. Required. + was last updated. Defaults to createdAt if not updated. Required. + "deletedAt": "2020-02-20 00:00:00", # Optional. The date and time + the resource was deleted. Null if not deleted. "expiresAt": "2020-02-20 00:00:00", # Optional. The expiration date of the grant. "maxRolloverAmount": 0, # Optional. Default value is 0. Grants are @@ -3888,8 +3890,9 @@ def create_grant( # JSON input template you can fill out and use as your body input. body = { "amount": 0.0, # The amount to grant. Should be a positive number. Required. - "effectiveAt": "2020-02-20 00:00:00", # The effective time. Provided value - will be ceiled to metering windowSize (minute). Required. + "effectiveAt": "2020-02-20 00:00:00", # Effective date for grants and anchor + for recurring grants. Provided value will be ceiled to metering windowSize + (minute). Required. "expiration": { "count": 0, # The expiration period count like 12 months. Required. "duration": "str" # The expiration period duration like month. @@ -3933,10 +3936,9 @@ def create_grant( "amount": 0.0, # The amount to grant. Should be a positive number. Required. "createdAt": "2020-02-20 00:00:00", # The date and time the resource was created. Required. - "deletedAt": "2020-02-20 00:00:00", # The date and time the resource was - deleted. Required. - "effectiveAt": "2020-02-20 00:00:00", # The effective time. Provided value - will be ceiled to metering windowSize (minute). Required. + "effectiveAt": "2020-02-20 00:00:00", # Effective date for grants and anchor + for recurring grants. Provided value will be ceiled to metering windowSize + (minute). Required. "entitlementId": "str", # The unique entitlement ULID that the grant is associated with. Required. "expiration": { @@ -3946,7 +3948,9 @@ def create_grant( }, "id": "str", # Readonly unique ULID identifier. Required. "updatedAt": "2020-02-20 00:00:00", # The date and time the resource was - last updated. Required. + last updated. Defaults to createdAt if not updated. Required. + "deletedAt": "2020-02-20 00:00:00", # Optional. The date and time the + resource was deleted. Null if not deleted. "expiresAt": "2020-02-20 00:00:00", # Optional. The expiration date of the grant. "maxRolloverAmount": 0, # Optional. Default value is 0. Grants are rolled @@ -4022,10 +4026,9 @@ def create_grant( "amount": 0.0, # The amount to grant. Should be a positive number. Required. "createdAt": "2020-02-20 00:00:00", # The date and time the resource was created. Required. - "deletedAt": "2020-02-20 00:00:00", # The date and time the resource was - deleted. Required. - "effectiveAt": "2020-02-20 00:00:00", # The effective time. Provided value - will be ceiled to metering windowSize (minute). Required. + "effectiveAt": "2020-02-20 00:00:00", # Effective date for grants and anchor + for recurring grants. Provided value will be ceiled to metering windowSize + (minute). Required. "entitlementId": "str", # The unique entitlement ULID that the grant is associated with. Required. "expiration": { @@ -4035,7 +4038,9 @@ def create_grant( }, "id": "str", # Readonly unique ULID identifier. Required. "updatedAt": "2020-02-20 00:00:00", # The date and time the resource was - last updated. Required. + last updated. Defaults to createdAt if not updated. Required. + "deletedAt": "2020-02-20 00:00:00", # Optional. The date and time the + resource was deleted. Null if not deleted. "expiresAt": "2020-02-20 00:00:00", # Optional. The expiration date of the grant. "maxRolloverAmount": 0, # Optional. Default value is 0. Grants are rolled @@ -4100,8 +4105,9 @@ def create_grant( # JSON input template you can fill out and use as your body input. body = { "amount": 0.0, # The amount to grant. Should be a positive number. Required. - "effectiveAt": "2020-02-20 00:00:00", # The effective time. Provided value - will be ceiled to metering windowSize (minute). Required. + "effectiveAt": "2020-02-20 00:00:00", # Effective date for grants and anchor + for recurring grants. Provided value will be ceiled to metering windowSize + (minute). Required. "expiration": { "count": 0, # The expiration period count like 12 months. Required. "duration": "str" # The expiration period duration like month. @@ -4145,10 +4151,9 @@ def create_grant( "amount": 0.0, # The amount to grant. Should be a positive number. Required. "createdAt": "2020-02-20 00:00:00", # The date and time the resource was created. Required. - "deletedAt": "2020-02-20 00:00:00", # The date and time the resource was - deleted. Required. - "effectiveAt": "2020-02-20 00:00:00", # The effective time. Provided value - will be ceiled to metering windowSize (minute). Required. + "effectiveAt": "2020-02-20 00:00:00", # Effective date for grants and anchor + for recurring grants. Provided value will be ceiled to metering windowSize + (minute). Required. "entitlementId": "str", # The unique entitlement ULID that the grant is associated with. Required. "expiration": { @@ -4158,7 +4163,9 @@ def create_grant( }, "id": "str", # Readonly unique ULID identifier. Required. "updatedAt": "2020-02-20 00:00:00", # The date and time the resource was - last updated. Required. + last updated. Defaults to createdAt if not updated. Required. + "deletedAt": "2020-02-20 00:00:00", # Optional. The date and time the + resource was deleted. Null if not deleted. "expiresAt": "2020-02-20 00:00:00", # Optional. The expiration date of the grant. "maxRolloverAmount": 0, # Optional. Default value is 0. Grants are rolled diff --git a/api/client/python/src/openmeter/aio/_operations/_operations.py b/api/client/python/src/openmeter/aio/_operations/_operations.py index 577f73935..1ba82a3ee 100644 --- a/api/client/python/src/openmeter/aio/_operations/_operations.py +++ b/api/client/python/src/openmeter/aio/_operations/_operations.py @@ -1991,16 +1991,16 @@ async def list_features( { "createdAt": "2020-02-20 00:00:00", # The date and time the resource was created. Required. - "deletedAt": "2020-02-20 00:00:00", # The date and time the resource - was deleted. Required. "id": "str", # Readonly unique ULID identifier. Required. "key": "str", # The unique key of the feature to reference it from your application. Required. "name": "str", # The name of the feature. Required. "updatedAt": "2020-02-20 00:00:00", # The date and time the resource - was last updated. Required. + was last updated. Defaults to createdAt if not updated. Required. "archivedAt": "2020-02-20 00:00:00", # Optional. If the feature is archived, it will not be used for grants or usage. + "deletedAt": "2020-02-20 00:00:00", # Optional. The date and time + the resource was deleted. Null if not deleted. "metadata": { "str": "str" # Optional. Additional metadata for the feature. @@ -2101,16 +2101,16 @@ async def create_feature(self, body: JSON, *, content_type: str = "application/j response == { "createdAt": "2020-02-20 00:00:00", # The date and time the resource was created. Required. - "deletedAt": "2020-02-20 00:00:00", # The date and time the resource was - deleted. Required. "id": "str", # Readonly unique ULID identifier. Required. "key": "str", # The unique key of the feature to reference it from your application. Required. "name": "str", # The name of the feature. Required. "updatedAt": "2020-02-20 00:00:00", # The date and time the resource was - last updated. Required. + last updated. Defaults to createdAt if not updated. Required. "archivedAt": "2020-02-20 00:00:00", # Optional. If the feature is archived, it will not be used for grants or usage. + "deletedAt": "2020-02-20 00:00:00", # Optional. The date and time the + resource was deleted. Null if not deleted. "metadata": { "str": "str" # Optional. Additional metadata for the feature. }, @@ -2147,16 +2147,16 @@ async def create_feature(self, body: IO[bytes], *, content_type: str = "applicat response == { "createdAt": "2020-02-20 00:00:00", # The date and time the resource was created. Required. - "deletedAt": "2020-02-20 00:00:00", # The date and time the resource was - deleted. Required. "id": "str", # Readonly unique ULID identifier. Required. "key": "str", # The unique key of the feature to reference it from your application. Required. "name": "str", # The name of the feature. Required. "updatedAt": "2020-02-20 00:00:00", # The date and time the resource was - last updated. Required. + last updated. Defaults to createdAt if not updated. Required. "archivedAt": "2020-02-20 00:00:00", # Optional. If the feature is archived, it will not be used for grants or usage. + "deletedAt": "2020-02-20 00:00:00", # Optional. The date and time the + resource was deleted. Null if not deleted. "metadata": { "str": "str" # Optional. Additional metadata for the feature. }, @@ -2207,16 +2207,16 @@ async def create_feature(self, body: Union[JSON, IO[bytes]], **kwargs: Any) -> J response == { "createdAt": "2020-02-20 00:00:00", # The date and time the resource was created. Required. - "deletedAt": "2020-02-20 00:00:00", # The date and time the resource was - deleted. Required. "id": "str", # Readonly unique ULID identifier. Required. "key": "str", # The unique key of the feature to reference it from your application. Required. "name": "str", # The name of the feature. Required. "updatedAt": "2020-02-20 00:00:00", # The date and time the resource was - last updated. Required. + last updated. Defaults to createdAt if not updated. Required. "archivedAt": "2020-02-20 00:00:00", # Optional. If the feature is archived, it will not be used for grants or usage. + "deletedAt": "2020-02-20 00:00:00", # Optional. The date and time the + resource was deleted. Null if not deleted. "metadata": { "str": "str" # Optional. Additional metadata for the feature. }, @@ -2305,16 +2305,16 @@ async def get_feature(self, feature_id: str, **kwargs: Any) -> JSON: response == { "createdAt": "2020-02-20 00:00:00", # The date and time the resource was created. Required. - "deletedAt": "2020-02-20 00:00:00", # The date and time the resource was - deleted. Required. "id": "str", # Readonly unique ULID identifier. Required. "key": "str", # The unique key of the feature to reference it from your application. Required. "name": "str", # The name of the feature. Required. "updatedAt": "2020-02-20 00:00:00", # The date and time the resource was - last updated. Required. + last updated. Defaults to createdAt if not updated. Required. "archivedAt": "2020-02-20 00:00:00", # Optional. If the feature is archived, it will not be used for grants or usage. + "deletedAt": "2020-02-20 00:00:00", # Optional. The date and time the + resource was deleted. Null if not deleted. "metadata": { "str": "str" # Optional. Additional metadata for the feature. }, @@ -2458,10 +2458,9 @@ async def list_grants( Required. "createdAt": "2020-02-20 00:00:00", # The date and time the resource was created. Required. - "deletedAt": "2020-02-20 00:00:00", # The date and time the resource - was deleted. Required. - "effectiveAt": "2020-02-20 00:00:00", # The effective time. Provided - value will be ceiled to metering windowSize (minute). Required. + "effectiveAt": "2020-02-20 00:00:00", # Effective date for grants + and anchor for recurring grants. Provided value will be ceiled to metering + windowSize (minute). Required. "entitlementId": "str", # The unique entitlement ULID that the grant is associated with. Required. "expiration": { @@ -2473,7 +2472,9 @@ async def list_grants( }, "id": "str", # Readonly unique ULID identifier. Required. "updatedAt": "2020-02-20 00:00:00", # The date and time the resource - was last updated. Required. + was last updated. Defaults to createdAt if not updated. Required. + "deletedAt": "2020-02-20 00:00:00", # Optional. The date and time + the resource was deleted. Null if not deleted. "expiresAt": "2020-02-20 00:00:00", # Optional. The expiration date of the grant. "maxRolloverAmount": 0, # Optional. Default value is 0. Grants are @@ -3051,10 +3052,9 @@ async def list_entitlement_grants( Required. "createdAt": "2020-02-20 00:00:00", # The date and time the resource was created. Required. - "deletedAt": "2020-02-20 00:00:00", # The date and time the resource - was deleted. Required. - "effectiveAt": "2020-02-20 00:00:00", # The effective time. Provided - value will be ceiled to metering windowSize (minute). Required. + "effectiveAt": "2020-02-20 00:00:00", # Effective date for grants + and anchor for recurring grants. Provided value will be ceiled to metering + windowSize (minute). Required. "entitlementId": "str", # The unique entitlement ULID that the grant is associated with. Required. "expiration": { @@ -3066,7 +3066,9 @@ async def list_entitlement_grants( }, "id": "str", # Readonly unique ULID identifier. Required. "updatedAt": "2020-02-20 00:00:00", # The date and time the resource - was last updated. Required. + was last updated. Defaults to createdAt if not updated. Required. + "deletedAt": "2020-02-20 00:00:00", # Optional. The date and time + the resource was deleted. Null if not deleted. "expiresAt": "2020-02-20 00:00:00", # Optional. The expiration date of the grant. "maxRolloverAmount": 0, # Optional. Default value is 0. Grants are @@ -3186,8 +3188,9 @@ async def create_grant( # JSON input template you can fill out and use as your body input. body = { "amount": 0.0, # The amount to grant. Should be a positive number. Required. - "effectiveAt": "2020-02-20 00:00:00", # The effective time. Provided value - will be ceiled to metering windowSize (minute). Required. + "effectiveAt": "2020-02-20 00:00:00", # Effective date for grants and anchor + for recurring grants. Provided value will be ceiled to metering windowSize + (minute). Required. "expiration": { "count": 0, # The expiration period count like 12 months. Required. "duration": "str" # The expiration period duration like month. @@ -3231,10 +3234,9 @@ async def create_grant( "amount": 0.0, # The amount to grant. Should be a positive number. Required. "createdAt": "2020-02-20 00:00:00", # The date and time the resource was created. Required. - "deletedAt": "2020-02-20 00:00:00", # The date and time the resource was - deleted. Required. - "effectiveAt": "2020-02-20 00:00:00", # The effective time. Provided value - will be ceiled to metering windowSize (minute). Required. + "effectiveAt": "2020-02-20 00:00:00", # Effective date for grants and anchor + for recurring grants. Provided value will be ceiled to metering windowSize + (minute). Required. "entitlementId": "str", # The unique entitlement ULID that the grant is associated with. Required. "expiration": { @@ -3244,7 +3246,9 @@ async def create_grant( }, "id": "str", # Readonly unique ULID identifier. Required. "updatedAt": "2020-02-20 00:00:00", # The date and time the resource was - last updated. Required. + last updated. Defaults to createdAt if not updated. Required. + "deletedAt": "2020-02-20 00:00:00", # Optional. The date and time the + resource was deleted. Null if not deleted. "expiresAt": "2020-02-20 00:00:00", # Optional. The expiration date of the grant. "maxRolloverAmount": 0, # Optional. Default value is 0. Grants are rolled @@ -3320,10 +3324,9 @@ async def create_grant( "amount": 0.0, # The amount to grant. Should be a positive number. Required. "createdAt": "2020-02-20 00:00:00", # The date and time the resource was created. Required. - "deletedAt": "2020-02-20 00:00:00", # The date and time the resource was - deleted. Required. - "effectiveAt": "2020-02-20 00:00:00", # The effective time. Provided value - will be ceiled to metering windowSize (minute). Required. + "effectiveAt": "2020-02-20 00:00:00", # Effective date for grants and anchor + for recurring grants. Provided value will be ceiled to metering windowSize + (minute). Required. "entitlementId": "str", # The unique entitlement ULID that the grant is associated with. Required. "expiration": { @@ -3333,7 +3336,9 @@ async def create_grant( }, "id": "str", # Readonly unique ULID identifier. Required. "updatedAt": "2020-02-20 00:00:00", # The date and time the resource was - last updated. Required. + last updated. Defaults to createdAt if not updated. Required. + "deletedAt": "2020-02-20 00:00:00", # Optional. The date and time the + resource was deleted. Null if not deleted. "expiresAt": "2020-02-20 00:00:00", # Optional. The expiration date of the grant. "maxRolloverAmount": 0, # Optional. Default value is 0. Grants are rolled @@ -3398,8 +3403,9 @@ async def create_grant( # JSON input template you can fill out and use as your body input. body = { "amount": 0.0, # The amount to grant. Should be a positive number. Required. - "effectiveAt": "2020-02-20 00:00:00", # The effective time. Provided value - will be ceiled to metering windowSize (minute). Required. + "effectiveAt": "2020-02-20 00:00:00", # Effective date for grants and anchor + for recurring grants. Provided value will be ceiled to metering windowSize + (minute). Required. "expiration": { "count": 0, # The expiration period count like 12 months. Required. "duration": "str" # The expiration period duration like month. @@ -3443,10 +3449,9 @@ async def create_grant( "amount": 0.0, # The amount to grant. Should be a positive number. Required. "createdAt": "2020-02-20 00:00:00", # The date and time the resource was created. Required. - "deletedAt": "2020-02-20 00:00:00", # The date and time the resource was - deleted. Required. - "effectiveAt": "2020-02-20 00:00:00", # The effective time. Provided value - will be ceiled to metering windowSize (minute). Required. + "effectiveAt": "2020-02-20 00:00:00", # Effective date for grants and anchor + for recurring grants. Provided value will be ceiled to metering windowSize + (minute). Required. "entitlementId": "str", # The unique entitlement ULID that the grant is associated with. Required. "expiration": { @@ -3456,7 +3461,9 @@ async def create_grant( }, "id": "str", # Readonly unique ULID identifier. Required. "updatedAt": "2020-02-20 00:00:00", # The date and time the resource was - last updated. Required. + last updated. Defaults to createdAt if not updated. Required. + "deletedAt": "2020-02-20 00:00:00", # Optional. The date and time the + resource was deleted. Null if not deleted. "expiresAt": "2020-02-20 00:00:00", # Optional. The expiration date of the grant. "maxRolloverAmount": 0, # Optional. Default value is 0. Grants are rolled diff --git a/api/client/web/src/client/openapi.ts b/api/client/web/src/client/openapi.ts index d506e783a..8d350dd30 100644 --- a/api/client/web/src/client/openapi.ts +++ b/api/client/web/src/client/openapi.ts @@ -253,16 +253,16 @@ export interface components { createdAt: string /** * Format: date-time - * @description The date and time the resource was last updated. + * @description The date and time the resource was last updated. Defaults to createdAt if not updated. * @example 2023-01-01T00:00:00Z */ updatedAt: string /** * Format: date-time - * @description The date and time the resource was deleted. + * @description The date and time the resource was deleted. Null if not deleted. * @example 2023-01-01T00:00:00Z */ - deletedAt: string + deletedAt?: string } /** * @description Conflict @@ -791,7 +791,7 @@ export interface components { priority?: number /** * Format: date-time - * @description The effective time. Provided value will be ceiled to metering windowSize (minute). + * @description Effective date for grants and anchor for recurring grants. Provided value will be ceiled to metering windowSize (minute). * * @example 2023-01-01T00:00:00Z */ From d1c3ddf40b7f6109291a52e7e3eaea2c90b0f98d Mon Sep 17 00:00:00 2001 From: Peter Turi Date: Fri, 28 Jun 2024 20:42:47 +0200 Subject: [PATCH 4/4] fix: missing error return --- internal/entitlement/httpdriver/errors.go | 6 +++++- pkg/framework/commonhttp/errors.go | 10 ++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/internal/entitlement/httpdriver/errors.go b/internal/entitlement/httpdriver/errors.go index 5f73b4830..ca84c134f 100644 --- a/internal/entitlement/httpdriver/errors.go +++ b/internal/entitlement/httpdriver/errors.go @@ -17,7 +17,11 @@ func getErrorEncoder() httptransport.ErrorEncoder { return commonhttp.HandleErrorIfTypeMatches[*productcatalog.FeatureNotFoundError](ctx, http.StatusNotFound, err, w) || commonhttp.HandleErrorIfTypeMatches[*entitlement.NotFoundError](ctx, http.StatusNotFound, err, w) || commonhttp.HandleErrorIfTypeMatches[*models.GenericUserError](ctx, http.StatusBadRequest, err, w) || - commonhttp.HandleErrorIfTypeMatches[*entitlement.AlreadyExistsError](ctx, http.StatusConflict, err, w) || + commonhttp.HandleErrorIfTypeMatches[*entitlement.AlreadyExistsError]( + ctx, http.StatusConflict, err, w, + func(specificErr *entitlement.AlreadyExistsError) (string, string) { + return "conflictingEntityId", specificErr.EntitlementID + }) || commonhttp.HandleErrorIfTypeMatches[*entitlement.InvalidValueError](ctx, http.StatusBadRequest, err, w) || commonhttp.HandleErrorIfTypeMatches[*entitlement.InvalidFeatureError](ctx, http.StatusBadRequest, err, w) || commonhttp.HandleErrorIfTypeMatches[*entitlement.WrongTypeError](ctx, http.StatusBadRequest, err, w) diff --git a/pkg/framework/commonhttp/errors.go b/pkg/framework/commonhttp/errors.go index bc016f852..327f87b56 100644 --- a/pkg/framework/commonhttp/errors.go +++ b/pkg/framework/commonhttp/errors.go @@ -55,9 +55,15 @@ func ErrorEncoder(ctx context.Context, _ error, w http.ResponseWriter) bool { // HandleErrorIfTypeMatches checks if the error is of the given type and encodes it as an HTTP error. // Using the generic feature we can mandate that the error implements the error interface. This is a // must, as the errors.As would panic if the error does not implement the error interface. -func HandleErrorIfTypeMatches[T error](ctx context.Context, statusCode int, err error, w http.ResponseWriter) bool { +func HandleErrorIfTypeMatches[T error](ctx context.Context, statusCode int, err error, w http.ResponseWriter, extendedProblemFunc ...func(T) (string, string)) bool { if err, ok := errorsx.ErrorAs[T](err); ok { - NewHTTPError(statusCode, err).EncodeError(ctx, w) + extendedProblemFuncs := make([]ExtendProblemFunc, 0, len(extendedProblemFunc)) + for _, f := range extendedProblemFunc { + extendedProblemFuncs = append(extendedProblemFuncs, func() (string, string) { + return f(err) + }) + } + NewHTTPError(statusCode, err, extendedProblemFuncs...).EncodeError(ctx, w) return true }