feat: add callback support for tenant and tenant member updates (#3201)

* feat: add callback support for tenant and tenant member updates

* add callbacks into tenant_invite.go
This commit is contained in:
abelanger5
2026-03-07 17:31:44 -05:00
committed by GitHub
parent 56a5f26bde
commit 46c4297b32
2 changed files with 192 additions and 15 deletions
+125 -9
View File
@@ -86,6 +86,12 @@ type GetQueueMetricsResponse struct {
type TenantRepository interface {
RegisterCreateCallback(callback UnscopedCallback[*sqlcv1.Tenant])
RegisterUpdateCallback(callback UnscopedCallback[*sqlcv1.Tenant])
RegisterDeleteCallback(callback UnscopedCallback[*sqlcv1.Tenant])
RegisterCreateMemberCallback(callback UnscopedCallback[*sqlcv1.PopulateTenantMembersRow])
RegisterUpdateMemberCallback(callback UnscopedCallback[*sqlcv1.PopulateTenantMembersRow])
RegisterDeleteMemberCallback(callback UnscopedCallback[*sqlcv1.PopulateTenantMembersRow])
// CreateTenant creates a new tenant.
CreateTenant(ctx context.Context, opts *CreateTenantOpts) (*sqlcv1.Tenant, error)
@@ -181,6 +187,12 @@ type tenantRepository struct {
cache cache.Cacheable
defaultTenantVersion sqlcv1.TenantMajorEngineVersion
createCallbacks []UnscopedCallback[*sqlcv1.Tenant]
updateCallbacks []UnscopedCallback[*sqlcv1.Tenant]
deleteCallbacks []UnscopedCallback[*sqlcv1.Tenant]
createMemberCallbacks []UnscopedCallback[*sqlcv1.PopulateTenantMembersRow]
updateMemberCallbacks []UnscopedCallback[*sqlcv1.PopulateTenantMembersRow]
deleteMemberCallbacks []UnscopedCallback[*sqlcv1.PopulateTenantMembersRow]
}
func newTenantRepository(shared *sharedRepository, cacheDuration time.Duration) TenantRepository {
@@ -199,6 +211,46 @@ func (r *tenantRepository) RegisterCreateCallback(callback UnscopedCallback[*sql
r.createCallbacks = append(r.createCallbacks, callback)
}
func (r *tenantRepository) RegisterUpdateCallback(callback UnscopedCallback[*sqlcv1.Tenant]) {
if r.updateCallbacks == nil {
r.updateCallbacks = make([]UnscopedCallback[*sqlcv1.Tenant], 0)
}
r.updateCallbacks = append(r.updateCallbacks, callback)
}
func (r *tenantRepository) RegisterDeleteCallback(callback UnscopedCallback[*sqlcv1.Tenant]) {
if r.deleteCallbacks == nil {
r.deleteCallbacks = make([]UnscopedCallback[*sqlcv1.Tenant], 0)
}
r.deleteCallbacks = append(r.deleteCallbacks, callback)
}
func (r *tenantRepository) RegisterCreateMemberCallback(callback UnscopedCallback[*sqlcv1.PopulateTenantMembersRow]) {
if r.createMemberCallbacks == nil {
r.createMemberCallbacks = make([]UnscopedCallback[*sqlcv1.PopulateTenantMembersRow], 0)
}
r.createMemberCallbacks = append(r.createMemberCallbacks, callback)
}
func (r *tenantRepository) RegisterUpdateMemberCallback(callback UnscopedCallback[*sqlcv1.PopulateTenantMembersRow]) {
if r.updateMemberCallbacks == nil {
r.updateMemberCallbacks = make([]UnscopedCallback[*sqlcv1.PopulateTenantMembersRow], 0)
}
r.updateMemberCallbacks = append(r.updateMemberCallbacks, callback)
}
func (r *tenantRepository) RegisterDeleteMemberCallback(callback UnscopedCallback[*sqlcv1.PopulateTenantMembersRow]) {
if r.deleteMemberCallbacks == nil {
r.deleteMemberCallbacks = make([]UnscopedCallback[*sqlcv1.PopulateTenantMembersRow], 0)
}
r.deleteMemberCallbacks = append(r.deleteMemberCallbacks, callback)
}
func (r *tenantRepository) CreateTenant(ctx context.Context, opts *CreateTenantOpts) (*sqlcv1.Tenant, error) {
if err := r.v.Validate(opts); err != nil {
return nil, err
@@ -310,11 +362,21 @@ func (r *tenantRepository) UpdateTenant(ctx context.Context, id uuid.UUID, opts
params.Version = *opts.Version
}
return r.queries.UpdateTenant(
updated, err := r.queries.UpdateTenant(
ctx,
r.pool,
params,
)
if err != nil {
return nil, err
}
for _, cb := range r.updateCallbacks {
cb.Do(r.l, updated)
}
return updated, nil
}
func (r *tenantRepository) GetTenantByID(ctx context.Context, id uuid.UUID) (*sqlcv1.Tenant, error) {
@@ -350,7 +412,17 @@ func (r *tenantRepository) CreateTenantMember(ctx context.Context, tenantId uuid
return nil, err
}
return r.populateSingleTenantMember(ctx, createdMember.ID)
populated, err := r.populateSingleTenantMember(ctx, createdMember.ID)
if err != nil {
return nil, err
}
for _, cb := range r.createMemberCallbacks {
cb.Do(r.l, populated)
}
return populated, nil
}
func (r *tenantRepository) GetTenantMemberByID(ctx context.Context, memberId uuid.UUID) (*sqlcv1.PopulateTenantMembersRow, error) {
@@ -447,7 +519,17 @@ func (r *tenantRepository) UpdateTenantMember(ctx context.Context, memberId uuid
return nil, err
}
return r.populateSingleTenantMember(ctx, updatedMember.ID)
populated, err := r.populateSingleTenantMember(ctx, updatedMember.ID)
if err != nil {
return nil, err
}
for _, cb := range r.updateMemberCallbacks {
cb.Do(r.l, populated)
}
return populated, nil
}
func (r *sharedRepository) populateSingleTenantMember(ctx context.Context, ids uuid.UUID) (*sqlcv1.PopulateTenantMembersRow, error) {
@@ -473,11 +555,26 @@ func (r *sharedRepository) populateTenantMembers(ctx context.Context, ids []uuid
}
func (r *tenantRepository) DeleteTenantMember(ctx context.Context, memberId uuid.UUID) error {
return r.queries.DeleteTenantMember(
ctx,
r.pool,
memberId,
)
var populated *sqlcv1.PopulateTenantMembersRow
if len(r.deleteMemberCallbacks) > 0 {
var err error
populated, err = r.populateSingleTenantMember(ctx, memberId)
if err != nil {
return err
}
}
if err := r.queries.DeleteTenantMember(ctx, r.pool, memberId); err != nil {
return err
}
for _, cb := range r.deleteMemberCallbacks {
cb.Do(r.l, populated)
}
return nil
}
func (r *tenantRepository) GetQueueMetrics(ctx context.Context, tenantId uuid.UUID, opts *GetQueueMetricsOpts) (*GetQueueMetricsResponse, error) {
@@ -789,7 +886,26 @@ func (r *tenantRepository) RebalanceInactiveSchedulerPartitions(ctx context.Cont
}
func (r *tenantRepository) DeleteTenant(ctx context.Context, id uuid.UUID) error {
return r.queries.DeleteTenant(ctx, r.pool, id)
var tenant *sqlcv1.Tenant
if len(r.deleteCallbacks) > 0 {
var err error
tenant, err = r.queries.GetTenantByID(ctx, r.pool, id)
if err != nil {
return err
}
}
if err := r.queries.DeleteTenant(ctx, r.pool, id); err != nil {
return err
}
for _, cb := range r.deleteCallbacks {
cb.Do(r.l, tenant)
}
return nil
}
func (r *tenantRepository) GetTenantUsageData(ctx context.Context, tenantId uuid.UUID) (*sqlcv1.GetTenantUsageDataRow, error) {
+67 -6
View File
@@ -48,6 +48,10 @@ type ListTenantInvitesOpts struct {
}
type TenantInviteRepository interface {
RegisterCreateCallback(callback UnscopedCallback[*sqlcv1.TenantInviteLink])
RegisterUpdateCallback(callback UnscopedCallback[*sqlcv1.TenantInviteLink])
RegisterDeleteCallback(callback UnscopedCallback[*sqlcv1.TenantInviteLink])
// CreateTenantInvite creates a new tenant invite with the given options
CreateTenantInvite(ctx context.Context, tenantId uuid.UUID, opts *CreateTenantInviteOpts) (*sqlcv1.TenantInviteLink, error)
@@ -70,6 +74,10 @@ type TenantInviteRepository interface {
type tenantInviteRepository struct {
*sharedRepository
createCallbacks []UnscopedCallback[*sqlcv1.TenantInviteLink]
updateCallbacks []UnscopedCallback[*sqlcv1.TenantInviteLink]
deleteCallbacks []UnscopedCallback[*sqlcv1.TenantInviteLink]
}
func newTenantInviteRepository(shared *sharedRepository) TenantInviteRepository {
@@ -78,6 +86,30 @@ func newTenantInviteRepository(shared *sharedRepository) TenantInviteRepository
}
}
func (r *tenantInviteRepository) RegisterCreateCallback(callback UnscopedCallback[*sqlcv1.TenantInviteLink]) {
if r.createCallbacks == nil {
r.createCallbacks = make([]UnscopedCallback[*sqlcv1.TenantInviteLink], 0)
}
r.createCallbacks = append(r.createCallbacks, callback)
}
func (r *tenantInviteRepository) RegisterUpdateCallback(callback UnscopedCallback[*sqlcv1.TenantInviteLink]) {
if r.updateCallbacks == nil {
r.updateCallbacks = make([]UnscopedCallback[*sqlcv1.TenantInviteLink], 0)
}
r.updateCallbacks = append(r.updateCallbacks, callback)
}
func (r *tenantInviteRepository) RegisterDeleteCallback(callback UnscopedCallback[*sqlcv1.TenantInviteLink]) {
if r.deleteCallbacks == nil {
r.deleteCallbacks = make([]UnscopedCallback[*sqlcv1.TenantInviteLink], 0)
}
r.deleteCallbacks = append(r.deleteCallbacks, callback)
}
func (r *tenantInviteRepository) CreateTenantInvite(ctx context.Context, tenantId uuid.UUID, opts *CreateTenantInviteOpts) (*sqlcv1.TenantInviteLink, error) {
if err := r.v.Validate(opts); err != nil {
return nil, err
@@ -142,6 +174,10 @@ func (r *tenantInviteRepository) CreateTenantInvite(ctx context.Context, tenantI
return nil, err
}
for _, cb := range r.createCallbacks {
cb.Do(r.l, invite)
}
return invite, nil
}
@@ -214,17 +250,42 @@ func (r *tenantInviteRepository) UpdateTenantInvite(ctx context.Context, id uuid
}
}
return r.queries.UpdateTenantInvite(
updated, err := r.queries.UpdateTenantInvite(
ctx,
r.pool,
params,
)
if err != nil {
return nil, err
}
for _, cb := range r.updateCallbacks {
cb.Do(r.l, updated)
}
return updated, nil
}
func (r *tenantInviteRepository) DeleteTenantInvite(ctx context.Context, id uuid.UUID) error {
return r.queries.DeleteTenantInvite(
ctx,
r.pool,
id,
)
var invite *sqlcv1.TenantInviteLink
if len(r.deleteCallbacks) > 0 {
var err error
invite, err = r.queries.GetInviteById(ctx, r.pool, id)
if err != nil {
return err
}
}
if err := r.queries.DeleteTenantInvite(ctx, r.pool, id); err != nil {
return err
}
for _, cb := range r.deleteCallbacks {
cb.Do(r.l, invite)
}
return nil
}