mirror of
https://github.com/netbirdio/management-refactor.git
synced 2026-05-22 17:12:59 -07:00
clean up and initial OnNetworkDelete trigger
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
|
||||
"management/internal/shared/db"
|
||||
"management/internal/shared/hook"
|
||||
)
|
||||
|
||||
type Manager interface {
|
||||
@@ -12,4 +13,7 @@ type Manager interface {
|
||||
CreateNetwork(ctx context.Context, tx db.Transaction, userID string, network *Network) (*Network, error)
|
||||
UpdateNetwork(ctx context.Context, tx db.Transaction, userID string, network *Network) (*Network, error)
|
||||
DeleteNetwork(ctx context.Context, tx db.Transaction, accountID, userID, networkID string) error
|
||||
|
||||
// events
|
||||
OnNetworkDelete() *hook.Hook[*NetworkEvent]
|
||||
}
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
package manager
|
||||
|
||||
import (
|
||||
"management/internal/modules/networks"
|
||||
"management/internal/shared/hook"
|
||||
)
|
||||
|
||||
func (m *managerImpl) OnNetworkDelete() *hook.Hook[*networks.NetworkEvent] {
|
||||
return m.onNetworkDelete
|
||||
}
|
||||
@@ -8,29 +8,23 @@ import (
|
||||
"github.com/rs/xid"
|
||||
|
||||
"management/internal/modules/networks"
|
||||
"management/internal/modules/networks/resources"
|
||||
"management/internal/modules/networks/routers"
|
||||
"management/internal/shared/db"
|
||||
"management/internal/shared/errors"
|
||||
"management/internal/shared/hook"
|
||||
"management/internal/shared/permissions"
|
||||
"management/internal/shared/permissions/modules"
|
||||
"management/internal/shared/permissions/operations"
|
||||
)
|
||||
|
||||
type managerImpl struct {
|
||||
repo Repository
|
||||
permissionsManager permissions.Manager
|
||||
resourcesManager resources.Manager
|
||||
routersManager routers.Manager
|
||||
repo Repository
|
||||
|
||||
onNetworkDelete *hook.Hook[*networks.NetworkEvent]
|
||||
}
|
||||
|
||||
func NewManager(store *db.Store, router *mux.Router, permissionsManager permissions.Manager, resourceManager resources.Manager, routersManager routers.Manager) networks.Manager {
|
||||
func NewManager(store *db.Store, router *mux.Router, permissionsManager permissions.Manager) networks.Manager {
|
||||
repo := newRepository(store)
|
||||
m := &managerImpl{
|
||||
repo: repo,
|
||||
permissionsManager: permissionsManager,
|
||||
resourcesManager: resourceManager,
|
||||
routersManager: routersManager,
|
||||
repo: repo,
|
||||
|
||||
onNetworkDelete: &hook.Hook[*networks.NetworkEvent]{},
|
||||
}
|
||||
api := newHandler(m, permissionsManager)
|
||||
api.RegisterEndpoints(router)
|
||||
@@ -38,29 +32,13 @@ func NewManager(store *db.Store, router *mux.Router, permissionsManager permissi
|
||||
}
|
||||
|
||||
func (m *managerImpl) GetAllNetworks(ctx context.Context, tx db.Transaction, strength db.LockingStrength, accountID, userID string) ([]*networks.Network, error) {
|
||||
ok, err := m.permissionsManager.ValidateUserPermissions(ctx, accountID, userID, modules.Networks, operations.Read)
|
||||
if err != nil {
|
||||
return nil, errors.NewPermissionValidationError(err)
|
||||
}
|
||||
if !ok {
|
||||
return nil, errors.NewPermissionDeniedError()
|
||||
}
|
||||
|
||||
return m.repo.GetAccountNetworks(tx, strength, accountID)
|
||||
}
|
||||
|
||||
func (m *managerImpl) CreateNetwork(ctx context.Context, tx db.Transaction, userID string, network *networks.Network) (*networks.Network, error) {
|
||||
ok, err := m.permissionsManager.ValidateUserPermissions(ctx, network.AccountID, userID, modules.Networks, operations.Write)
|
||||
if err != nil {
|
||||
return nil, errors.NewPermissionValidationError(err)
|
||||
}
|
||||
if !ok {
|
||||
return nil, errors.NewPermissionDeniedError()
|
||||
}
|
||||
|
||||
network.ID = xid.New().String()
|
||||
|
||||
err = m.repo.CreateNetwork(tx, network)
|
||||
err := m.repo.CreateNetwork(tx, network)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to save network: %w", err)
|
||||
}
|
||||
@@ -71,27 +49,11 @@ func (m *managerImpl) CreateNetwork(ctx context.Context, tx db.Transaction, user
|
||||
}
|
||||
|
||||
func (m *managerImpl) GetNetwork(ctx context.Context, tx db.Transaction, strength db.LockingStrength, accountID, userID, networkID string) (*networks.Network, error) {
|
||||
ok, err := m.permissionsManager.ValidateUserPermissions(ctx, accountID, userID, modules.Networks, operations.Read)
|
||||
if err != nil {
|
||||
return nil, errors.NewPermissionValidationError(err)
|
||||
}
|
||||
if !ok {
|
||||
return nil, errors.NewPermissionDeniedError()
|
||||
}
|
||||
|
||||
return m.repo.GetNetworkByID(tx, strength, accountID, networkID)
|
||||
}
|
||||
|
||||
func (m *managerImpl) UpdateNetwork(ctx context.Context, tx db.Transaction, userID string, network *networks.Network) (*networks.Network, error) {
|
||||
ok, err := m.permissionsManager.ValidateUserPermissions(ctx, network.AccountID, userID, modules.Networks, operations.Write)
|
||||
if err != nil {
|
||||
return nil, errors.NewPermissionValidationError(err)
|
||||
}
|
||||
if !ok {
|
||||
return nil, errors.NewPermissionDeniedError()
|
||||
}
|
||||
|
||||
_, err = m.repo.GetNetworkByID(tx, db.LockingStrengthUpdate, network.AccountID, network.ID)
|
||||
_, err := m.repo.GetNetworkByID(tx, db.LockingStrengthUpdate, network.AccountID, network.ID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get network: %w", err)
|
||||
}
|
||||
@@ -102,27 +64,27 @@ func (m *managerImpl) UpdateNetwork(ctx context.Context, tx db.Transaction, user
|
||||
}
|
||||
|
||||
func (m *managerImpl) DeleteNetwork(ctx context.Context, tx db.Transaction, accountID, userID, networkID string) error {
|
||||
ok, err := m.permissionsManager.ValidateUserPermissions(ctx, accountID, userID, modules.Networks, operations.Write)
|
||||
if err != nil {
|
||||
return errors.NewPermissionValidationError(err)
|
||||
}
|
||||
if !ok {
|
||||
return errors.NewPermissionDeniedError()
|
||||
}
|
||||
|
||||
return db.WithTx(m.repo.Store(), tx, func(tx db.Transaction) error {
|
||||
network := &networks.Network{ID: networkID}
|
||||
|
||||
sendEvent(tx, "network_deleted")
|
||||
|
||||
if err := m.repo.DeleteNetwork(tx, &networks.Network{ID: networkID}); err != nil {
|
||||
return fmt.Errorf("failed to delete network: %w", err)
|
||||
ev := &networks.NetworkEvent{
|
||||
Context: ctx,
|
||||
Tx: tx,
|
||||
Network: network,
|
||||
}
|
||||
|
||||
tx.AddEvent(func() {
|
||||
addActivityEvent("Network deleted")
|
||||
// noop
|
||||
err := m.OnNetworkDelete().Trigger(ev, func(ne *networks.NetworkEvent) error {
|
||||
if err := m.repo.DeleteNetwork(ne.Tx, ne.Network); err != nil {
|
||||
return fmt.Errorf("failed to delete network: %w", err)
|
||||
}
|
||||
|
||||
tx.AddEvent(func() {
|
||||
// addActivityEvent("Network deleted")
|
||||
// noop
|
||||
})
|
||||
return nil
|
||||
})
|
||||
|
||||
return nil
|
||||
return err
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1 +1,15 @@
|
||||
package networks
|
||||
|
||||
import (
|
||||
"context"
|
||||
"management/internal/shared/db"
|
||||
"management/internal/shared/hook"
|
||||
)
|
||||
|
||||
type NetworkEvent struct {
|
||||
hook.Event
|
||||
|
||||
Context context.Context
|
||||
Tx db.Transaction
|
||||
Network *Network
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package resources
|
||||
import (
|
||||
"context"
|
||||
|
||||
"management/internal/modules/networks"
|
||||
"management/internal/shared/db"
|
||||
)
|
||||
|
||||
@@ -10,11 +11,11 @@ type Manager interface {
|
||||
// Create
|
||||
|
||||
// Read
|
||||
GetNetworkResourcesByNetID(ctx context.Context, tx db.Transaction, lockingStrength db.LockingStrength, accountID, userID, networkID string) ([]*NetworkResource, error)
|
||||
GetNetworkResourcesByNetID(ctx context.Context, tx db.Transaction, lockingStrength db.LockingStrength, network *networks.Network) ([]*NetworkResource, error)
|
||||
|
||||
// Update
|
||||
|
||||
// Delete
|
||||
DeleteResource(ctx context.Context, tx db.Transaction, accountID, userID, networkID, resourceID string) error
|
||||
DeleteResourcesInNetwork(ctx context.Context, tx db.Transaction, accountID, userID, networkID string) error
|
||||
DeleteResource(ctx context.Context, tx db.Transaction, resource *NetworkResource) error
|
||||
DeleteResourcesInNetwork(ctx context.Context, tx db.Transaction, network *networks.Network) error
|
||||
}
|
||||
|
||||
@@ -2,53 +2,52 @@ package manager
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
|
||||
"management/internal/modules/networks"
|
||||
"management/internal/modules/networks/resources"
|
||||
"management/internal/modules/networks/routers"
|
||||
"management/internal/shared/db"
|
||||
"management/internal/shared/errors"
|
||||
"management/internal/shared/permissions"
|
||||
"management/internal/shared/permissions/modules"
|
||||
"management/internal/shared/permissions/operations"
|
||||
)
|
||||
|
||||
type managerImpl struct {
|
||||
repo Repository
|
||||
permissionsManager permissions.Manager
|
||||
resourcesManager resources.Manager
|
||||
routersManager routers.Manager
|
||||
repo Repository
|
||||
networkManager networks.Manager
|
||||
}
|
||||
|
||||
func NewManager(store *db.Store, router *mux.Router, permissionsManager permissions.Manager, resourceManager resources.Manager, routersManager routers.Manager) resources.Manager {
|
||||
func NewManager(store *db.Store, router *mux.Router, networkManager networks.Manager) resources.Manager {
|
||||
repo := newRepository(store)
|
||||
m := &managerImpl{
|
||||
repo: repo,
|
||||
permissionsManager: permissionsManager,
|
||||
resourcesManager: resourceManager,
|
||||
routersManager: routersManager,
|
||||
repo: repo,
|
||||
networkManager: networkManager,
|
||||
}
|
||||
|
||||
networkManager.OnNetworkDelete().BindFunc(func(e *networks.NetworkEvent) error {
|
||||
if err := m.DeleteResourcesInNetwork(e.Context, e.Tx, e.Network); err != nil {
|
||||
return fmt.Errorf("failed to delete resources in network: %w", err)
|
||||
}
|
||||
|
||||
return e.Next()
|
||||
})
|
||||
|
||||
// api := newHandler(m, permissionsManager)
|
||||
// api.RegisterEndpoints(router)
|
||||
return m
|
||||
}
|
||||
|
||||
func (m *managerImpl) DeleteResourcesInNetwork(ctx context.Context, tx db.Transaction, accountID, userID, networkID string) error {
|
||||
ok, err := m.permissionsManager.ValidateUserPermissions(ctx, accountID, userID, modules.Networks, operations.Read)
|
||||
if err != nil {
|
||||
return errors.NewPermissionValidationError(err)
|
||||
}
|
||||
if !ok {
|
||||
return errors.NewPermissionDeniedError()
|
||||
}
|
||||
func (m *managerImpl) GetNetworkResourcesByNetID(ctx context.Context, tx db.Transaction, lockingStrength db.LockingStrength, network *networks.Network) ([]*resources.NetworkResource, error) {
|
||||
return m.repo.GetResourcesByNetworkID(tx, lockingStrength, network.ID)
|
||||
}
|
||||
|
||||
resources, err := m.repo.GetResourcesByNetworkID(tx, db.LockingStrengthUpdate, networkID)
|
||||
func (m *managerImpl) DeleteResourcesInNetwork(ctx context.Context, tx db.Transaction, network *networks.Network) error {
|
||||
resources, err := m.GetNetworkResourcesByNetID(ctx, tx, db.LockingStrengthUpdate, network)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, resource := range resources {
|
||||
err = m.repo.DeleteResource(tx, resource.ID)
|
||||
err = m.DeleteResource(ctx, tx, resource)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -56,3 +55,15 @@ func (m *managerImpl) DeleteResourcesInNetwork(ctx context.Context, tx db.Transa
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *managerImpl) DeleteResource(ctx context.Context, tx db.Transaction, resource *resources.NetworkResource) error {
|
||||
if err := m.repo.DeleteResource(tx, resource); err != nil {
|
||||
return fmt.Errorf("failed to delete network: %w", err)
|
||||
}
|
||||
|
||||
tx.AddEvent(func() {
|
||||
// addActivityEvent("resource deleted")
|
||||
// noop
|
||||
})
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
type Repository interface {
|
||||
Store() *db.Store
|
||||
GetResourcesByNetworkID(tx db.Transaction, strength db.LockingStrength, networkID string) ([]*resources.NetworkResource, error)
|
||||
DeleteResource(tx db.Transaction, resourceID string) error
|
||||
DeleteResource(tx db.Transaction, resource *resources.NetworkResource) error
|
||||
}
|
||||
|
||||
type repository struct {
|
||||
@@ -32,6 +32,6 @@ func (r *repository) GetResourcesByNetworkID(tx db.Transaction, strength db.Lock
|
||||
return resources, nil
|
||||
}
|
||||
|
||||
func (r *repository) DeleteResource(tx db.Transaction, resourceID string) error {
|
||||
return r.store.Delete(tx, &resources.NetworkResource{ID: resourceID})
|
||||
func (r *repository) DeleteResource(tx db.Transaction, resource *resources.NetworkResource) error {
|
||||
return r.store.Delete(tx, resource)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user