diff --git a/internal/app/repos.go b/internal/app/repos.go index ae2110f..22d0876 100644 --- a/internal/app/repos.go +++ b/internal/app/repos.go @@ -38,6 +38,8 @@ type WireGuardManager interface { UpdateInterface(ctx context.Context, in *domain.Interface) (*domain.Interface, error) DeleteInterface(ctx context.Context, id domain.InterfaceIdentifier) error PreparePeer(ctx context.Context, id domain.InterfaceIdentifier) (*domain.Peer, error) + DeletePeer(ctx context.Context, id domain.PeerIdentifier) error + GetPeer(ctx context.Context, id domain.PeerIdentifier) (*domain.Peer, error) } type StatisticsCollector interface { diff --git a/internal/app/wireguard/repos.go b/internal/app/wireguard/repos.go index 7ba8f31..15a0b1e 100644 --- a/internal/app/wireguard/repos.go +++ b/internal/app/wireguard/repos.go @@ -19,6 +19,7 @@ type InterfaceAndPeerDatabaseRepo interface { FindUserPeers(ctx context.Context, id domain.UserIdentifier, search string) ([]domain.Peer, error) SavePeer(ctx context.Context, id domain.PeerIdentifier, updateFunc func(in *domain.Peer) (*domain.Peer, error)) error DeletePeer(ctx context.Context, id domain.PeerIdentifier) error + GetPeer(ctx context.Context, id domain.PeerIdentifier) (*domain.Peer, error) } type StatisticsDatabaseRepo interface { diff --git a/internal/app/wireguard/wireguard.go b/internal/app/wireguard/wireguard.go index 4bbf7fa..c8005ca 100644 --- a/internal/app/wireguard/wireguard.go +++ b/internal/app/wireguard/wireguard.go @@ -670,3 +670,31 @@ func (m Manager) PreparePeer(ctx context.Context, id domain.InterfaceIdentifier) return freshPeer, nil } + +func (m Manager) DeletePeer(ctx context.Context, id domain.PeerIdentifier) error { + peer, err := m.db.GetPeer(ctx, id) + if err != nil { + return fmt.Errorf("unable to find peer %s: %w", id, err) + } + + err = m.wg.DeletePeer(ctx, peer.InterfaceIdentifier, id) + if err != nil { + return fmt.Errorf("wireguard failed to delete peer %s: %w", id, err) + } + + err = m.db.DeletePeer(ctx, id) + if err != nil { + return fmt.Errorf("failed to delete peer %s: %w", id, err) + } + + return nil +} + +func (m Manager) GetPeer(ctx context.Context, id domain.PeerIdentifier) (*domain.Peer, error) { + peer, err := m.db.GetPeer(ctx, id) + if err != nil { + return nil, fmt.Errorf("unable to find peer %s: %w", id, err) + } + + return peer, nil +}