account.go
author Mikael Berthe <mikael@lilotux.net>
Sat, 29 Apr 2017 17:27:15 +0200
changeset 156 70aadba26338
parent 155 0c581e0108da
child 159 408aa794d9bb
permissions -rw-r--r--
Add field "All" to LimitParams, change Limit behaviour If All is true, the library will send several requests (if needed) until the API server has sent all the results. If not, and if a Limit is set, the library will try to fetch at least this number of results.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
130
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 125
diff changeset
     1
/*
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 125
diff changeset
     2
Copyright 2017 Mikael Berthe
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 125
diff changeset
     3
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 125
diff changeset
     4
Licensed under the MIT license.  Please see the LICENSE file is this directory.
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 125
diff changeset
     5
*/
c450bb73f59a Update credits
Mikael Berthe <mikael@lilotux.net>
parents: 125
diff changeset
     6
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
     7
package madon
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
     8
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
     9
import (
143
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    10
	"bytes"
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    11
	"encoding/base64"
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    12
	"encoding/json"
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    13
	"fmt"
143
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    14
	"mime/multipart"
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    15
	"net/http"
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    16
	"os"
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    17
	"strconv"
143
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
    18
	"strings"
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    19
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    20
	"github.com/sendgrid/rest"
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    21
)
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    22
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    23
// getAccountsOptions contains option fields for POST and DELETE API calls
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    24
type getAccountsOptions struct {
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    25
	// The ID is used for most commands
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    26
	ID int
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    27
149
5f922977d7c7 Add support for limits and paging ({since,max}_id) API parameters
Mikael Berthe <mikael@lilotux.net>
parents: 143
diff changeset
    28
	// The Q field (query) is used when searching for accounts
5f922977d7c7 Add support for limits and paging ({since,max}_id) API parameters
Mikael Berthe <mikael@lilotux.net>
parents: 143
diff changeset
    29
	Q string
5f922977d7c7 Add support for limits and paging ({since,max}_id) API parameters
Mikael Berthe <mikael@lilotux.net>
parents: 143
diff changeset
    30
5f922977d7c7 Add support for limits and paging ({since,max}_id) API parameters
Mikael Berthe <mikael@lilotux.net>
parents: 143
diff changeset
    31
	Limit *LimitParams
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    32
}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    33
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    34
// getSingleAccount returns an account entity
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
    35
// The operation 'op' can be "account", "verify_credentials", "follow",
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
    36
// "unfollow", "block", "unblock", "mute", "unmute",
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
    37
// "follow_requests/authorize" or // "follow_requests/reject".
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
    38
// The id is optional and depends on the operation.
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
    39
func (mc *Client) getSingleAccount(op string, id int) (*Account, error) {
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    40
	var endPoint string
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    41
	method := rest.Get
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    42
	strID := strconv.Itoa(id)
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    43
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
    44
	switch op {
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    45
	case "account":
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    46
		endPoint = "accounts/" + strID
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    47
	case "verify_credentials":
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    48
		endPoint = "accounts/verify_credentials"
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    49
	case "follow", "unfollow", "block", "unblock", "mute", "unmute":
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
    50
		endPoint = "accounts/" + strID + "/" + op
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    51
		method = rest.Post
115
0684ac8b6634 Add FollowRequestAuthorize()
Mikael Berthe <mikael@lilotux.net>
parents: 114
diff changeset
    52
	case "follow_requests/authorize", "follow_requests/reject":
0684ac8b6634 Add FollowRequestAuthorize()
Mikael Berthe <mikael@lilotux.net>
parents: 114
diff changeset
    53
		// The documentation is incorrect, the endpoint actually
0684ac8b6634 Add FollowRequestAuthorize()
Mikael Berthe <mikael@lilotux.net>
parents: 114
diff changeset
    54
		// is "follow_requests/:id/{authorize|reject}"
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
    55
		endPoint = op[:16] + strID + "/" + op[16:]
115
0684ac8b6634 Add FollowRequestAuthorize()
Mikael Berthe <mikael@lilotux.net>
parents: 114
diff changeset
    56
		method = rest.Post
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    57
	default:
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    58
		return nil, ErrInvalidParameter
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    59
	}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    60
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    61
	var account Account
155
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
    62
	if err := mc.apiCall(endPoint, method, nil, nil, nil, &account); err != nil {
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
    63
		return nil, err
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    64
	}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    65
	return &account, nil
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    66
}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    67
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    68
// getMultipleAccounts returns a list of account entities
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
    69
