package sdk import ( "encoding/json" "fmt" "net/http" "time" "github.com/mainflux/mainflux/pkg/errors" ) const ( usersEndpoint = "users" enableEndpoint = "enable" disableEndpoint = "disable" issueTokenEndpoint = "tokens/issue" refreshTokenEndpoint = "tokens/refresh" membersEndpoint = "members" ) // User represents mainflux user its credentials. type User struct { ID string `json:"id"` Name string `json:"name,omitempty"` Credentials Credentials `json:"credentials"` Tags []string `json:"tags,omitempty"` Owner string `json:"owner,omitempty"` Metadata Metadata `json:"metadata,omitempty"` CreatedAt time.Time `json:"created_at,omitempty"` UpdatedAt time.Time `json:"updated_at,omitempty"` Status string `json:"status,omitempty"` Role string `json:"role,omitempty"` } func (sdk mfSDK) CreateUser(user User, token string) (User, errors.SDKError) { data, err := json.Marshal(user) if err != nil { return User{}, errors.NewSDKError(err) } url := fmt.Sprintf("%s/%s", sdk.usersURL, usersEndpoint) _, body, sdkerr := sdk.processRequest(http.MethodPost, url, token, string(CTJSON), data, http.StatusCreated) if sdkerr != nil { return User{}, sdkerr } user = User{} if err := json.Unmarshal(body, &user); err != nil { return User{}, errors.NewSDKError(err) } return user, nil } func (sdk mfSDK) Users(pm PageMetadata, token string) (UsersPage, errors.SDKError) { url, err := sdk.withQueryParams(sdk.usersURL, usersEndpoint, pm) if err != nil { return UsersPage{}, errors.NewSDKError(err) } _, body, sdkerr := sdk.processRequest(http.MethodGet, url, token, string(CTJSON), nil, http.StatusOK) if sdkerr != nil { return UsersPage{}, sdkerr } var cp UsersPage if err := json.Unmarshal(body, &cp); err != nil { return UsersPage{}, errors.NewSDKError(err) } return cp, nil } func (sdk mfSDK) Members(groupID string, meta PageMetadata, token string) (MembersPage, errors.SDKError) { url, err := sdk.withQueryParams(sdk.usersURL, fmt.Sprintf("%s/%s/%s", groupsEndpoint, groupID, membersEndpoint), meta) if err != nil { return MembersPage{}, errors.NewSDKError(err) } _, body, sdkerr := sdk.processRequest(http.MethodGet, url, token, string(CTJSON), nil, http.StatusOK) if sdkerr != nil { return MembersPage{}, sdkerr } var mp MembersPage if err := json.Unmarshal(body, &mp); err != nil { return MembersPage{}, errors.NewSDKError(err) } return mp, nil } func (sdk mfSDK) User(id, token string) (User, errors.SDKError) { url := fmt.Sprintf("%s/%s/%s", sdk.usersURL, usersEndpoint, id) _, body, sdkerr := sdk.processRequest(http.MethodGet, url, token, string(CTJSON), nil, http.StatusOK) if sdkerr != nil { return User{}, sdkerr } var user User if err := json.Unmarshal(body, &user); err != nil { return User{}, errors.NewSDKError(err) } return user, nil } func (sdk mfSDK) UserProfile(token string) (User, errors.SDKError) { url := fmt.Sprintf("%s/%s/profile", sdk.usersURL, usersEndpoint) _, body, sdkerr := sdk.processRequest(http.MethodGet, url, token, string(CTJSON), nil, http.StatusOK) if sdkerr != nil { return User{}, sdkerr } var user User if err := json.Unmarshal(body, &user); err != nil { return User{}, errors.NewSDKError(err) } return user, nil } func (sdk mfSDK) UpdateUser(user User, token string) (User, errors.SDKError) { data, err := json.Marshal(user) if err != nil { return User{}, errors.NewSDKError(err) } url := fmt.Sprintf("%s/%s/%s", sdk.usersURL, usersEndpoint, user.ID) _, body, sdkerr := sdk.processRequest(http.MethodPatch, url, token, string(CTJSON), data, http.StatusOK) if sdkerr != nil { return User{}, sdkerr } user = User{} if err := json.Unmarshal(body, &user); err != nil { return User{}, errors.NewSDKError(err) } return user, nil } func (sdk mfSDK) UpdateUserTags(user User, token string) (User, errors.SDKError) { data, err := json.Marshal(user) if err != nil { return User{}, errors.NewSDKError(err) } url := fmt.Sprintf("%s/%s/%s/tags", sdk.usersURL, usersEndpoint, user.ID) _, body, sdkerr := sdk.processRequest(http.MethodPatch, url, token, string(CTJSON), data, http.StatusOK) if sdkerr != nil { return User{}, sdkerr } user = User{} if err := json.Unmarshal(body, &user); err != nil { return User{}, errors.NewSDKError(err) } return user, nil } func (sdk mfSDK) UpdateUserIdentity(user User, token string) (User, errors.SDKError) { ucir := updateClientIdentityReq{token: token, id: user.ID, Identity: user.Credentials.Identity} data, err := json.Marshal(ucir) if err != nil { return User{}, errors.NewSDKError(err) } url := fmt.Sprintf("%s/%s/%s/identity", sdk.usersURL, usersEndpoint, user.ID) _, body, sdkerr := sdk.processRequest(http.MethodPatch, url, token, string(CTJSON), data, http.StatusOK) if sdkerr != nil { return User{}, sdkerr } user = User{} if err := json.Unmarshal(body, &user); err != nil { return User{}, errors.NewSDKError(err) } return user, nil } func (sdk mfSDK) UpdatePassword(oldPass, newPass, token string) (User, errors.SDKError) { var ucsr = updateClientSecretReq{OldSecret: oldPass, NewSecret: newPass} data, err := json.Marshal(ucsr) if err != nil { return User{}, errors.NewSDKError(err) } url := fmt.Sprintf("%s/%s/secret", sdk.usersURL, usersEndpoint) _, body, sdkerr := sdk.processRequest(http.MethodPatch, url, token, string(CTJSON), data, http.StatusOK) if sdkerr != nil { return User{}, sdkerr } var user User if err = json.Unmarshal(body, &user); err != nil { return User{}, errors.NewSDKError(err) } return user, nil } func (sdk mfSDK) UpdateUserOwner(user User, token string) (User, errors.SDKError) { data, err := json.Marshal(user) if err != nil { return User{}, errors.NewSDKError(err) } url := fmt.Sprintf("%s/%s/%s/owner", sdk.usersURL, usersEndpoint, user.ID) _, body, sdkerr := sdk.processRequest(http.MethodPatch, url, token, string(CTJSON), data, http.StatusOK) if sdkerr != nil { return User{}, sdkerr } user = User{} if err = json.Unmarshal(body, &user); err != nil { return User{}, errors.NewSDKError(err) } return user, nil } func (sdk mfSDK) EnableUser(id, token string) (User, errors.SDKError) { return sdk.changeClientStatus(token, id, enableEndpoint) } func (sdk mfSDK) DisableUser(id, token string) (User, errors.SDKError) { return sdk.changeClientStatus(token, id, disableEndpoint) } func (sdk mfSDK) changeClientStatus(token, id, status string) (User, errors.SDKError) { url := fmt.Sprintf("%s/%s/%s/%s", sdk.usersURL, usersEndpoint, id, status) _, body, sdkerr := sdk.processRequest(http.MethodPost, url, token, string(CTJSON), nil, http.StatusOK) if sdkerr != nil { return User{}, sdkerr } user := User{} if err := json.Unmarshal(body, &user); err != nil { return User{}, errors.NewSDKError(err) } return user, nil }