Skip to content

Commit 929c685

Browse files
authored
fix: grant delete (#3524)
1 parent 23a3504 commit 929c685

File tree

12 files changed

+78
-11
lines changed

12 files changed

+78
-11
lines changed

openmeter/credit/adapter/grant.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,14 @@ func (g *grantDBADapter) CreateGrant(ctx context.Context, grant grant.RepoCreate
6363
return &mapped, nil
6464
}
6565

66+
func (g *grantDBADapter) DeleteOwnerGrants(ctx context.Context, ownerID models.NamespacedID) error {
67+
command := g.db.Grant.Update().
68+
SetDeletedAt(clock.Now()).
69+
Where(db_grant.OwnerID(ownerID.ID), db_grant.Namespace(ownerID.Namespace))
70+
71+
return command.Exec(ctx)
72+
}
73+
6674
// translates to a delete
6775
func (g *grantDBADapter) VoidGrant(ctx context.Context, grantID models.NamespacedID, at time.Time) error {
6876
// TODO: transaction and locking

openmeter/credit/balance.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"time"
77

8+
"github.com/samber/lo"
89
"go.opentelemetry.io/otel/attribute"
910
"go.opentelemetry.io/otel/trace"
1011

@@ -226,7 +227,7 @@ func (m *connector) ResetUsageForOwner(ctx context.Context, ownerID models.Names
226227
// check if reset is possible (not before current period)
227228
periodStart, err := m.OwnerConnector.GetUsagePeriodStartAt(ctx, ownerID, clock.Now())
228229
if err != nil {
229-
if _, ok := err.(*grant.OwnerNotFoundError); ok {
230+
if _, ok := lo.ErrorsAs[*grant.OwnerNotFoundError](err); ok {
230231
return nil, err
231232
}
232233
return nil, fmt.Errorf("failed to get current usage period start for owner %s at %s: %w", ownerID.ID, at, err)

openmeter/credit/grant/owner_connector.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,10 @@ type OwnerNotFoundError struct {
5656
func (e OwnerNotFoundError) Error() string {
5757
return fmt.Sprintf("Owner %s not found in namespace %s, attempted to find as %s", e.Owner.ID, e.Owner.Namespace, e.AttemptedOwner)
5858
}
59+
60+
func NewOwnerNotFoundError(owner models.NamespacedID, attemptedOwner string) error {
61+
return models.NewGenericNotFoundError(OwnerNotFoundError{
62+
Owner: owner,
63+
AttemptedOwner: attemptedOwner,
64+
})
65+
}

openmeter/credit/grant/repo.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ type Repo interface {
7878
ListActiveGrantsBetween(ctx context.Context, owner models.NamespacedID, from, to time.Time) ([]Grant, error)
7979
GetGrant(ctx context.Context, grantID models.NamespacedID) (Grant, error)
8080

81+
// Sets deleted_at timestamp
82+
DeleteOwnerGrants(ctx context.Context, ownerID models.NamespacedID) error
83+
8184
entutils.TxCreator
8285
entutils.TxUser[Repo]
8386
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package hook
2+
3+
import (
4+
"context"
5+
6+
"github.com/openmeterio/openmeter/openmeter/credit/grant"
7+
"github.com/openmeterio/openmeter/openmeter/entitlement"
8+
meteredentitlement "github.com/openmeterio/openmeter/openmeter/entitlement/metered"
9+
"github.com/openmeterio/openmeter/pkg/models"
10+
)
11+
12+
type (
13+
EntitlementHook = models.ServiceHook[entitlement.Entitlement]
14+
NoopHook = models.NoopServiceHook[entitlement.Entitlement]
15+
)
16+
17+
type entitlementHook struct {
18+
NoopHook
19+
20+
grantRepo grant.Repo
21+
}
22+
23+
func NewEntitlementHook(
24+
grantRepo grant.Repo,
25+
) EntitlementHook {
26+
return &entitlementHook{
27+
grantRepo: grantRepo,
28+
}
29+
}
30+
31+
func (h *entitlementHook) PreDelete(ctx context.Context, ent *entitlement.Entitlement) error {
32+
if ent == nil {
33+
return nil
34+
}
35+
36+
meteredEnt, err := meteredentitlement.ParseFromGenericEntitlement(ent)
37+
if err != nil {
38+
return nil
39+
}
40+
41+
return h.grantRepo.DeleteOwnerGrants(ctx, models.NamespacedID{Namespace: meteredEnt.Namespace, ID: meteredEnt.ID})
42+
}

openmeter/entitlement/metered/entitlement_grant.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func (e *connector) CreateGrant(ctx context.Context, namespace string, customerI
8080
Metadata: inputGrant.Metadata,
8181
})
8282
if err != nil {
83-
if _, ok := err.(grant.OwnerNotFoundError); ok {
83+
if _, ok := lo.ErrorsAs[*grant.OwnerNotFoundError](err); ok {
8484
return EntitlementGrant{}, &entitlement.NotFoundError{EntitlementID: models.NamespacedID{Namespace: namespace, ID: ent.ID}}
8585
}
8686

openmeter/entitlement/metered/grant_owner_adapter.go

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,7 @@ func (e *entitlementGrantOwner) DescribeOwner(ctx context.Context, id models.Nam
5858
ent, err := e.entitlementRepo.GetEntitlement(ctx, id)
5959
if err != nil {
6060
if _, ok := lo.ErrorsAs[*entitlement.NotFoundError](err); ok {
61-
return def, &grant.OwnerNotFoundError{
62-
Owner: id,
63-
AttemptedOwner: "entitlement",
64-
}
61+
return def, grant.NewOwnerNotFoundError(id, "entitlement")
6562
}
6663

6764
return def, err
@@ -125,10 +122,7 @@ func (e *entitlementGrantOwner) GetStartOfMeasurement(ctx context.Context, owner
125122
owningEntitlement, err := e.entitlementRepo.GetEntitlement(ctx, owner)
126123
if err != nil {
127124
if _, ok := lo.ErrorsAs[*entitlement.NotFoundError](err); ok {
128-
return time.Time{}, &grant.OwnerNotFoundError{
129-
Owner: owner,
130-
AttemptedOwner: "entitlement",
131-
}
125+
return time.Time{}, grant.NewOwnerNotFoundError(owner, "entitlement")
132126
}
133127

134128
return time.Time{}, fmt.Errorf("failed to get entitlement: %w", err)

openmeter/entitlement/metered/reset.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66
"fmt"
77
"time"
88

9+
"github.com/samber/lo"
10+
911
"github.com/openmeterio/openmeter/openmeter/credit"
1012
"github.com/openmeterio/openmeter/openmeter/credit/grant"
1113
"github.com/openmeterio/openmeter/openmeter/entitlement"
@@ -46,7 +48,7 @@ func (e *connector) ResetEntitlementUsage(ctx context.Context, entitlementID mod
4648
PreserveOverage: defaultx.WithDefault(params.PreserveOverage, mEnt.PreserveOverageAtReset),
4749
})
4850
if err != nil {
49-
if _, ok := err.(*grant.OwnerNotFoundError); ok {
51+
if _, ok := lo.ErrorsAs[*grant.OwnerNotFoundError](err); ok {
5052
return nil, &entitlement.NotFoundError{EntitlementID: entitlementID}
5153
}
5254
return nil, err

openmeter/registry/builder/entitlement.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/openmeterio/openmeter/openmeter/credit"
1111
creditpgadapter "github.com/openmeterio/openmeter/openmeter/credit/adapter"
1212
"github.com/openmeterio/openmeter/openmeter/credit/balance"
13+
credithook "github.com/openmeterio/openmeter/openmeter/credit/hook"
1314
"github.com/openmeterio/openmeter/openmeter/ent/db"
1415
enttx "github.com/openmeterio/openmeter/openmeter/ent/tx"
1516
entitlementpgadapter "github.com/openmeterio/openmeter/openmeter/entitlement/adapter"
@@ -111,6 +112,7 @@ func GetEntitlementRegistry(opts EntitlementOptions) *registry.Entitlement {
111112

112113
entitlementConnector.RegisterHooks(
113114
entitlementsubscriptionhook.NewEntitlementSubscriptionHook(entitlementsubscriptionhook.EntitlementSubscriptionHookConfig{}),
115+
credithook.NewEntitlementHook(grantDBAdapter),
114116
)
115117

116118
return &registry.Entitlement{

openmeter/server/server_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,6 +1335,10 @@ func (n NoopGrantRepo) VoidGrant(ctx context.Context, grantID models.NamespacedI
13351335
return nil
13361336
}
13371337

1338+
func (n NoopGrantRepo) DeleteOwnerGrants(ctx context.Context, ownerID models.NamespacedID) error {
1339+
return nil
1340+
}
1341+
13381342
func (n NoopGrantRepo) ListGrants(ctx context.Context, params grant.ListParams) (pagination.Result[grant.Grant], error) {
13391343
return pagination.Result[grant.Grant]{}, nil
13401344
}

0 commit comments

Comments
 (0)