Newer
Older
wg-portal / internal / persistence / wireguard.go
package persistence

import (
	"github.com/pkg/errors"
	"gorm.io/gorm/clause"
)

func (d *Database) GetAvailableInterfaces() ([]InterfaceIdentifier, error) {
	var interfaces []InterfaceConfig
	if err := d.db.Select("identifier").Find(&interfaces).Error; err != nil {
		return nil, errors.WithMessage(err, "unable to find interfaces")
	}

	interfaceIds := make([]InterfaceIdentifier, len(interfaces))
	for i := range interfaces {
		interfaceIds[i] = interfaces[i].Identifier
	}

	return interfaceIds, nil
}

func (d *Database) GetAllInterfaces(ids ...InterfaceIdentifier) (map[InterfaceConfig][]PeerConfig, error) {
	var interfaces []InterfaceConfig
	if err := d.db.Where("identifier IN ?", ids).Find(&interfaces).Error; err != nil {
		return nil, errors.WithMessage(err, "unable to find interfaces")
	}

	interfaceMap := make(map[InterfaceConfig][]PeerConfig, len(interfaces))
	for i := range interfaces {
		var peers []PeerConfig
		if err := d.db.Where("iface_identifier = ?", interfaces[i].Identifier).Find(&peers).Error; err != nil {
			return nil, errors.WithMessagef(err, "unable to find peers for %s", interfaces[i].Identifier)
		}
		interfaceMap[interfaces[i]] = peers
	}

	return interfaceMap, nil
}

func (d *Database) GetInterface(id InterfaceIdentifier) (InterfaceConfig, []PeerConfig, error) {
	var iface InterfaceConfig
	if err := d.db.First(&iface, id).Error; err != nil {
		return InterfaceConfig{}, nil, errors.WithMessage(err, "unable to find interface")
	}

	var peers []PeerConfig
	if err := d.db.Where("identifier = ?", id).Find(&peers).Error; err != nil {
		return InterfaceConfig{}, nil, errors.WithMessage(err, "unable to find peers")
	}

	return iface, peers, nil
}

func (d *Database) SaveInterface(cfg InterfaceConfig) error {
	d.db.Clauses(clause.OnConflict{
		UpdateAll: true,
	}).Create(&cfg)
	return nil
}

func (d *Database) DeleteInterface(id InterfaceIdentifier) error {
	if err := d.db.Delete(&InterfaceConfig{}, id).Error; err != nil {
		return errors.WithMessage(err, "unable to delete interface")
	}

	return nil
}

func (d *Database) SavePeer(peer PeerConfig) error {
	if err := d.db.Clauses(clause.OnConflict{
		UpdateAll: true,
	}).Create(&peer).Error; err != nil {
		return errors.WithMessage(err, "unable to save peer")
	}

	return nil
}

func (d *Database) DeletePeer(peerId PeerIdentifier) error {
	if err := d.db.Delete(&PeerConfig{}, peerId).Error; err != nil {
		return errors.WithMessage(err, "unable to delete peer")
	}
	return nil
}