// The operation 'op' can be "followers", "following", "search", "blocks",
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
    70
// "mutes", "follow_requests".
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
    71
// The id is optional and depends on the operation.
156
70aadba26338 Add field "All" to LimitParams, change Limit behaviour
Mikael Berthe <mikael@lilotux.net>
parents: 155
diff changeset
    72
// If opts.All is true, several requests will be made until the API server
70aadba26338 Add field "All" to LimitParams, change Limit behaviour
Mikael Berthe <mikael@lilotux.net>
parents: 155
diff changeset
    73
// has nothing to return.
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
    74
func (mc *Client) getMultipleAccounts(op string, opts *getAccountsOptions) ([]Account, error) {
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    75
	var endPoint string
149
5f922977d7c7 Add support for limits and paging ({since,max}_id) API parameters
Mikael Berthe <mikael@lilotux.net>
parents: 143
diff changeset
    76
	var lopt *LimitParams
5f922977d7c7 Add support for limits and paging ({since,max}_id) API parameters
Mikael Berthe <mikael@lilotux.net>
parents: 143
diff changeset
    77
5f922977d7c7 Add support for limits and paging ({since,max}_id) API parameters
Mikael Berthe <mikael@lilotux.net>
parents: 143
diff changeset
    78
	if opts != nil {
5f922977d7c7 Add support for limits and paging ({since,max}_id) API parameters
Mikael Berthe <mikael@lilotux.net>
parents: 143
diff changeset
    79
		lopt = opts.Limit
5f922977d7c7 Add support for limits and paging ({since,max}_id) API parameters
Mikael Berthe <mikael@lilotux.net>
parents: 143
diff changeset
    80
	}
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
    81
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
    82
	switch op {
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    83
	case "followers", "following":
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    84
		if opts == nil || opts.ID < 1 {
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    85
			return []Account{}, ErrInvalidID
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    86
		}
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
    87
		endPoint = "accounts/" + strconv.Itoa(opts.ID) + "/" + op
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    88
	case "follow_requests", "blocks", "mutes":
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
    89
		endPoint = op
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    90
	case "search":
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    91
		if opts == nil || opts.Q == "" {
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    92
			return []Account{}, ErrInvalidParameter
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
    93
		}
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
    94
		endPoint = "accounts/" + op
155
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
    95
	case "reblogged_by", "favourited_by":
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
    96
		if opts == nil || opts.ID < 1 {
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
    97
			return []Account{}, ErrInvalidID
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
    98
		}
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
    99
		endPoint = "statuses/" + strconv.Itoa(opts.ID) + "/" + op
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   100
	default:
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   101
		return nil, ErrInvalidParameter
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   102
	}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   103
114
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   104
	// Handle target-specific query parameters
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
   105
	params := make(apiCallParams)
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
   106
	if op == "search" {
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
   107
		params["q"] = opts.Q
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   108
	}
114
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   109
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   110
	var accounts []Account
155
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   111
	var links apiLinks
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   112
	if err := mc.apiCall(endPoint, rest.Get, params, lopt, &links, &accounts); err != nil {
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
   113
		return nil, err
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   114
	}
155
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   115
	if lopt != nil { // Fetch more pages to reach our limit
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   116
		var accountSlice []Account
156
70aadba26338 Add field "All" to LimitParams, change Limit behaviour
Mikael Berthe <mikael@lilotux.net>
parents: 155
diff changeset
   117
		for (lopt.All || lopt.Limit > len(accounts)) && links.next != nil {
155
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   118
			newlopt := links.next
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   119
			links = apiLinks{}
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   120
			if err := mc.apiCall(endPoint, rest.Get, params, newlopt, &links, &accountSlice); err != nil {
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   121
				return nil, err
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   122
			}
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   123
			accounts = append(accounts, accountSlice...)
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   124
			accountSlice = accountSlice[:0] // Clear struct
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   125
		}
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   126
	}
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   127
	return accounts, nil
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   128
}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   129
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   130
// GetAccount returns an account entity
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   131
// The returned value can be nil if there is an error or if the
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   132
// requested ID does not exist.
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   133
func (mc *Client) GetAccount(accountID int) (*Account, error) {
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   134
	account, err := mc.getSingleAccount("account", accountID)
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   135
	if err != nil {
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   136
		return nil, err
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   137
	}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   138
	if account != nil && account.ID == 0 {
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   139
		return nil, ErrEntityNotFound
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   140
	}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   141
	return account, nil
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   142
}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   143
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   144
// GetCurrentAccount returns the current user account
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   145
func (mc *Client) GetCurrentAccount() (*Account, error) {
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   146
	account, err := mc.getSingleAccount("verify_credentials", 0)
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   147
	if err != nil {
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   148
		return nil, err
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   149
	}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   150
	if account != nil && account.ID == 0 {
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   151
		return nil, ErrEntityNotFound
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   152
	}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   153
	return account, nil
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   154
}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   155
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   156
// GetAccountFollowers returns the list of accounts following a given account
149
5f922977d7c7 Add support for limits and paging ({since,max}_id) API parameters
Mikael Berthe <mikael@lilotux.net>
parents: 143
diff changeset
   157
