chore: use interfaces for all other services

This commit is contained in:
Christoph Haas
2025-03-23 23:09:47 +01:00
parent 02ed7b19df
commit 7d0da4e7ad
40 changed files with 1337 additions and 406 deletions

View File

@@ -0,0 +1,91 @@
package backend
import (
"context"
"io"
"github.com/h44z/wg-portal/internal/config"
"github.com/h44z/wg-portal/internal/domain"
)
// region dependencies
type InterfaceServiceInterfaceManager interface {
GetAllInterfacesAndPeers(ctx context.Context) ([]domain.Interface, [][]domain.Peer, error)
GetInterfaceAndPeers(ctx context.Context, id domain.InterfaceIdentifier) (*domain.Interface, []domain.Peer, error)
CreateInterface(ctx context.Context, in *domain.Interface) (*domain.Interface, error)
UpdateInterface(ctx context.Context, in *domain.Interface) (*domain.Interface, []domain.Peer, error)
DeleteInterface(ctx context.Context, id domain.InterfaceIdentifier) error
PrepareInterface(ctx context.Context) (*domain.Interface, error)
ApplyPeerDefaults(ctx context.Context, in *domain.Interface) error
}
type InterfaceServiceConfigFileManager interface {
PersistInterfaceConfig(ctx context.Context, id domain.InterfaceIdentifier) error
GetInterfaceConfig(ctx context.Context, id domain.InterfaceIdentifier) (io.Reader, error)
}
// endregion dependencies
type InterfaceService struct {
cfg *config.Config
interfaces InterfaceServiceInterfaceManager
configFile InterfaceServiceConfigFileManager
}
func NewInterfaceService(
cfg *config.Config,
interfaces InterfaceServiceInterfaceManager,
configFile InterfaceServiceConfigFileManager,
) *InterfaceService {
return &InterfaceService{
cfg: cfg,
interfaces: interfaces,
configFile: configFile,
}
}
func (i InterfaceService) GetInterfaceAndPeers(ctx context.Context, id domain.InterfaceIdentifier) (
*domain.Interface,
[]domain.Peer,
error,
) {
return i.interfaces.GetInterfaceAndPeers(ctx, id)
}
func (i InterfaceService) PrepareInterface(ctx context.Context) (*domain.Interface, error) {
return i.interfaces.PrepareInterface(ctx)
}
func (i InterfaceService) CreateInterface(ctx context.Context, in *domain.Interface) (*domain.Interface, error) {
return i.interfaces.CreateInterface(ctx, in)
}
func (i InterfaceService) UpdateInterface(ctx context.Context, in *domain.Interface) (
*domain.Interface,
[]domain.Peer,
error,
) {
return i.interfaces.UpdateInterface(ctx, in)
}
func (i InterfaceService) DeleteInterface(ctx context.Context, id domain.InterfaceIdentifier) error {
return i.interfaces.DeleteInterface(ctx, id)
}
func (i InterfaceService) GetAllInterfacesAndPeers(ctx context.Context) ([]domain.Interface, [][]domain.Peer, error) {
return i.interfaces.GetAllInterfacesAndPeers(ctx)
}
func (i InterfaceService) GetInterfaceConfig(ctx context.Context, id domain.InterfaceIdentifier) (io.Reader, error) {
return i.configFile.GetInterfaceConfig(ctx, id)
}
func (i InterfaceService) PersistInterfaceConfig(ctx context.Context, id domain.InterfaceIdentifier) error {
return i.configFile.PersistInterfaceConfig(ctx, id)
}
func (i InterfaceService) ApplyPeerDefaults(ctx context.Context, in *domain.Interface) error {
return i.interfaces.ApplyPeerDefaults(ctx, in)
}

View File

