local.go RawHistoryFolder
1// Package cli implements the CLI adapter for Gordon.
2package cli
3
4import (
5 "context"
6 "fmt"
7 "path/filepath"
8
9 "github.com/bnema/zerowrap"
10 "github.com/spf13/viper"
11
12 "gordon/internal/adapters/out/domainsecrets"
13 "gordon/internal/app"
14 "gordon/internal/boundaries/in"
15 "gordon/internal/usecase/config"
16 secretsSvc "gordon/internal/usecase/secrets"
17)
18
19// LocalServices provides direct access to local services for CLI operations.
20type LocalServices struct {
21 configSvc in.ConfigService
22 secretSvc in.SecretService
23 dataDir string
24}
25
26// GetConfigService returns the config service.
27func (l *LocalServices) GetConfigService() in.ConfigService {
28 return l.configSvc
29}
30
31// GetSecretService returns the secret service.
32func (l *LocalServices) GetSecretService() in.SecretService {
33 return l.secretSvc
34}
35
36// GetDataDir returns the data directory.
37func (l *LocalServices) GetDataDir() string {
38 return l.dataDir
39}
40
41// GetLocalServices creates local services for CLI operations.
42// It loads the config and initializes services without starting the server.
43func GetLocalServices(configPath string) (*LocalServices, error) {
44 // Set up viper with defaults
45 v := viper.New()
46 v.SetDefault("server.port", 80)
47 v.SetDefault("server.registry_port", 5000)
48 v.SetDefault("server.data_dir", app.DefaultDataDir())
49
50 // Configure viper with config file paths
51 app.ConfigureViper(v, configPath)
52
53 // Read config file
54 if err := v.ReadInConfig(); err != nil {
55 if _, ok := err.(viper.ConfigFileNotFoundError); !ok {
56 return nil, fmt.Errorf("failed to read config file: %w", err)
57 }
58 // Config file not found is OK for some operations
59 }
60
61 // Create a minimal logger for CLI operations
62 log := zerowrap.New(zerowrap.Config{
63 Level: "warn",
64 Format: "console",
65 })
66
67 // Create config service (without event bus for CLI operations)
68 configSvc := config.NewService(v, nil)
69 ctx := context.Background()
70 if err := configSvc.Load(ctx); err != nil {
71 return nil, fmt.Errorf("failed to load configuration: %w", err)
72 }
73
74 // Determine data directory and env directory
75 dataDir := v.GetString("server.data_dir")
76 if dataDir == "" {
77 dataDir = app.DefaultDataDir()
78 }
79
80 envDir := v.GetString("env.dir")
81 if envDir == "" {
82 envDir = filepath.Join(dataDir, "env")
83 }
84
85 // Create domain secret store and service
86 domainSecretStore, err := domainsecrets.NewFileStore(envDir, log)
87 if err != nil {
88 return nil, fmt.Errorf("failed to create domain secret store: %w", err)
89 }
90 secretSvc := secretsSvc.NewService(domainSecretStore, log)
91
92 return &LocalServices{
93 configSvc: configSvc,
94 secretSvc: secretSvc,
95 dataDir: dataDir,
96 }, nil
97}