func (mc *Client) GetAccountFollowers(accountID int, lopt *LimitParams) ([]Account, error) {
152
d9e73e9df9c6 Fix unused limit options
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
   158
	o := &getAccountsOptions{ID: accountID, Limit: lopt}
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   159
	return mc.getMultipleAccounts("followers", o)
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   160
}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   161
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   162
// GetAccountFollowing returns the list of accounts a given account is following
149
5f922977d7c7 Add support for limits and paging ({since,max}_id) API parameters
Mikael Berthe <mikael@lilotux.net>
parents: 143
diff changeset
   163
func (mc *Client) GetAccountFollowing(accountID int, lopt *LimitParams) ([]Account, error) {
152
d9e73e9df9c6 Fix unused limit options
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
   164
	o := &getAccountsOptions{ID: accountID, Limit: lopt}
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   165
	return mc.getMultipleAccounts("following", o)
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   166
}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   167
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   168
// FollowAccount follows an account
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   169
func (mc *Client) FollowAccount(accountID int) error {
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   170
	account, err := mc.getSingleAccount("follow", accountID)
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   171
	if err != nil {
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   172
		return err
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   173
	}
132
639bbcddb4fe Make identifiers less ambiguous
Mikael Berthe <mikael@lilotux.net>
parents: 130
diff changeset
   174
	if account != nil && account.ID != accountID {
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   175
		return ErrEntityNotFound
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   176
	}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   177
	return nil
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   178
}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   179
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   180
// UnfollowAccount unfollows an account
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   181
func (mc *Client) UnfollowAccount(accountID int) error {
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   182
	account, err := mc.getSingleAccount("unfollow", accountID)
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   183
	if err != nil {
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   184
		return err
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   185
	}
132
639bbcddb4fe Make identifiers less ambiguous
Mikael Berthe <mikael@lilotux.net>
parents: 130
diff changeset
   186
	if account != nil && account.ID != accountID {
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   187
		return ErrEntityNotFound
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   188
	}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   189
	return nil
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   190
}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   191
111
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   192
// FollowRemoteAccount follows a remote account
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   193
// The parameter 'uri' is a URI (e.mc. "username@domain").
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   194
func (mc *Client) FollowRemoteAccount(uri string) (*Account, error) {
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
   195
	if uri == "" {
111
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   196
		return nil, ErrInvalidID
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   197
	}
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   198
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
   199
	params := make(apiCallParams)
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
   200
	params["uri"] = uri
111
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   201
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   202
	var account Account
155
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   203
	if err := mc.apiCall("follows", rest.Post, params, nil, nil, &account); err != nil {
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
   204
		return nil, err
111
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   205
	}
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   206
	if account.ID == 0 {
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   207
		return nil, ErrEntityNotFound
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   208
	}
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   209
	return &account, nil
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   210
}
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   211
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   212
// BlockAccount blocks an account
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   213
func (mc *Client) BlockAccount(accountID int) error {
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   214
	account, err := mc.getSingleAccount("block", accountID)
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   215
	if err != nil {
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   216
		return err
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   217
	}
132
639bbcddb4fe Make identifiers less ambiguous
Mikael Berthe <mikael@lilotux.net>
parents: 130
diff changeset
   218
	if account != nil && account.ID != accountID {
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   219
		return ErrEntityNotFound
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   220
	}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   221
	return nil
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   222
}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   223
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   224
// UnblockAccount unblocks an account
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   225
func (mc *Client) UnblockAccount(accountID int) error {
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   226
	account, err := mc.getSingleAccount("unblock", accountID)
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   227
	if err != nil {
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   228
		return err
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   229
	}
132
639bbcddb4fe Make identifiers less ambiguous
Mikael Berthe <mikael@lilotux.net>
parents: 130
diff changeset
   230
	if account != nil && account.ID != accountID {
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   231
		return ErrEntityNotFound
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   232
	}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   233
	return nil
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   234
}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   235
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   236
// MuteAccount mutes an account
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   237
func (mc *Client) MuteAccount(accountID int) error {
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   238
	account, err := mc.getSingleAccount("mute", accountID)
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   239
	if err != nil {
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   240
		return err
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   241
	}
132
639bbcddb4fe Make identifiers less ambiguous
Mikael Berthe <mikael@lilotux.net>
parents: 130
diff changeset
   242
	if account != nil && account.ID != accountID {
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   243
		return ErrEntityNotFound
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   244
	}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   245
	return nil
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   246
}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   247
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   248
// UnmuteAccount unmutes an account
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   249
func (mc *Client) UnmuteAccount(accountID int) error {
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   250
	account, err := mc.getSingleAccount("unmute", accountID)
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   251
	if err != nil {
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   252
		return err
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   253
	}
132
639bbcddb4fe Make identifiers less ambiguous
Mikael Berthe <mikael@lilotux.net>
parents: 130
diff changeset
   254
	if account != nil && account.ID != accountID {
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   255
		return ErrEntityNotFound
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   256
	}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   257
	return nil
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   258
}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   259
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   260
// SearchAccounts returns a list of accounts matching the query string
149
5f922977d7c7 Add support for limits and paging ({since,max}_id) API parameters
Mikael Berthe <mikael@lilotux.net>
parents: 143
diff changeset
   261
