Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
243 lines (183 sloc) 5.27 KB
package pubnub
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"github.com/pubnub/go/pnerr"
"github.com/pubnub/go/utils"
)
var emptyPNUpdateUserResponse *PNUpdateUserResponse
const updateUserPath = "/v1/objects/%s/users/%s"
type updateUserBuilder struct {
opts *updateUserOpts
}
func newUpdateUserBuilder(pubnub *PubNub) *updateUserBuilder {
builder := updateUserBuilder{
opts: &updateUserOpts{
pubnub: pubnub,
},
}
return &builder
}
func newUpdateUserBuilderWithContext(pubnub *PubNub,
context Context) *updateUserBuilder {
builder := updateUserBuilder{
opts: &updateUserOpts{
pubnub: pubnub,
ctx: context,
},
}
return &builder
}
// UpdateUserBody is the input to update user
type UpdateUserBody struct {
ID string `json:"id"`
Name string `json:"name"`
ExternalID string `json:"externalId"`
ProfileURL string `json:"profileUrl"`
Email string `json:"email"`
Custom map[string]interface{} `json:"custom"`
}
func (b *updateUserBuilder) Include(include []PNUserSpaceInclude) *updateUserBuilder {
b.opts.Include = EnumArrayToStringArray(include)
return b
}
func (b *updateUserBuilder) ID(id string) *updateUserBuilder {
b.opts.ID = id
return b
}
func (b *updateUserBuilder) Name(name string) *updateUserBuilder {
b.opts.Name = name
return b
}
func (b *updateUserBuilder) ExternalID(externalID string) *updateUserBuilder {
b.opts.ExternalID = externalID
return b
}
func (b *updateUserBuilder) ProfileURL(profileURL string) *updateUserBuilder {
b.opts.ProfileURL = profileURL
return b
}
func (b *updateUserBuilder) Email(email string) *updateUserBuilder {
b.opts.Email = email
return b
}
func (b *updateUserBuilder) Custom(custom map[string]interface{}) *updateUserBuilder {
b.opts.Custom = custom
return b
}
// QueryParam accepts a map, the keys and values of the map are passed as the query string parameters of the URL called by the API.
func (b *updateUserBuilder) QueryParam(queryParam map[string]string) *updateUserBuilder {
b.opts.QueryParam = queryParam
return b
}
// Transport sets the Transport for the updateUser request.
func (b *updateUserBuilder) Transport(tr http.RoundTripper) *updateUserBuilder {
b.opts.Transport = tr
return b
}
// Execute runs the updateUser request.
func (b *updateUserBuilder) Execute() (*PNUpdateUserResponse, StatusResponse, error) {
rawJSON, status, err := executeRequest(b.opts)
if err != nil {
return emptyPNUpdateUserResponse, status, err
}
return newPNUpdateUserResponse(rawJSON, b.opts, status)
}
type updateUserOpts struct {
pubnub *PubNub
Include []string
ID string
Name string
ExternalID string
ProfileURL string
Email string
Custom map[string]interface{}
QueryParam map[string]string
Transport http.RoundTripper
ctx Context
}
func (o *updateUserOpts) config() Config {
return *o.pubnub.Config
}
func (o *updateUserOpts) client() *http.Client {
return o.pubnub.GetClient()
}
func (o *updateUserOpts) context() Context {
return o.ctx
}
func (o *updateUserOpts) validate() error {
if o.config().SubscribeKey == "" {
return newValidationError(o, StrMissingSubKey)
}
return nil
}
func (o *updateUserOpts) buildPath() (string, error) {
return fmt.Sprintf(updateUserPath,
o.pubnub.Config.SubscribeKey, o.ID), nil
}
func (o *updateUserOpts) buildQuery() (*url.Values, error) {
q := defaultQuery(o.pubnub.Config.UUID, o.pubnub.telemetryManager)
if o.Include != nil {
q.Set("include", string(utils.JoinChannels(o.Include)))
}
o.pubnub.tokenManager.SetAuthParan(q, o.ID, PNUsers)
SetQueryParam(q, o.QueryParam)
return q, nil
}
func (o *updateUserOpts) jobQueue() chan *JobQItem {
return o.pubnub.jobQueue
}
func (o *updateUserOpts) buildBody() ([]byte, error) {
b := &UpdateUserBody{
ID: o.ID,
Name: o.Name,
ExternalID: o.ExternalID,
ProfileURL: o.ProfileURL,
Email: o.Email,
Custom: o.Custom,
}
jsonEncBytes, errEnc := json.Marshal(b)
if errEnc != nil {
o.pubnub.Config.Log.Printf("ERROR: Serialization error: %s\n", errEnc.Error())
return []byte{}, errEnc
}
return jsonEncBytes, nil
}
func (o *updateUserOpts) httpMethod() string {
return "PATCH"
}
func (o *updateUserOpts) isAuthRequired() bool {
return true
}
func (o *updateUserOpts) requestTimeout() int {
return o.pubnub.Config.NonSubscribeRequestTimeout
}
func (o *updateUserOpts) connectTimeout() int {
return o.pubnub.Config.ConnectTimeout
}
func (o *updateUserOpts) operationType() OperationType {
return PNUpdateUserOperation
}
func (o *updateUserOpts) telemetryManager() *TelemetryManager {
return o.pubnub.telemetryManager
}
// PNUpdateUserResponse is the Objects API Response for Update user
type PNUpdateUserResponse struct {
status int `json:"status"`
Data PNUser `json:"data"`
}
func newPNUpdateUserResponse(jsonBytes []byte, o *updateUserOpts,
status StatusResponse) (*PNUpdateUserResponse, StatusResponse, error) {
resp := &PNUpdateUserResponse{}
err := json.Unmarshal(jsonBytes, &resp)
if err != nil {
e := pnerr.NewResponseParsingError("Error unmarshalling response",
ioutil.NopCloser(bytes.NewBufferString(string(jsonBytes))), err)
return emptyPNUpdateUserResponse, status, e
}
return resp, status, nil
}
You can’t perform that action at this time.