Skip to content

Commit 538e2e5

Browse files
committed
feat(subscription-addon-v3): implement get subscription addon v3 endpoint
1 parent 9e4d0ac commit 538e2e5

17 files changed

Lines changed: 269 additions & 49 deletions

File tree

api/spec/packages/aip/src/subscriptions/index.tsp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ import "./subscription.tsp";
22
import "./subscriptionaddon.tsp";
33
import "./operations.tsp";
44
import "./reference.tsp";
5+
import "./subscriptionaddon.tsp";

api/spec/packages/aip/src/subscriptions/operations.tsp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,4 +174,18 @@ interface SubscriptionAddonOperations {
174174
@query(#{ name: "sort" })
175175
sort?: Common.SortQuery,
176176
): Shared.PagePaginatedResponse<SubscriptionAddon> | Common.NotFound | Common.ErrorResponses;
177+
178+
/**
179+
* Get an add-on association for a subscription.
180+
*/
181+
@get
182+
@route("/{subscriptionAddonId}")
183+
@operationId("get-subscription-addon")
184+
@summary("Get add-on association for subscription")
185+
@extension(Shared.UnstableExtension, true)
186+
@extension(Shared.InternalExtension, true)
187+
getAddon(
188+
@path subscriptionId: Shared.ULID,
189+
@path subscriptionAddonId: Shared.ULID,
190+
): Shared.GetResponse<SubscriptionAddon> | Common.ErrorResponses | Common.NotFound;
177191
}

api/v3/api.gen.go

Lines changed: 69 additions & 22 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package subscriptionaddons
2+
3+
import (
4+
"context"
5+
"net/http"
6+
7+
apiv3 "github.com/openmeterio/openmeter/api/v3"
8+
subscriptionaddon "github.com/openmeterio/openmeter/openmeter/subscription/addon"
9+
"github.com/openmeterio/openmeter/pkg/framework/commonhttp"
10+
"github.com/openmeterio/openmeter/pkg/framework/transport/httptransport"
11+
"github.com/openmeterio/openmeter/pkg/models"
12+
)
13+
14+
type (
15+
GetSubscriptionAddonRequest = subscriptionaddon.GetSubscriptionAddonInput
16+
GetSubscriptionAddonParams struct {
17+
SubscriptionID string
18+
SubscriptionAddonID string
19+
}
20+
GetSubscriptionAddonResponse = apiv3.SubscriptionAddon
21+
GetSubscriptionAddonHandler httptransport.HandlerWithArgs[GetSubscriptionAddonRequest, GetSubscriptionAddonResponse, GetSubscriptionAddonParams]
22+
)
23+
24+
func (h *handler) GetSubscriptionAddons() GetSubscriptionAddonHandler {
25+
return httptransport.NewHandlerWithArgs(
26+
func(ctx context.Context, r *http.Request, params GetSubscriptionAddonParams) (GetSubscriptionAddonRequest, error) {
27+
ns, err := h.resolveNamespace(ctx)
28+
if err != nil {
29+
return GetSubscriptionAddonRequest{}, err
30+
}
31+
32+
return GetSubscriptionAddonRequest{
33+
NamespacedID: models.NamespacedID{
34+
Namespace: ns,
35+
ID: params.SubscriptionAddonID,
36+
},
37+
SubscriptionID: params.SubscriptionID,
38+
}, nil
39+
},
40+
func(ctx context.Context, request GetSubscriptionAddonRequest) (GetSubscriptionAddonResponse, error) {
41+
a, err := h.addonService.Get(ctx, request)
42+
if err != nil {
43+
return GetSubscriptionAddonResponse{}, err
44+
}
45+
46+
return toAPISubscriptionAddon(*a)
47+
},
48+
commonhttp.JSONResponseEncoderWithStatus[GetSubscriptionAddonResponse](http.StatusOK),
49+
httptransport.AppendOptions(
50+
h.options,
51+
httptransport.WithOperationName("get-subscription-addon"),
52+
)...,
53+
)
54+
}

