From 4769b5e788b1d76915cf1ef3ef440489733fad63 Mon Sep 17 00:00:00 2001 From: Hakan Sariman Date: Sun, 22 Jun 2025 08:42:36 +0300 Subject: [PATCH] add profile manager with error handling for profile operations --- client/internal/profilemanager/error.go | 8 +++ .../internal/profilemanager/profilemanager.go | 69 +++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 client/internal/profilemanager/error.go create mode 100644 client/internal/profilemanager/profilemanager.go diff --git a/client/internal/profilemanager/error.go b/client/internal/profilemanager/error.go new file mode 100644 index 000000000..cfc1332e5 --- /dev/null +++ b/client/internal/profilemanager/error.go @@ -0,0 +1,8 @@ +package profilemanager + +import "errors" + +var ( + ErrProfileNotFound = errors.New("profile not found") + ErrProfileAlreadyExists = errors.New("profile already exists") +) diff --git a/client/internal/profilemanager/profilemanager.go b/client/internal/profilemanager/profilemanager.go new file mode 100644 index 000000000..754981507 --- /dev/null +++ b/client/internal/profilemanager/profilemanager.go @@ -0,0 +1,69 @@ +package profilemanager + +import ( + "fmt" + "os" + "path/filepath" + + "github.com/netbirdio/netbird/util" +) + +type Profile struct { + Name string + Email string +} + +type ProfileManager struct { +} + +func NewProfileManager() *ProfileManager { + return &ProfileManager{} +} + +func (pm *ProfileManager) AddProfile(profile Profile) error { + configDir, err := getConfigDir() + if err != nil { + return fmt.Errorf("failed to get config directory: %w", err) + } + + profPath := filepath.Join(configDir, profile.Name+".json") + if fileExists(profPath) { + return ErrProfileAlreadyExists + } + +} + +func getConfigDir() (string, error) { + configDir, err := os.UserConfigDir() + if err != nil { + return "", err + } + + configDir = filepath.Join(configDir, "netbird") + if _, err := os.Stat(configDir); os.IsNotExist(err) { + if err := os.MkdirAll(configDir, 0755); err != nil { + return "", err + } + } + + return configDir, nil +} + +func fileExists(path string) bool { + _, err := os.Stat(path) + return !os.IsNotExist(err) +} + +// createNewConfig creates a new config generating a new Wireguard key and saving to file +func createNewConfig(input ConfigInput) (*Config, error) { + config := &Config{ + // defaults to false only for new (post 0.26) configurations + ServerSSHAllowed: util.False(), + } + + if _, err := config.apply(input); err != nil { + return nil, err + } + + return config, nil +}