Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions cmd/delete-all.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ package cmd
import (
json2 "encoding/json"
"fmt"
"github.com/elasticpath/epcc-cli/external/aliases"
"github.com/elasticpath/epcc-cli/external/completion"
"github.com/elasticpath/epcc-cli/external/resources"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"io/ioutil"
"os"
"sync"
)

Expand Down Expand Up @@ -47,6 +49,7 @@ var DeleteAll = &cobra.Command{
return fmt.Errorf("Problem getting page of ids for resource %s", args[0])
}
}
os.Remove(aliases.GetAliasFileForJsonApiType(aliases.GetAliasDataDirectory(), resource.JsonApiType))

return nil
},
Expand Down
9 changes: 7 additions & 2 deletions cmd/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package cmd
import (
"context"
"fmt"
"github.com/elasticpath/epcc-cli/external/aliases"
"github.com/elasticpath/epcc-cli/external/completion"
"github.com/elasticpath/epcc-cli/external/httpclient"
"github.com/elasticpath/epcc-cli/external/json"
Expand All @@ -18,8 +19,12 @@ var delete = &cobra.Command{
Short: "Deletes a single resource.",
Args: cobra.MinimumNArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
resp, err := deleteResource(args)
resource, ok := resources.GetResourceByName(args[0])
if !ok {
return fmt.Errorf("Could not find resource %s", args[0])
}

resp, err := deleteResource(args)
if err != nil {
return err
}
Expand All @@ -34,7 +39,7 @@ var delete = &cobra.Command{
if resp.StatusCode >= 400 && resp.StatusCode <= 600 {
log.Println(resp.Status)
}

aliases.DeleteAliasesById(args[len(args)-1], resource.JsonApiType)
return json.PrintJson(string(body))
},

Expand Down
65 changes: 39 additions & 26 deletions external/aliases/aliases.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ func GetAliasDataDirectory() string {
}
func GetAliasesForJsonApiType(jsonApiType string) map[string]string {
profileDirectory := GetAliasDataDirectory()
aliasFile := getAliasFileForJsonApiType(profileDirectory, jsonApiType)
aliasFile := GetAliasFileForJsonApiType(profileDirectory, jsonApiType)

aliasMap := map[string]string{}

Expand Down Expand Up @@ -71,24 +71,22 @@ func SaveAliasesForResources(jsonTxt string) {

log.Tracef("All aliases: %s", results)

profileDirectory := GetAliasDataDirectory()
for resourceType, aliases := range results {
saveAliasesForResource(profileDirectory, resourceType, aliases)
saveAliasesForResource(resourceType, aliases)
}

}

// This function saves all the aliases for a specific resource.
func saveAliasesForResource(profileDirectory string, jsonApiType string, aliases map[string]string) {
func modifyAliases(jsonApiType string, fn func(map[string]string)) map[string]string {
profileDirectory := GetAliasDataDirectory()
filelock.Lock()
defer filelock.Unlock()

aliasFile := getAliasFileForJsonApiType(profileDirectory, jsonApiType)
aliasFile := GetAliasFileForJsonApiType(profileDirectory, jsonApiType)
data, err := ioutil.ReadFile(aliasFile)
if err != nil {
log.Debugf("Could not read %s, error %s", aliasFile, err)
data = []byte{}
} else {
}

aliasMap := map[string]string{}
Comment thread
mahsaelasticpath marked this conversation as resolved.
Expand All @@ -97,29 +95,13 @@ func saveAliasesForResource(profileDirectory string, jsonApiType string, aliases
if err != nil {
log.Debugf("Could not unmarshall existing file %s, error %s", data, err)
}

for key, value := range aliases {
key0 := strings.Split(key, "=")[0]
for oldKey, oldValue := range aliasMap {
oldKey0 := strings.Split(oldKey, "=")[0]
oldKey1 := strings.Split(oldKey, "=")[1]
if oldValue == value && oldKey0 == key0 {
delete(aliasMap, oldKey0+"="+oldKey1)
}
}
}

for key, value := range aliases {
aliasMap[key] = value
}

fn(aliasMap)
// We will write to a temp file and then rename, to prevent data loss. rename's in the same folder are likely atomic in most settings.
// Although we should probably sync on the file as well, that might be too much overhead, and I was too lazy to rewrite this
// https://github.com/golang/go/issues/20599
tmpFileName := aliasFile + "." + uuid.New().String()

marshal, err := yaml.Marshal(aliasMap)

if err != nil {
log.Warnf("Could not save aliases for %s, error %v", tmpFileName, err)
}
Expand All @@ -133,15 +115,46 @@ func saveAliasesForResource(profileDirectory string, jsonApiType string, aliases
if err != nil {
log.Warnf("Could not save aliases for %s, error %v", tmpFileName, err)
}
return aliasMap
}
func DeleteAliasesById(id string, jsonApiType string) {
modifyAliases(jsonApiType, func(m map[string]string) {
for key, value := range m {
if value == id {
delete(m, key)
}
}
},
)

}

func getAliasFileForJsonApiType(profileDirectory string, resourceType string) string {
// This function saves all the aliases for a specific resource.
func saveAliasesForResource(jsonApiType string, aliases map[string]string) {
modifyAliases(jsonApiType, func(aliasMap map[string]string) {
for key, value := range aliases {
key0 := strings.Split(key, "=")[0]
for oldKey, oldValue := range aliasMap {
oldKey0 := strings.Split(oldKey, "=")[0]
oldKey1 := strings.Split(oldKey, "=")[1]
if oldValue == value && oldKey0 == key0 {
delete(aliasMap, oldKey0+"="+oldKey1)
}
}
}

for key, value := range aliases {
aliasMap[key] = value
}
})
}

func GetAliasFileForJsonApiType(profileDirectory string, resourceType string) string {
aliasFile := fmt.Sprintf("%s/aliases_%s.yml", profileDirectory, resourceType)
return aliasFile
}

func visitResources(data map[string]interface{}, prefix string, results map[string]map[string]string) {

if typeObj, typeKeyExists := data["type"]; typeKeyExists {
if idObj, idKeyExists := data["id"]; idKeyExists {
if typeKeyValue, typeKeyIsString := typeObj.(string); typeKeyIsString {
Expand Down