// The lopt parameter is optional (can be nil) or can be used to set a limit.
5f922977d7c7 Add support for limits and paging ({since,max}_id) API parameters
Mikael Berthe <mikael@lilotux.net>
parents: 143
diff changeset
   262
func (mc *Client) SearchAccounts(query string, lopt *LimitParams) ([]Account, error) {
5f922977d7c7 Add support for limits and paging ({since,max}_id) API parameters
Mikael Berthe <mikael@lilotux.net>
parents: 143
diff changeset
   263
	o := &getAccountsOptions{Q: query, Limit: lopt}
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   264
	return mc.getMultipleAccounts("search", o)
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   265
}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   266
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   267
// GetBlockedAccounts returns the list of blocked accounts
152
d9e73e9df9c6 Fix unused limit options
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
   268
// The lopt parameter is optional (can be nil).
149
5f922977d7c7 Add support for limits and paging ({since,max}_id) API parameters
Mikael Berthe <mikael@lilotux.net>
parents: 143
diff changeset
   269
func (mc *Client) GetBlockedAccounts(lopt *LimitParams) ([]Account, error) {
152
d9e73e9df9c6 Fix unused limit options
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
   270
	o := &getAccountsOptions{Limit: lopt}
d9e73e9df9c6 Fix unused limit options
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
   271
	return mc.getMultipleAccounts("blocks", o)
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   272
}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   273
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   274
// GetMutedAccounts returns the list of muted accounts
152
d9e73e9df9c6 Fix unused limit options
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
   275
// The lopt parameter is optional (can be nil).
149
5f922977d7c7 Add support for limits and paging ({since,max}_id) API parameters
Mikael Berthe <mikael@lilotux.net>
parents: 143
diff changeset
   276
func (mc *Client) GetMutedAccounts(lopt *LimitParams) ([]Account, error) {
152
d9e73e9df9c6 Fix unused limit options
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
   277
	o := &getAccountsOptions{Limit: lopt}
d9e73e9df9c6 Fix unused limit options
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
   278
	return mc.getMultipleAccounts("mutes", o)
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   279
}
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   280
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   281
// GetAccountFollowRequests returns the list of follow requests accounts
152
d9e73e9df9c6 Fix unused limit options
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
   282
