Skip to content

Commit 4c60aee

Browse files
committed
Fix: register directory in local vault on server use-project
1 parent a2949f9 commit 4c60aee

File tree

1 file changed

+104
-1
lines changed

1 file changed

+104
-1
lines changed

cli/cmd/enveil/server.go

Lines changed: 104 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ package main
22

33
import (
44
"fmt"
5+
"os"
56
"strings"
67

7-
"github.com/MaximoCoder/enveil-core/config"
88
"github.com/MaximoCoder/enveil-cli/internal/serverclient"
99
"github.com/MaximoCoder/enveil-cli/internal/ui"
10+
"github.com/MaximoCoder/enveil-core/config"
11+
"github.com/MaximoCoder/enveil-core/vault"
1012
"github.com/spf13/cobra"
1113
)
1214

@@ -34,11 +36,19 @@ var serverStatusCmd = &cobra.Command{
3436
RunE: runServerStatus,
3537
}
3638

39+
var serverUseProjectCmd = &cobra.Command{
40+
Use: "use-project <name>",
41+
Short: "Associate the current directory with an existing project on the server",
42+
Args: cobra.ExactArgs(1),
43+
RunE: runServerUseProject,
44+
}
45+
3746
func init() {
3847
rootCmd.AddCommand(serverCmd)
3948
serverCmd.AddCommand(serverConnectCmd)
4049
serverCmd.AddCommand(serverDisconnectCmd)
4150
serverCmd.AddCommand(serverStatusCmd)
51+
serverCmd.AddCommand(serverUseProjectCmd)
4252

4353
serverConnectCmd.Flags().String("key", "", "API key for authentication")
4454
serverConnectCmd.MarkFlagRequired("key")
@@ -108,4 +118,97 @@ func runServerStatus(cmd *cobra.Command, args []string) error {
108118

109119
ui.Success("Connected to %s", cfg.ServerURL)
110120
return nil
121+
}
122+
123+
func runServerUseProject(cmd *cobra.Command, args []string) error {
124+
name := args[0]
125+
126+
cfg, err := config.Load()
127+
if err != nil {
128+
return err
129+
}
130+
131+
if !cfg.HasServer() {
132+
return fmt.Errorf("no server configured, run 'enveil server connect' first")
133+
}
134+
135+
// Verificar que el proyecto existe en el servidor
136+
client := serverclient.New(cfg.ServerURL, cfg.ServerAPIKey)
137+
projects, err := client.ListProjects()
138+
if err != nil {
139+
return fmt.Errorf("error fetching projects from server: %w", err)
140+
}
141+
142+
found := false
143+
for _, p := range projects {
144+
if pname, ok := p["Name"].(string); ok && pname == name {
145+
found = true
146+
break
147+
}
148+
}
149+
150+
if !found {
151+
var names []string
152+
for _, p := range projects {
153+
if pname, ok := p["Name"].(string); ok {
154+
names = append(names, pname)
155+
}
156+
}
157+
return fmt.Errorf("project '%s' not found on server. Available: %s", name, strings.Join(names, ", "))
158+
}
159+
160+
// Abrir el vault local y registrar el directorio
161+
cwd, err := os.Getwd()
162+
if err != nil {
163+
return fmt.Errorf("error getting current directory: %w", err)
164+
}
165+
166+
masterKeyHex, err := promptAndDeriveKey(cfg)
167+
if err != nil {
168+
return err
169+
}
170+
171+
v, err := vault.Open(cfg.VaultPath, masterKeyHex)
172+
if err != nil {
173+
return err
174+
}
175+
defer v.Close()
176+
177+
// Verificar si el directorio ya está registrado
178+
projectID, existingName, err := v.GetProjectByPath(cwd)
179+
if err != nil {
180+
return err
181+
}
182+
183+
if projectID != 0 {
184+
if existingName == name {
185+
ui.Warning("Directory already associated with project '%s'", name)
186+
return nil
187+
}
188+
return fmt.Errorf("directory already registered as project '%s', unregister it first", existingName)
189+
}
190+
191+
// Registrar en el vault local
192+
projectID, err = v.CreateProject(name, cwd)
193+
if err != nil {
194+
return err
195+
}
196+
197+
_, err = v.CreateEnvironment(projectID, "development")
198+
if err != nil {
199+
return err
200+
}
201+
202+
// Actualizar config global
203+
cfg.ActiveProject = name
204+
if cfg.ActiveEnv == "" {
205+
cfg.ActiveEnv = "development"
206+
}
207+
if err := cfg.Save(); err != nil {
208+
return err
209+
}
210+
211+
ui.Success("Directory associated with server project '%s'", name)
212+
ui.Info("Run 'enveil list' to see available variables")
213+
return nil
111214
}

0 commit comments

Comments
 (0)