From 8822a0a8da61a1b44c96a01af30b99160be73b56 Mon Sep 17 00:00:00 2001 From: Suraj B M Date: Thu, 2 Oct 2025 23:49:24 +0530 Subject: [PATCH] feat: implement delete command --- cmd/delete.go | 138 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 cmd/delete.go diff --git a/cmd/delete.go b/cmd/delete.go new file mode 100644 index 0000000..8539330 --- /dev/null +++ b/cmd/delete.go @@ -0,0 +1,138 @@ +package cmd + +import ( + "envy/cmd/utils" + "errors" + "fmt" + "os" + "path" + + "github.com/charmbracelet/huh" + "github.com/charmbracelet/lipgloss" + "github.com/spf13/cobra" +) + +// deleteCmd represents the delete command +var deleteCmd = &cobra.Command{ + Use: "delete [environment]", + Short: "Delete an environment or the project", + Run: func(cmd *cobra.Command, args []string) { + isProject, err := cmd.Flags().GetBool("project") + utils.StopIfErr(err) + + env := "" + if len(args) > 0 { + env = args[0] + } + + envy, err := utils.GetEnvy() + utils.StopIfErr(err) + + project, _ := utils.GetKey(envy, "envy.project") + pinned, _ := utils.GetKey(envy, "envy.env") + current, _ := utils.GetKey(envy, "envy.current") + + dbProject, err := utils.GetProject(project) + utils.StopIfErr(err) + + dbEnvs, err := utils.GetEnvironments(dbProject.ID) + utils.StopIfErr(err) + + if isProject || len(dbEnvs) == 1 { + var name string + var confirm bool + style := lipgloss.NewStyle().Foreground(lipgloss.Color("#0FF")) + form := huh.NewForm( + huh.NewGroup( + huh.NewInput(). + Title("Delete Project"). + Description("Enter \""+style.Render(project)+"\" to proceed"). + Validate(func(s string) error { + if s != project { + return errors.New("wrong project name entered") + } + return nil + }). + Value(&name), + + huh.NewConfirm(). + Title("Are you sure that you want to delete this project?"). + Description("All the environments, except the current one, will be permanently deleted"). + Value(&confirm), + ), + ) + + err = form.Run() + utils.StopIfErr(err) + + if confirm { + utils.DB.Delete(&dbEnvs) + utils.DB.Delete(&dbProject) + + cwd, err := os.Getwd() + utils.StopIfErr(err) + err = os.Remove(path.Join(cwd, "envy.toml")) + utils.StopIfErr(err) + + fmt.Printf("Deleted project %v and its environments.\n", project) + } + } else { + dbEnv := &utils.Environment{} + + if env == "" { + form := huh.NewForm( + huh.NewGroup( + huh.NewSelect[*utils.Environment](). + Title("Delete environment"). + Description("Select environment to delete"). + OptionsFunc(func() []huh.Option[*utils.Environment] { + var opts []huh.Option[*utils.Environment] + for _, en := range dbEnvs { + opts = append(opts, huh.NewOption(en.Name, &en)) + } + return opts + }, &dbEnvs). + Validate(func(e *utils.Environment) error { + if e.Name == current { + return errors.New("cannot delete current environment") + } + return nil + }). + Value(&dbEnv), + ), + ) + + err = form.Run() + utils.StopIfErr(err) + } else { + for _, en := range dbEnvs { + if en.Name == env { + dbEnv = &en + } + } + } + + switch dbEnv.Name { + case pinned: + envy.Set("envy.env", current) + data, err := envy.Marshal() + utils.StopIfErr(err) + cwd, err := os.Getwd() + utils.StopIfErr(err) + err = os.WriteFile(path.Join(cwd, "envy.toml"), data, 0755) + utils.StopIfErr(err) + case current: + utils.ErrPrint("Cannot delete current environment.") + os.Exit(1) + } + utils.DB.Delete(&dbEnv) + fmt.Printf("Deleted environment %v from project %v.\n", dbEnv.Name, project) + } + }, +} + +func init() { + rootCmd.AddCommand(deleteCmd) + + deleteCmd.Flags().BoolP("project", "p", false, "Delete the entire project") +}