// The lopt parameter is optional (can be nil).
149
5f922977d7c7 Add support for limits and paging ({since,max}_id) API parameters
Mikael Berthe <mikael@lilotux.net>
parents: 143
diff changeset
   283
func (mc *Client) GetAccountFollowRequests(lopt *LimitParams) ([]Account, error) {
152
d9e73e9df9c6 Fix unused limit options
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
   284
	o := &getAccountsOptions{Limit: lopt}
d9e73e9df9c6 Fix unused limit options
Mikael Berthe <mikael@lilotux.net>
parents: 149
diff changeset
   285
	return mc.getMultipleAccounts("follow_requests", o)
109
37de1a30f465 Add account-related API calls
Mikael Berthe <mikael@lilotux.net>
parents: 8
diff changeset
   286
}
111
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   287
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   288
// GetAccountRelationships returns a list of relationship entities for the given accounts
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   289
func (mc *Client) GetAccountRelationships(accountIDs []int) ([]Relationship, error) {
111
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   290
	if len(accountIDs) < 1 {
114
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   291
		return nil, ErrInvalidID
111
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   292
	}
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   293
125
2bbb72b9ebf6 Rework the API wrappers to handle arrays of parameters
Mikael Berthe <mikael@lilotux.net>
parents: 120
diff changeset
   294
	params := make(apiCallParams)
2bbb72b9ebf6 Rework the API wrappers to handle arrays of parameters
Mikael Berthe <mikael@lilotux.net>
parents: 120
diff changeset
   295
	for i, id := range accountIDs {
134
588edbc9e14b Add checks on ID list values
Mikael Berthe <mikael@lilotux.net>
parents: 132
diff changeset
   296
		if id < 1 {
588edbc9e14b Add checks on ID list values
Mikael Berthe <mikael@lilotux.net>
parents: 132
diff changeset
   297
			return nil, ErrInvalidID
588edbc9e14b Add checks on ID list values
Mikael Berthe <mikael@lilotux.net>
parents: 132
diff changeset
   298
		}
125
2bbb72b9ebf6 Rework the API wrappers to handle arrays of parameters
Mikael Berthe <mikael@lilotux.net>
parents: 120
diff changeset
   299
		qID := fmt.Sprintf("id[%d]", i+1)
2bbb72b9ebf6 Rework the API wrappers to handle arrays of parameters
Mikael Berthe <mikael@lilotux.net>
parents: 120
diff changeset
   300
		params[qID] = strconv.Itoa(id)
111
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   301
	}
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
   302
114
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   303
	var rl []Relationship
155
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   304
	if err := mc.apiCall("accounts/relationships", rest.Get, params, nil, nil, &rl); err != nil {
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
   305
		return nil, err
111
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   306
	}
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   307
	return rl, nil
fc7cd6c90b2e Add FollowRemoteAccount() and GetAccountRelationships()
Mikael Berthe <mikael@lilotux.net>
parents: 110
diff changeset
   308
}
114
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   309
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   310
// GetAccountStatuses returns a list of status entities for the given account
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   311
// If onlyMedia is true, returns only statuses that have media attachments.
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   312
// If excludeReplies is true, skip statuses that reply to other statuses.
156
70aadba26338 Add field "All" to LimitParams, change Limit behaviour
Mikael Berthe <mikael@lilotux.net>
parents: 155
diff changeset
   313
// If lopt.All is true, several requests will be made until the API server
70aadba26338 Add field "All" to LimitParams, change Limit behaviour
Mikael Berthe <mikael@lilotux.net>
parents: 155
diff changeset
   314
// has nothing to return.
70aadba26338 Add field "All" to LimitParams, change Limit behaviour
Mikael Berthe <mikael@lilotux.net>
parents: 155
diff changeset
   315
// If lopt.Limit is set (and not All), several queries can be made until the
70aadba26338 Add field "All" to LimitParams, change Limit behaviour
Mikael Berthe <mikael@lilotux.net>
parents: 155
diff changeset
   316
