From cf9d6d83c63d288fd39e1c7e9f06c092c4eb3722 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Wed, 12 Jan 2022 21:51:03 -0500 Subject: [PATCH] impl image upload to imgur --- message/images.go | 64 ++++++++++++++++++++++++++++++++++++++++++ message/images_test.go | 27 ++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 message/images.go create mode 100644 message/images_test.go diff --git a/message/images.go b/message/images.go new file mode 100644 index 0000000..572a8b4 --- /dev/null +++ b/message/images.go @@ -0,0 +1,64 @@ +package message + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "local/truckstop/config" + "mime/multipart" + "net/http" + "time" +) + +func UploadImage(b []byte) (string, error) { + return uploadImage(b) +} + +func uploadImage(b []byte) (string, error) { + buff := bytes.NewBuffer(nil) + writer := multipart.NewWriter(buff) + part, err := writer.CreateFormFile("image", "name") + if err != nil { + return "", err + } + if n, err := part.Write(b); err != nil { + return "", err + } else if n < len(b) { + return "", errors.New("short write") + } + writer.Close() + + images := config.Get().Images + request, err := http.NewRequest( + images.UploadMethod, + images.UploadURI, + buff, + ) + if err != nil { + return "", err + } + request.Header.Set("Authorization", "Bearer "+images.AccessToken) + request.Header.Set("Content-Type", writer.FormDataContentType()) + + c := &http.Client{Timeout: time.Minute} + response, err := c.Do(request) + if err != nil { + return "", err + } + defer response.Body.Close() + b, _ = ioutil.ReadAll(response.Body) + if response.StatusCode != http.StatusOK { + return "", fmt.Errorf("error uploading image: (%d) %s", response.StatusCode, b) + } + var result struct { + Data struct { + Link string `json:"link"` + } `json:"data"` + } + if err := json.Unmarshal(b, &result); err != nil { + return "", err + } + return result.Data.Link, nil +} diff --git a/message/images_test.go b/message/images_test.go new file mode 100644 index 0000000..2756649 --- /dev/null +++ b/message/images_test.go @@ -0,0 +1,27 @@ +package message + +import ( + "io/ioutil" + "local/truckstop/config" + "os" + "testing" +) + +func TestImageUpload(t *testing.T) { + if os.Getenv("INTEGRATION") == "" { + t.Skip("$INTEGRATION not set") + } + os.Setenv("CONFIG", "../config.json") + b, err := ioutil.ReadFile("./testdata/whatever.jpg") + if err != nil { + t.Fatal(err) + } + if err := config.Refresh(); err != nil { + t.Fatal(err) + } + got, err := UploadImage(b) + if err != nil { + t.Fatal(err) + } + t.Log(got) +}