api/v3/handlers/subscriptions/subscriptionaddons/handler.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,23 @@ import (
99

1010
type Handler interface {
1111
ListSubscriptionAddons() ListSubscriptionAddonsHandler
12+
GetSubscriptionAddons() GetSubscriptionAddonHandler
1213
}
1314

1415
type handler struct {
15-
resolveNamespace func(ctx context.Context) (string, error)
16-
subscriptionAddonService subscriptionaddon.Service
17-
options []httptransport.HandlerOption
16+
resolveNamespace func(ctx context.Context) (string, error)
17+
addonService subscriptionaddon.Service
18+
options []httptransport.HandlerOption
1819
}
1920

2021
func New(
2122
resolveNamespace func(ctx context.Context) (string, error),
22-
subscriptionAddonService subscriptionaddon.Service,
23+
addonService subscriptionaddon.Service,
2324
options ...httptransport.HandlerOption,
2425
) Handler {
2526
return &handler{
26-
resolveNamespace: resolveNamespace,
27-
subscriptionAddonService: subscriptionAddonService,
28-
options: options,
27+
resolveNamespace: resolveNamespace,
28+
addonService: addonService,
29+
options: options,
2930
}
3031
}

api/v3/handlers/subscriptions/subscriptionaddons/list.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ func (h *handler) ListSubscriptionAddons() ListSubscriptionAddonsHandler {
8585
}, nil
8686
},
8787
func(ctx context.Context, req ListSubscriptionAddonsRequest) (ListSubscriptionAddonsResponse, error) {
88-
res, err := h.subscriptionAddonService.List(ctx, req.SubscriptionID.Namespace, req.Input)
88+
res, err := h.addonService.List(ctx, req.SubscriptionID.Namespace, req.Input)
8989
if err != nil {
9090
return ListSubscriptionAddonsResponse{}, fmt.Errorf("failed to list subscription addons: %w", err)
9191
}

api/v3/openapi.yaml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2592,6 +2592,41 @@ paths:
25922592
$ref: '#/components/responses/NotFound'
25932593
tags:
25942594
- OpenMeter Subscriptions
2595+
/openmeter/subscriptions/{subscriptionId}/addons/{subscriptionAddonId}:
2596+
get:
2597+
operationId: get-subscription-addon
2598+
summary: Get add-on association for subscription
2599+
description: Get an add-on association for a subscription.
2600+
parameters:
2601+
- name: subscriptionId
2602+
in: path
2603+
required: true
2604+
schema:
2605+
$ref: '#/components/schemas/ULID'
2606+
- name: subscriptionAddonId
2607+
in: path
2608+
required: true
2609+
schema:
2610+
$ref: '#/components/schemas/ULID'
2611+
responses:
2612+
'200':
2613+
description: SubscriptionAddon response.
2614+
content:
2615+
application/json:
2616+
schema:
2617+
$ref: '#/components/schemas/SubscriptionAddon'
2618+
'400':
2619+
$ref: '#/components/responses/BadRequest'
2620+
'401':
2621+
$ref: '#/components/responses/Unauthorized'
2622+
'403':
2623+
$ref: '#/components/responses/Forbidden'
2624+
'404':
2625+
$ref: '#/components/responses/NotFound'
2626+
tags:
2627+
- OpenMeter Subscriptions
2628+
x-internal: true
2629+
x-unstable: true
25952630
/openmeter/subscriptions/{subscriptionId}/cancel:
25962631
post:
25972632
operationId: cancel-subscription

api/v3/server/routes.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,13 +109,21 @@ func (s *Server) ChangeSubscription(w http.ResponseWriter, r *http.Request, subs
109109
s.subscriptionsHandler.ChangeSubscription().With(subscriptionId).ServeHTTP(w, r)
110110
}
111111

112+
// Subscription Addons
112113
func (s *Server) ListSubscriptionAddons(w http.ResponseWriter, r *http.Request, subscriptionId api.ULID, params api.ListSubscriptionAddonsParams) {
113114
s.subscriptionAddonsHandler.ListSubscriptionAddons().With(subscriptionaddonshandler.ListSubscriptionAddonsParams{
114115
SubscriptionID: subscriptionId,
115116
Params: params,
116117
}).ServeHTTP(w, r)
117118
}
118119

120+
func (s *Server) GetSubscriptionAddon(w http.ResponseWriter, r *http.Request, subscriptionId api.ULID, subscriptionAddonId api.ULID) {
121+
s.subscriptionAddonsHandler.GetSubscriptionAddons().With(subscriptionaddonshandler.GetSubscriptionAddonParams{
122+
SubscriptionID: subscriptionId,
123+
SubscriptionAddonID: subscriptionAddonId,
124+
}).ServeHTTP(w, r)
125+
}
126+
119127
// Apps
120128

121129
func (s *Server) ListApps(w http.ResponseWriter, r *http.Request, params api.ListAppsParams) {

api/v3/server/server.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,10 @@ func (c *Config) Validate() error {
208208
errs = append(errs, errors.New("addon service is required"))
209209
}
210210

211+
if c.SubscriptionAddonService == nil {
212+
errs = append(errs, errors.New("subscription addon service is required"))
213+
}
214+
211215
return errors.Join(errs...)
212216
}
213217

openmeter/server/server_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1680,7 +1680,7 @@ func (n NoopSubscriptionAddonService) ChangeQuantity(ctx context.Context, subscr
16801680
return nil, nil
16811681
}
16821682

1683-
func (n NoopSubscriptionAddonService) Get(ctx context.Context, addonId models.NamespacedID) (*subscriptionaddon.SubscriptionAddon, error) {
1683+
func (n NoopSubscriptionAddonService) Get(ctx context.Context, params subscriptionaddon.GetSubscriptionAddonInput) (*subscriptionaddon.SubscriptionAddon, error) {
16841684
return nil, nil
16851685
}
16861686

0 commit comments

Comments
 (0)