// limit is reached.
149
5f922977d7c7 Add support for limits and paging ({since,max}_id) API parameters
Mikael Berthe <mikael@lilotux.net>
parents: 143
diff changeset
   317
func (mc *Client) GetAccountStatuses(accountID int, onlyMedia, excludeReplies bool, lopt *LimitParams) ([]Status, error) {
114
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   318
	if accountID < 1 {
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   319
		return nil, ErrInvalidID
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   320
	}
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   321
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   322
	endPoint := "accounts/" + strconv.Itoa(accountID) + "/" + "statuses"
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
   323
	params := make(apiCallParams)
114
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   324
	if onlyMedia {
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
   325
		params["only_media"] = "true"
114
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   326
	}
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   327
	if excludeReplies {
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
   328
		params["exclude_replies"] = "true"
114
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   329
	}
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   330
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   331
	var sl []Status
155
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   332
	var links apiLinks
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   333
	if err := mc.apiCall(endPoint, rest.Get, params, lopt, &links, &sl); err != nil {
120
579912e9d0ef Refactor API calls
Mikael Berthe <mikael@lilotux.net>
parents: 115
diff changeset
   334
		return nil, err
114
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   335
	}
155
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   336
	if lopt != nil { // Fetch more pages to reach our limit
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   337
		var statusSlice []Status
156
70aadba26338 Add field "All" to LimitParams, change Limit behaviour
Mikael Berthe <mikael@lilotux.net>
parents: 155
diff changeset
   338
		for (lopt.All || lopt.Limit > len(sl)) && links.next != nil {
155
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   339
			newlopt := links.next
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   340
			links = apiLinks{}
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   341
			if err := mc.apiCall(endPoint, rest.Get, params, newlopt, &links, &statusSlice); err != nil {
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   342
				return nil, err
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   343
			}
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   344
			sl = append(sl, statusSlice...)
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   345
			statusSlice = statusSlice[:0] // Clear struct
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   346
		}
0c581e0108da Use links from headers
Mikael Berthe <mikael@lilotux.net>
parents: 152
diff changeset
   347
	}
114
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   348
	return sl, nil
0a1f493588ee Add GetAccountStatuses()
Mikael Berthe <mikael@lilotux.net>
parents: 111
diff changeset
   349
}
115
0684ac8b6634 Add FollowRequestAuthorize()
Mikael Berthe <mikael@lilotux.net>
parents: 114
diff changeset
   350
0684ac8b6634 Add FollowRequestAuthorize()
Mikael Berthe <mikael@lilotux.net>
parents: 114
diff changeset
   351
