media.go
author Mikael Berthe <mikael@lilotux.net>
Sat, 15 Apr 2017 21:08:34 +0200
changeset 126 330c4b83f7d3
child 128 a5a00fad7a32
permissions -rw-r--r--
Add UploadMedia()
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
126
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     1
package gondole
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     2
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     3
import (
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     4
	"bytes"
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     5
	"encoding/json"
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     6
	"fmt"
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     7
	"io"
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     8
	"mime/multipart"
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
     9
	"os"
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    10
	"path/filepath"
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    11
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    12
	"github.com/sendgrid/rest"
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    13
)
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    14
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    15
// UploadMedia uploads the given file and returns an attachment
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    16
func (g *Client) UploadMedia(filePath string) (*Attachment, error) {
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    17
	var b bytes.Buffer
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    18
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    19
	if filePath == "" {
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    20
		return nil, ErrInvalidParameter
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    21
	}
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    22
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    23
	f, err := os.Open(filePath)
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    24
	if err != nil {
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    25
		return nil, fmt.Errorf("cannot read file: %s", err.Error())
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    26
	}
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    27
	defer f.Close()
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    28
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    29
	w := multipart.NewWriter(&b)
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    30
	formWriter, err := w.CreateFormFile("file", filepath.Base(filePath))
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    31
	if err != nil {
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    32
		return nil, fmt.Errorf("media upload: cannot create form: %s", err.Error())
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    33
	}
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    34
	if _, err = io.Copy(formWriter, f); err != nil {
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    35
		return nil, fmt.Errorf("media upload: cannot create form: %s", err.Error())
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    36
	}
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    37
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    38
	w.Close()
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    39
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    40
	req := g.prepareRequest("media", rest.Post, nil)
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    41
	req.Headers["Content-Type"] = w.FormDataContentType()
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    42
	req.Body = b.Bytes()
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    43
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    44
	/*
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    45
		reqObj, err := rest.BuildRequestObject(req)
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    46
		if err != nil {
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    47
			return nil, fmt.Errorf("cannot build stream request: %s", err.Error())
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    48
		}
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    49
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    50
		resp, err := rest.MakeRequest(reqObj)
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    51
		if err != nil {
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    52
			return nil, fmt.Errorf("cannot open stream: %s", err.Error())
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    53
		}
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    54
		if resp.StatusCode != 200 {
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    55
			resp.Body.Close()
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    56
			return nil, errors.New(resp.Status)
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    57
		}
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    58
		return resp, nil
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    59
	*/
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    60
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    61
	// Make API call
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    62
	r, err := restAPI(req)
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    63
	if err != nil {
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    64
		return nil, fmt.Errorf("media upload failed: %s", err.Error())
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    65
	}
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    66
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    67
	// Check for error reply
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    68
	var errorResult Error
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    69
	if err := json.Unmarshal([]byte(r.Body), &errorResult); err == nil {
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    70
		// The empty object is not an error
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    71
		if errorResult.Text != "" {
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    72
			return nil, fmt.Errorf("%s", errorResult.Text)
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    73
		}
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    74
	}
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    75
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    76
	// Not an error reply; let's unmarshal the data
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    77
	var attachment Attachment
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    78
	err = json.Unmarshal([]byte(r.Body), &attachment)
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    79
	if err != nil {
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    80
		return nil, fmt.Errorf("cannot decode API response (media): %s", err.Error())
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    81
	}
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    82
	return &attachment, nil
330c4b83f7d3 Add UploadMedia()
Mikael Berthe <mikael@lilotux.net>
parents:
diff changeset
    83
}