From e2ff7ec87dd02711478a8e7bc6d5d7f31b5cf13d Mon Sep 17 00:00:00 2001 From: Mahsa ghoreishi Date: Fri, 8 Apr 2022 15:24:17 -0400 Subject: [PATCH 1/3] issue 79 --- cmd/commercemanager.go | 1 + cmd/share.go | 66 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/cmd/commercemanager.go b/cmd/commercemanager.go index 0bfc0007..9479a8b8 100644 --- a/cmd/commercemanager.go +++ b/cmd/commercemanager.go @@ -12,6 +12,7 @@ var cmCommand = &cobra.Command{ Use: "commerce-manager", Short: "Open commerce manager", RunE: func(cmd *cobra.Command, args []string) error { + logToDisk("POST", "/v2/accounts", nil, nil, 200) u, err := url.Parse(config.Envs.EPCC_API_BASE_URL) if err != nil { fmt.Println(err) diff --git a/cmd/share.go b/cmd/share.go index 52a39308..33ad5b3c 100644 --- a/cmd/share.go +++ b/cmd/share.go @@ -1,13 +1,19 @@ package cmd import ( + b64 "encoding/base64" "fmt" + "io/fs" + "io/ioutil" + "os" "os/exec" "runtime" + "sort" + "strconv" + "strings" ) func OpenUrl(cmUrl string) error { - switch runtime.GOOS { case "linux": exec.Command("xdg-open", cmUrl).Start() @@ -21,3 +27,61 @@ func OpenUrl(cmUrl string) error { return nil } + +func logToDisk(requestMethod string, requestPath string, requestBytes []byte, responseBytes []byte, responseCode int) error { + logDirectory := "profiles" + os.Mkdir("profiles", os.ModePerm) + var logNumber = 1 + lastFile := getLastFile(logDirectory) + if lastFile != nil { + decodedFileNAme, err := base64DecodeStripped((*lastFile).Name()) + if err != nil { + return err + } + + fileNameParts := strings.Split(decodedFileNAme, " ") + logNumber, _ = strconv.Atoi(fileNameParts[0]) + logNumber++ + } + + filename := base64EncodeStripped(fmt.Sprintf("%d %s %s ==> %d", logNumber, requestMethod, requestPath, responseCode)) + f, err := os.Create(fmt.Sprintf("%s/%s", logDirectory, filename)) + if err != nil { + return err + } + defer f.Close() + f.Write(requestBytes) + f.Write([]byte("\n")) + f.Write(responseBytes) + return nil +} + +func allFileSortedByDate(logDirectory string) []fs.FileInfo { + files, _ := ioutil.ReadDir(logDirectory) + sort.Slice(files, func(i, j int) bool { + return files[i].ModTime().Before(files[j].ModTime()) + }) + + return files +} + +func getLastFile(logDirectory string) *fs.FileInfo { + all := allFileSortedByDate(logDirectory) + if len(all) >= 1 { + return &all[len(all)-1] + } + return nil +} + +func base64EncodeStripped(s string) string { + encoded := b64.StdEncoding.EncodeToString([]byte(s)) + return strings.TrimRight(encoded, "=") +} + +func base64DecodeStripped(s string) (string, error) { + if i := len(s) % 4; i != 0 { + s += strings.Repeat("=", 4-i) + } + decoded, err := b64.StdEncoding.DecodeString(s) + return string(decoded), err +} From 1fb2e40320366f21ab79d142b7994ca34cb4025f Mon Sep 17 00:00:00 2001 From: Mahsa ghoreishi Date: Mon, 11 Apr 2022 11:55:01 -0400 Subject: [PATCH 2/3] issue 79 logs --- .gitignore | 3 +- cmd/commercemanager.go | 4 +- cmd/create.go | 1 - cmd/docs.go | 13 ++--- cmd/logs.go | 42 +++++++++++++++ cmd/root.go | 1 + cmd/share.go | 87 ------------------------------- external/httpclient/httpclient.go | 51 ++++++++++++++++++ external/resources/resources.yaml | 35 ++++++------- shared/share.go | 51 ++++++++++++++++++ 10 files changed, 172 insertions(+), 116 deletions(-) create mode 100644 cmd/logs.go delete mode 100644 cmd/share.go create mode 100644 shared/share.go diff --git a/.gitignore b/.gitignore index 1d5f243c..42520dde 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ bin dist/ epcc-cli -epcc \ No newline at end of file +epcc +profiles \ No newline at end of file diff --git a/cmd/commercemanager.go b/cmd/commercemanager.go index 9479a8b8..95f4edeb 100644 --- a/cmd/commercemanager.go +++ b/cmd/commercemanager.go @@ -3,6 +3,7 @@ package cmd import ( "fmt" "github.com/elasticpath/epcc-cli/config" + "github.com/elasticpath/epcc-cli/shared" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" "net/url" @@ -12,7 +13,6 @@ var cmCommand = &cobra.Command{ Use: "commerce-manager", Short: "Open commerce manager", RunE: func(cmd *cobra.Command, args []string) error { - logToDisk("POST", "/v2/accounts", nil, nil, 200) u, err := url.Parse(config.Envs.EPCC_API_BASE_URL) if err != nil { fmt.Println(err) @@ -29,7 +29,7 @@ var cmCommand = &cobra.Command{ if cmUrl == "" { return fmt.Errorf("Don't know where Commerce Manager is for $EPCC_API_BASE_URL=%s \n", u) } - err = OpenUrl(cmUrl) + err = shared.OpenUrl(cmUrl) if err != nil { return err } diff --git a/cmd/create.go b/cmd/create.go index 0d2c6269..383d0353 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -71,7 +71,6 @@ var create = &cobra.Command{ json.PrintJson(string(resBody)) return fmt.Errorf(resp.Status) } - return json.PrintJson(string(resBody)) }, diff --git a/cmd/docs.go b/cmd/docs.go index eab184ea..f5612615 100644 --- a/cmd/docs.go +++ b/cmd/docs.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/elasticpath/epcc-cli/external/completion" "github.com/elasticpath/epcc-cli/external/resources" + "github.com/elasticpath/epcc-cli/shared" "github.com/spf13/cobra" ) @@ -51,32 +52,32 @@ func openDoc(resourceDoc resources.Resource, verb string) error { if len(resourceDoc.Docs) < 1 { err = doDefault() } - err = OpenUrl(resourceDoc.Docs) + err = shared.OpenUrl(resourceDoc.Docs) case "get-collection": if resourceDoc.GetCollectionInfo != nil && len(resourceDoc.GetCollectionInfo.Docs) < 1 { err = doDefault() } - err = OpenUrl(resourceDoc.GetCollectionInfo.Docs) + err = shared.OpenUrl(resourceDoc.GetCollectionInfo.Docs) case "get": if resourceDoc.GetEntityInfo != nil && len(resourceDoc.GetEntityInfo.Docs) < 1 { err = doDefault() } - err = OpenUrl(resourceDoc.GetEntityInfo.Docs) + err = shared.OpenUrl(resourceDoc.GetEntityInfo.Docs) case "update": if resourceDoc.UpdateEntityInfo != nil && len(resourceDoc.UpdateEntityInfo.Docs) < 1 { err = doDefault() } - err = OpenUrl(resourceDoc.UpdateEntityInfo.Docs) + err = shared.OpenUrl(resourceDoc.UpdateEntityInfo.Docs) case "delete": if resourceDoc.DeleteEntityInfo != nil && len(resourceDoc.DeleteEntityInfo.Docs) < 1 { err = doDefault() } - err = OpenUrl(resourceDoc.DeleteEntityInfo.Docs) + err = shared.OpenUrl(resourceDoc.DeleteEntityInfo.Docs) case "create": if resourceDoc.CreateEntityInfo != nil && len(resourceDoc.CreateEntityInfo.Docs) < 1 { err = doDefault() } - err = OpenUrl(resourceDoc.CreateEntityInfo.Docs) + err = shared.OpenUrl(resourceDoc.CreateEntityInfo.Docs) default: return fmt.Errorf("Could not find verb %s", verb) diff --git a/cmd/logs.go b/cmd/logs.go new file mode 100644 index 00000000..889f8375 --- /dev/null +++ b/cmd/logs.go @@ -0,0 +1,42 @@ +package cmd + +import ( + "fmt" + "github.com/elasticpath/epcc-cli/shared" + "github.com/spf13/cobra" + "os" + "strings" +) + +var logs = &cobra.Command{ + Use: "logs [NUMBER]", + Short: "Returns Http logs", + Args: cobra.MinimumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + files := shared.AllFilesSortedByDate(shared.LogDirectory) + if args[0] == "show" { + if len(args) != 2 { + return fmt.Errorf("Show command needs the number of log to show") + } + } + if args[0] == "show" || args[0] == "list" { + for i := 0; i < len(files); i++ { + name, _ := shared.Base64DecodeStripped(files[i].Name()) + + if args[0] == "show" { + segments := strings.Split(name, " ") + if segments[0] == args[1] { + fmt.Println(name) + break + } + } else if args[0] == "list" { + fmt.Println(name) + } + } + } else if args[0] == "clear" { + os.RemoveAll(shared.LogDirectory) + } + + return nil + }, +} diff --git a/cmd/root.go b/cmd/root.go index 467d9bbb..e67d9d3c 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -30,6 +30,7 @@ func init() { create, delete, update, + logs, resourceListCommand, ) diff --git a/cmd/share.go b/cmd/share.go deleted file mode 100644 index 33ad5b3c..00000000 --- a/cmd/share.go +++ /dev/null @@ -1,87 +0,0 @@ -package cmd - -import ( - b64 "encoding/base64" - "fmt" - "io/fs" - "io/ioutil" - "os" - "os/exec" - "runtime" - "sort" - "strconv" - "strings" -) - -func OpenUrl(cmUrl string) error { - switch runtime.GOOS { - case "linux": - exec.Command("xdg-open", cmUrl).Start() - case "windows": - exec.Command("rundll32", "url.dll,FileProtocolHandler", cmUrl).Start() - case "darwin": - exec.Command("open", cmUrl).Start() - default: - return fmt.Errorf("unsupported platform") - } - - return nil -} - -func logToDisk(requestMethod string, requestPath string, requestBytes []byte, responseBytes []byte, responseCode int) error { - logDirectory := "profiles" - os.Mkdir("profiles", os.ModePerm) - var logNumber = 1 - lastFile := getLastFile(logDirectory) - if lastFile != nil { - decodedFileNAme, err := base64DecodeStripped((*lastFile).Name()) - if err != nil { - return err - } - - fileNameParts := strings.Split(decodedFileNAme, " ") - logNumber, _ = strconv.Atoi(fileNameParts[0]) - logNumber++ - } - - filename := base64EncodeStripped(fmt.Sprintf("%d %s %s ==> %d", logNumber, requestMethod, requestPath, responseCode)) - f, err := os.Create(fmt.Sprintf("%s/%s", logDirectory, filename)) - if err != nil { - return err - } - defer f.Close() - f.Write(requestBytes) - f.Write([]byte("\n")) - f.Write(responseBytes) - return nil -} - -func allFileSortedByDate(logDirectory string) []fs.FileInfo { - files, _ := ioutil.ReadDir(logDirectory) - sort.Slice(files, func(i, j int) bool { - return files[i].ModTime().Before(files[j].ModTime()) - }) - - return files -} - -func getLastFile(logDirectory string) *fs.FileInfo { - all := allFileSortedByDate(logDirectory) - if len(all) >= 1 { - return &all[len(all)-1] - } - return nil -} - -func base64EncodeStripped(s string) string { - encoded := b64.StdEncoding.EncodeToString([]byte(s)) - return strings.TrimRight(encoded, "=") -} - -func base64DecodeStripped(s string) (string, error) { - if i := len(s) % 4; i != 0 { - s += strings.Repeat("=", 4-i) - } - decoded, err := b64.StdEncoding.DecodeString(s) - return string(decoded), err -} diff --git a/external/httpclient/httpclient.go b/external/httpclient/httpclient.go index e01a900d..d2ca0880 100644 --- a/external/httpclient/httpclient.go +++ b/external/httpclient/httpclient.go @@ -9,12 +9,17 @@ import ( "github.com/elasticpath/epcc-cli/external/json" "github.com/elasticpath/epcc-cli/external/version" "github.com/elasticpath/epcc-cli/globals" + "github.com/elasticpath/epcc-cli/shared" log "github.com/sirupsen/logrus" "io" + "io/fs" "io/ioutil" "mime/multipart" "net/http" + "net/http/httputil" "net/url" + "os" + "strconv" "strings" "time" ) @@ -85,6 +90,17 @@ func doRequestInternal(ctx context.Context, method string, contentType string, p } else if resp.StatusCode >= 200 && resp.StatusCode <= 399 { log.Infof("%s %s ==> %s %s", method, reqURL.String(), resp.Proto, resp.Status) } + dumpReq, err := httputil.DumpRequestOut(req, true) + if err != nil { + log.Error(err) + } + + dumpRes, err := httputil.DumpResponse(resp, true) + if err != nil { + log.Error(err) + } + + logToDisk(method, path, dumpReq, dumpRes, resp.StatusCode) return resp, err } @@ -128,3 +144,38 @@ func AddHeaderByFlag(r *http.Request) error { } return nil } + +func logToDisk(requestMethod string, requestPath string, requestBytes []byte, responseBytes []byte, responseCode int) error { + os.Mkdir(shared.LogDirectory, os.ModePerm) + var logNumber = 1 + lastFile := getLastFile(shared.LogDirectory) + if lastFile != nil { + decodedFileNAme, err := shared.Base64DecodeStripped((*lastFile).Name()) + if err != nil { + return err + } + + fileNameParts := strings.Split(decodedFileNAme, " ") + logNumber, _ = strconv.Atoi(fileNameParts[0]) + logNumber++ + } + + filename := shared.Base64EncodeStripped(fmt.Sprintf("%d %s %s ==> %d", logNumber, requestMethod, requestPath, responseCode)) + f, err := os.Create(fmt.Sprintf("%s/%s", shared.LogDirectory, filename)) + if err != nil { + return err + } + defer f.Close() + f.Write(requestBytes) + f.Write([]byte("\n")) + f.Write(responseBytes) + return nil +} + +func getLastFile(logDirectory string) *fs.FileInfo { + all := shared.AllFilesSortedByDate(logDirectory) + if len(all) >= 1 { + return &all[len(all)-1] + } + return nil +} diff --git a/external/resources/resources.yaml b/external/resources/resources.yaml index 42ddb244..c9dfcde4 100644 --- a/external/resources/resources.yaml +++ b/external/resources/resources.yaml @@ -534,23 +534,22 @@ orders: url: "/v2/orders/{orders}" content-type: application/json attributes: - attributes: - shipping_address.first_name: - type: STRING - shipping_address.last_name: - type: STRING - shipping_address.line_1: - type: STRING - shipping_address.postcode: - type: STRING - shipping_address.county: - type: STRING - shipping_address.country: - type: STRING - status: - type: ENUM:cancelled - shipping: - type: ENUM:fulfilled + shipping_address.first_name: + type: STRING + shipping_address.last_name: + type: STRING + shipping_address.line_1: + type: STRING + shipping_address.postcode: + type: STRING + shipping_address.county: + type: STRING + shipping_address.country: + type: STRING + status: + type: ENUM:cancelled + shipping: + type: ENUM:fulfilled order-items: singular-name: "order-item" json-api-type: "order_item" @@ -559,7 +558,6 @@ order-items: get-collection: docs: "https://documentation.elasticpath.com/commerce-cloud/docs/api/carts-and-orders/orders/order-items.html#get-get-order-items" url: "/v2/orders/{orders}/items" - attributes: order-transactions: singular-name: "order-transaction" json-api-type: "transaction" @@ -624,7 +622,6 @@ payment-gateways: get-collection: docs: "https://documentation.elasticpath.com/commerce-cloud/docs/api/payments/gateways/get-all-gateways.html" url: "/v2/gateways/" - attributes: payment-gateways-manual: singular-name: "payment-gateway-manual" json-api-type: "gateway" diff --git a/shared/share.go b/shared/share.go new file mode 100644 index 00000000..06a90cf0 --- /dev/null +++ b/shared/share.go @@ -0,0 +1,51 @@ +package shared + +import ( + b64 "encoding/base64" + "fmt" + "io/fs" + "io/ioutil" + "os/exec" + "runtime" + "sort" + "strings" +) + +const LogDirectory = "profiles" + +func OpenUrl(cmUrl string) error { + switch runtime.GOOS { + case "linux": + exec.Command("xdg-open", cmUrl).Start() + case "windows": + exec.Command("rundll32", "url.dll,FileProtocolHandler", cmUrl).Start() + case "darwin": + exec.Command("open", cmUrl).Start() + default: + return fmt.Errorf("unsupported platform") + } + + return nil +} + +func AllFilesSortedByDate(logDirectory string) []fs.FileInfo { + files, _ := ioutil.ReadDir(logDirectory) + sort.Slice(files, func(i, j int) bool { + return files[i].ModTime().Before(files[j].ModTime()) + }) + + return files +} + +func Base64EncodeStripped(s string) string { + encoded := b64.StdEncoding.EncodeToString([]byte(s)) + return strings.TrimRight(encoded, "=") +} + +func Base64DecodeStripped(s string) (string, error) { + if i := len(s) % 4; i != 0 { + s += strings.Repeat("=", 4-i) + } + decoded, err := b64.StdEncoding.DecodeString(s) + return string(decoded), err +} From 192271decb1a03829ca698c0cc595986c6445284 Mon Sep 17 00:00:00 2001 From: Mahsa ghoreishi Date: Mon, 11 Apr 2022 14:07:27 -0400 Subject: [PATCH 3/3] fix --- cmd/logs.go | 54 +++++++++++++++++++++++++++++++---------------------- cmd/root.go | 1 + 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/cmd/logs.go b/cmd/logs.go index 889f8375..b8683d60 100644 --- a/cmd/logs.go +++ b/cmd/logs.go @@ -8,35 +8,45 @@ import ( "strings" ) -var logs = &cobra.Command{ - Use: "logs [NUMBER]", - Short: "Returns Http logs", - Args: cobra.MinimumNArgs(1), +var logsClear = &cobra.Command{ + Use: "clear", + Short: "Clears all Http logs", + RunE: func(cmd *cobra.Command, args []string) error { + os.RemoveAll(shared.LogDirectory) + return nil + }, +} + +var logsList = &cobra.Command{ + Use: "list", + Short: "List All Http logs", RunE: func(cmd *cobra.Command, args []string) error { files := shared.AllFilesSortedByDate(shared.LogDirectory) - if args[0] == "show" { - if len(args) != 2 { - return fmt.Errorf("Show command needs the number of log to show") - } + for i := 0; i < len(files); i++ { + name, _ := shared.Base64DecodeStripped(files[i].Name()) + fmt.Println(name) } - if args[0] == "show" || args[0] == "list" { - for i := 0; i < len(files); i++ { - name, _ := shared.Base64DecodeStripped(files[i].Name()) + return nil + }, +} - if args[0] == "show" { - segments := strings.Split(name, " ") - if segments[0] == args[1] { - fmt.Println(name) - break - } - } else if args[0] == "list" { - fmt.Println(name) - } +var logsShow = &cobra.Command{ + Use: "show ", + Short: "Show Http logs for specific number", + Args: cobra.MinimumNArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + files := shared.AllFilesSortedByDate(shared.LogDirectory) + for i := 0; i < len(files); i++ { + name, _ := shared.Base64DecodeStripped(files[i].Name()) + segments := strings.Split(name, " ") + if segments[0] == args[0] { + fmt.Println(name) + break } - } else if args[0] == "clear" { - os.RemoveAll(shared.LogDirectory) } return nil }, } + +var logs = &cobra.Command{Use: "logs"} diff --git a/cmd/root.go b/cmd/root.go index e67d9d3c..2e641cfa 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -33,6 +33,7 @@ func init() { logs, resourceListCommand, ) + logs.AddCommand(logsList, logsShow, logsClear) testJson.Flags().BoolVarP(&noWrapping, "no-wrapping", "", false, "if set, we won't wrap the output the json in a data tag") testJson.Flags().BoolVarP(&compliant, "compliant", "", false, "if set, we wrap most keys in an attributes tage automatically.")