supabase-cli/internal/projects/delete/delete.go

61 lines
1.7 KiB
Go

package delete
import (
"context"
"fmt"
"net/http"
"os"
"github.com/go-errors/errors"
"github.com/spf13/afero"
"github.com/supabase/cli/internal/unlink"
"github.com/supabase/cli/internal/utils"
"github.com/supabase/cli/internal/utils/credentials"
"github.com/zalando/go-keyring"
)
func PreRun(ctx context.Context, ref string) error {
if err := utils.AssertProjectRefIsValid(ref); err != nil {
return err
}
title := fmt.Sprintf("Do you want to delete project %s? This action is irreversible.", utils.Aqua(ref))
if shouldDelete, err := utils.NewConsole().PromptYesNo(ctx, title, false); err != nil {
return err
} else if !shouldDelete {
return errors.New(context.Canceled)
}
return nil
}
func Run(ctx context.Context, ref string, fsys afero.Fs) error {
resp, err := utils.GetSupabase().V1DeleteAProjectWithResponse(ctx, ref)
if err != nil {
return errors.Errorf("failed to delete project: %w", err)
}
switch resp.StatusCode() {
case http.StatusNotFound:
return errors.New("Project does not exist:" + utils.Aqua(ref))
case http.StatusOK:
break
default:
return errors.Errorf("Failed to delete project %s: %s", utils.Aqua(ref), string(resp.Body))
}
// Unlink project
if err := credentials.StoreProvider.Delete(ref); err != nil && !errors.Is(err, keyring.ErrNotFound) {
fmt.Fprintln(os.Stderr, err)
}
if match, err := afero.FileContainsBytes(fsys, utils.ProjectRefPath, []byte(ref)); match {
if err := unlink.Unlink(ref, fsys); err != nil {
fmt.Fprintln(os.Stderr, err)
}
} else if err != nil {
logger := utils.GetDebugLogger()
fmt.Fprintln(logger, err)
}
fmt.Println("Deleted project: " + utils.Aqua(resp.JSON200.Name))
return nil
}