From cbde43a74499f8a5f584b164f6e54722647e9f6e Mon Sep 17 00:00:00 2001 From: Pedro Costa <550684+pnmcosta@users.noreply.github.com> Date: Thu, 29 May 2025 08:16:55 +0100 Subject: [PATCH] clean up and initial OnNetworkDelete trigger --- internal/modules/networks/interface.go | 4 + internal/modules/networks/manager/events.go | 10 +++ internal/modules/networks/manager/manager.go | 90 ++++++------------- internal/modules/networks/networkevent.go | 14 +++ .../modules/networks/resources/manager.go | 7 +- .../networks/resources/manager/manager.go | 59 +++++++----- .../networks/resources/manager/repository.go | 6 +- 7 files changed, 96 insertions(+), 94 deletions(-) create mode 100644 internal/modules/networks/manager/events.go diff --git a/internal/modules/networks/interface.go b/internal/modules/networks/interface.go index f9cc69b..17c47c8 100644 --- a/internal/modules/networks/interface.go +++ b/internal/modules/networks/interface.go @@ -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] } diff --git a/internal/modules/networks/manager/events.go b/internal/modules/networks/manager/events.go new file mode 100644 index 0000000..a512f67 --- /dev/null +++ b/internal/modules/networks/manager/events.go @@ -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 +} diff --git a/internal/modules/networks/manager/manager.go b/internal/modules/networks/manager/manager.go index 5a30cb9..3554c98 100644 --- a/internal/modules/networks/manager/manager.go +++ b/internal/modules/networks/manager/manager.go @@ -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 }) } diff --git a/internal/modules/networks/networkevent.go b/internal/modules/networks/networkevent.go index 83c4a6a..55b31ae 100644 --- a/internal/modules/networks/networkevent.go +++ b/internal/modules/networks/networkevent.go @@ -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 +} diff --git a/internal/modules/networks/resources/manager.go b/internal/modules/networks/resources/manager.go index 8abe1aa..146b5e2 100644 --- a/internal/modules/networks/resources/manager.go +++ b/internal/modules/networks/resources/manager.go @@ -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 } diff --git a/internal/modules/networks/resources/manager/manager.go b/internal/modules/networks/resources/manager/manager.go index 1ffa6b9..f1e1a97 100644 --- a/internal/modules/networks/resources/manager/manager.go +++ b/internal/modules/networks/resources/manager/manager.go @@ -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 +} diff --git a/internal/modules/networks/resources/manager/repository.go b/internal/modules/networks/resources/manager/repository.go index befa8c8..68ada59 100644 --- a/internal/modules/networks/resources/manager/repository.go +++ b/internal/modules/networks/resources/manager/repository.go @@ -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) }