@@ -0,0 +1,112 @@
package backend
import (
"context"
"io"
"github.com/h44z/wg-portal/internal/config"
"github.com/h44z/wg-portal/internal/domain"
)
// region dependencies
type PeerServicePeerManager interface {
GetPeer(ctx context.Context, id domain.PeerIdentifier) (*domain.Peer, error)
GetUserPeers(ctx context.Context, id domain.UserIdentifier) ([]domain.Peer, error)
GetInterfaceAndPeers(ctx context.Context, id domain.InterfaceIdentifier) (*domain.Interface, []domain.Peer, error)
PreparePeer(ctx context.Context, id domain.InterfaceIdentifier) (*domain.Peer, error)
CreatePeer(ctx context.Context, peer *domain.Peer) (*domain.Peer, error)
UpdatePeer(ctx context.Context, peer *domain.Peer) (*domain.Peer, error)
DeletePeer(ctx context.Context, id domain.PeerIdentifier) error
CreateMultiplePeers(
ctx context.Context,
interfaceId domain.InterfaceIdentifier,
r *domain.PeerCreationRequest,
) ([]domain.Peer, error)
GetPeerStats(ctx context.Context, id domain.InterfaceIdentifier) ([]domain.PeerStatus, error)
}
type PeerServiceConfigFileManager interface {
GetPeerConfig(ctx context.Context, id domain.PeerIdentifier) (io.Reader, error)
GetPeerConfigQrCode(ctx context.Context, id domain.PeerIdentifier) (io.Reader, error)
}
type PeerServiceMailManager interface {
SendPeerEmail(ctx context.Context, linkOnly bool, peers ...domain.PeerIdentifier) error
}
// endregion dependencies
type PeerService struct {
cfg *config.Config
peers PeerServicePeerManager
configFile PeerServiceConfigFileManager
mailer PeerServiceMailManager
}
func NewPeerService(
cfg *config.Config,
peers PeerServicePeerManager,
configFile PeerServiceConfigFileManager,
mailer PeerServiceMailManager,
) *PeerService {
return &PeerService{
cfg: cfg,
peers: peers,
configFile: configFile,
mailer: mailer,
}
}
func (p PeerService) GetInterfaceAndPeers(ctx context.Context, id domain.InterfaceIdentifier) (
*domain.Interface,
[]domain.Peer,
error,
) {
return p.peers.GetInterfaceAndPeers(ctx, id)
}
func (p PeerService) PreparePeer(ctx context.Context, id domain.InterfaceIdentifier) (*domain.Peer, error) {
return p.peers.PreparePeer(ctx, id)
}
func (p PeerService) GetPeer(ctx context.Context, id domain.PeerIdentifier) (*domain.Peer, error) {
return p.peers.GetPeer(ctx, id)
}
func (p PeerService) CreatePeer(ctx context.Context, peer *domain.Peer) (*domain.Peer, error) {
return p.peers.CreatePeer(ctx, peer)
}
func (p PeerService) CreateMultiplePeers(
ctx context.Context,
interfaceId domain.InterfaceIdentifier,
r *domain.PeerCreationRequest,
) ([]domain.Peer, error) {
return p.peers.CreateMultiplePeers(ctx, interfaceId, r)
}
func (p PeerService) UpdatePeer(ctx context.Context, peer *domain.Peer) (*domain.Peer, error) {
return p.peers.UpdatePeer(ctx, peer)
}
func (p PeerService) DeletePeer(ctx context.Context, id domain.PeerIdentifier) error {
return p.peers.DeletePeer(ctx, id)
}
func (p PeerService) GetPeerConfig(ctx context.Context, id domain.PeerIdentifier) (io.Reader, error) {
return p.configFile.GetPeerConfig(ctx, id)
}
func (p PeerService) GetPeerConfigQrCode(ctx context.Context, id domain.PeerIdentifier) (io.Reader, error) {
return p.configFile.GetPeerConfigQrCode(ctx, id)
}
func (p PeerService) SendPeerEmail(ctx context.Context, linkOnly bool, peers ...domain.PeerIdentifier) error {
return p.mailer.SendPeerEmail(ctx, linkOnly, peers...)
}
func (p PeerService) GetPeerStats(ctx context.Context, id domain.InterfaceIdentifier) ([]domain.PeerStatus, error) {
return p.peers.GetPeerStats(ctx, id)
}

View File

@@ -0,0 +1,83 @@
package backend
import (
"context"
"github.com/h44z/wg-portal/internal/config"
"github.com/h44z/wg-portal/internal/domain"
)
// region dependencies
type UserServiceUserManager interface {
GetUser(ctx context.Context, id domain.UserIdentifier) (*domain.User, error)
GetAllUsers(ctx context.Context) ([]domain.User, error)
CreateUser(ctx context.Context, user *domain.User) (*domain.User, error)
UpdateUser(ctx context.Context, user *domain.User) (*domain.User, error)
DeleteUser(ctx context.Context, id domain.UserIdentifier) error
ActivateApi(ctx context.Context, id domain.UserIdentifier) (*domain.User, error)
DeactivateApi(ctx context.Context, id domain.UserIdentifier) (*domain.User, error)
}
type UserServiceWireGuardManager interface {
GetUserPeers(ctx context.Context, id domain.UserIdentifier) ([]domain.Peer, error)
GetUserInterfaces(ctx context.Context, _ domain.UserIdentifier) ([]domain.Interface, error)
GetUserPeerStats(ctx context.Context, id domain.UserIdentifier) ([]domain.PeerStatus, error)
}
// endregion dependencies
type UserService struct {
cfg *config.Config
users UserServiceUserManager
wg UserServiceWireGuardManager
}
func NewUserService(cfg *config.Config, users UserServiceUserManager, wg UserServiceWireGuardManager) *UserService {
return &UserService{
cfg: cfg,
users: users,
wg: wg,
}
}
func (u UserService) GetUser(ctx context.Context, id domain.UserIdentifier) (*domain.User, error) {
return u.users.GetUser(ctx, id)
}
func (u UserService) GetAllUsers(ctx context.Context) ([]domain.User, error) {
return u.users.GetAllUsers(ctx)
}
func (u UserService) UpdateUser(ctx context.Context, user *domain.User) (*domain.User, error) {
return u.users.UpdateUser(ctx, user)
}
func (u UserService) CreateUser(ctx context.Context, user *domain.User) (*domain.User, error) {
return u.users.CreateUser(ctx, user)
}
func (u UserService) DeleteUser(ctx context.Context, id domain.UserIdentifier) error {
return u.users.DeleteUser(ctx, id)
}
func (u UserService) ActivateApi(ctx context.Context, id domain.UserIdentifier) (*domain.User, error) {
return u.users.ActivateApi(ctx, id)
}
func (u UserService) DeactivateApi(ctx context.Context, id domain.UserIdentifier) (*domain.User, error) {
return u.users.DeactivateApi(ctx, id)
}
func (u UserService) GetUserPeers(ctx context.Context, id domain.UserIdentifier) ([]domain.Peer, error) {
return u.wg.GetUserPeers(ctx, id)
}
func (u UserService) GetUserPeerStats(ctx context.Context, id domain.UserIdentifier) ([]domain.PeerStatus, error) {
return u.wg.GetUserPeerStats(ctx, id)
}
func (u UserService) GetUserInterfaces(ctx context.Context, id domain.UserIdentifier) ([]domain.Interface, error) {
return u.wg.GetUserInterfaces(ctx, id)
}