// FollowRequestAuthorize authorizes or rejects an account follow-request
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   352
func (mc *Client) FollowRequestAuthorize(accountID int, authorize bool) error {
115
0684ac8b6634 Add FollowRequestAuthorize()
Mikael Berthe <mikael@lilotux.net>
parents: 114
diff changeset
   353
	endPoint := "follow_requests/reject"
0684ac8b6634 Add FollowRequestAuthorize()
Mikael Berthe <mikael@lilotux.net>
parents: 114
diff changeset
   354
	if authorize {
0684ac8b6634 Add FollowRequestAuthorize()
Mikael Berthe <mikael@lilotux.net>
parents: 114
diff changeset
   355
		endPoint = "follow_requests/authorize"
0684ac8b6634 Add FollowRequestAuthorize()
Mikael Berthe <mikael@lilotux.net>
parents: 114
diff changeset
   356
	}
138
23d3a518d0ad Update package name in source files
Mikael Berthe <mikael@lilotux.net>
parents: 134
diff changeset
   357
	_, err := mc.getSingleAccount(endPoint, accountID)
115
0684ac8b6634 Add FollowRequestAuthorize()
Mikael Berthe <mikael@lilotux.net>
parents: 114
diff changeset
   358
	return err
0684ac8b6634 Add FollowRequestAuthorize()
Mikael Berthe <mikael@lilotux.net>
parents: 114
diff changeset
   359
}
143
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   360
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   361
// UpdateAccount updates the connected user's account data
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   362
// The fields avatar & headerImage can contain base64-encoded images; if
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   363
// they do not (that is; if they don't contain ";base64,"), they are considered
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   364
// as file paths and their content will be encoded.
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   365
// All fields can be nil, in which case they are not updated.
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   366
// displayName and note can be set to "" to delete previous values;
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   367
// I'm not sure images can be deleted -- only replaced AFAICS.
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   368
func (mc *Client) UpdateAccount(displayName, note, avatar, headerImage *string) (*Account, error) {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   369
	const endPoint = "accounts/update_credentials"
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   370
	params := make(apiCallParams)
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   371
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   372
	if displayName != nil {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   373
		params["display_name"] = *displayName
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   374
	}
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   375
	if note != nil {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   376
		params["note"] = *note
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   377
	}
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   378
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   379
	var err error
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   380
	avatar, err = fileToBase64(avatar, nil)
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   381
	if err != nil {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   382
		return nil, err
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   383
	}
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   384
	headerImage, err = fileToBase64(headerImage, nil)
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   385
	if err != nil {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   386
		return nil, err
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   387
	}
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   388
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   389
	var formBuf bytes.Buffer
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   390
	w := multipart.NewWriter(&formBuf)
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   391
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   392
	if avatar != nil {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   393
		w.WriteField("avatar", *avatar)
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   394
	}
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   395
	if headerImage != nil {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   396
		w.WriteField("header", *headerImage)
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   397
	}
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   398
	w.Close()
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   399
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   400
	// Prepare the request
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   401
	req, err := mc.prepareRequest(endPoint, rest.Patch, params)
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   402
	if err != nil {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   403
		return nil, fmt.Errorf("prepareRequest failed: %s", err.Error())
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   404
	}
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   405
	req.Headers["Content-Type"] = w.FormDataContentType()
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   406
	req.Body = formBuf.Bytes()
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   407
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   408
	// Make API call
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   409
	r, err := restAPI(req)
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   410
	if err != nil {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   411
		return nil, fmt.Errorf("account update failed: %s", err.Error())
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   412
	}
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   413
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   414
	// Check for error reply
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   415
	var errorResult Error
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   416
	if err := json.Unmarshal([]byte(r.Body), &errorResult); err == nil {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   417
		// The empty object is not an error
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   418
		if errorResult.Text != "" {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   419
			return nil, fmt.Errorf("%s", errorResult.Text)
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   420
		}
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   421
	}
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   422
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   423
	// Not an error reply; let's unmarshal the data
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   424
	var account Account
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   425
	if err := json.Unmarshal([]byte(r.Body), &account); err != nil {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   426
		return nil, fmt.Errorf("cannot decode API response: %s", err.Error())
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   427
	}
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   428
	return &account, nil
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   429
}
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   430
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   431
// fileToBase64 is a helper function to convert a file's contents to
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   432
// base64-encoded data.  Is the data string already contains base64 data, it
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   433
// is not modified.
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   434
// If contentType is nil, it is detected.
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   435
func fileToBase64(data, contentType *string) (*string, error) {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   436
	if data == nil {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   437
		return nil, nil
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   438
	}
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   439
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   440
	if *data == "" {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   441
		return data, nil
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   442
	}
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   443
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   444
	if strings.Contains(*data, ";base64,") {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   445
		return data, nil
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   446
	}
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   447
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   448
	// We need to convert the file and file name to base64
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   449
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   450
	file, err := os.Open(*data)
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   451
	if err != nil {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   452
		return nil, err
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   453
	}
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   454
	defer file.Close()
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   455
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   456
	fStat, err := file.Stat()
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   457
	if err != nil {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   458
		return nil, err
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   459
	}
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   460
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   461
	buffer := make([]byte, fStat.Size())
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   462
	_, err = file.Read(buffer)
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   463
	if err != nil {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   464
		return nil, err
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   465
	}
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   466
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   467
	var cType string
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   468
	if contentType == nil || *contentType == "" {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   469
		cType = http.DetectContentType(buffer[:512])
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   470
	} else {
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   471
		cType = *contentType
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   472
	}
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   473
	contentData := base64.StdEncoding.EncodeToString(buffer)
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   474
	newData := "data:" + cType + ";base64," + contentData
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   475
	return &newData, nil
9ce9b39c851c Add UpdateAccount()
Mikael Berthe <mikael@lilotux.net>
parents: 138
diff changeset
   476
}