clean up and initial OnNetworkDelete trigger

This commit is contained in:
Pedro Costa
2025-05-29 08:16:55 +01:00
parent 5e2bc5659e
commit cbde43a744
7 changed files with 96 additions and 94 deletions
+4
View File
@@ -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
}
+26 -64
View File
@@ -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
})
}
+14
View File
@@ -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)
}