1
0
mirror of https://github.com/mainflux/mainflux.git synced 2025-04-28 13:48:49 +08:00

MF-1016 - Add UserUpdate and UpdatePassword to sdk and CLI (#1057)

* MF-1016 - Add UserUpdate and UpdatePassword to sdk and CLI

Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com>

* Update READMEs

Signed-off-by: Manuel Imperiale <manuel.imperiale@gmail.com>
This commit is contained in:
Manuel Imperiale 2020-03-04 18:37:41 +01:00 committed by GitHub
parent 63dc1f69b6
commit 7df2ababc4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 204 additions and 3 deletions

View File

@ -23,6 +23,21 @@ mainflux-cli users create john.doe@email.com password
mainflux-cli users token john.doe@email.com password
```
#### Retrieve User
```
mainflux-cli users get <user_auth_token>
```
#### Update User
```
mainflux-cli users update '{"metadata":{"field1":"value1"}}' <user_auth_token>
```
#### Update User Password
```
mainflux-cli users password <old_password> <password> <user_auth_token>
```
### System Provisioning
#### Create Thing (type Device)
```

View File

@ -4,6 +4,8 @@
package cli
import (
"encoding/json"
mfxsdk "github.com/mainflux/mainflux/sdk/go"
"github.com/spf13/cobra"
)
@ -31,6 +33,25 @@ var cmdUsers = []cobra.Command{
logOK()
},
},
cobra.Command{
Use: "get",
Short: "get <user_auth_token>",
Long: `Returns user object`,
Run: func(cmd *cobra.Command, args []string) {
if len(args) != 1 {
logUsage(cmd.Short)
return
}
u, err := sdk.User(args[0])
if err != nil {
logError(err)
return
}
logJSON(u)
},
},
cobra.Command{
Use: "token",
Short: "token <username> <password>",
@ -54,6 +75,53 @@ var cmdUsers = []cobra.Command{
logCreated(token)
},
},
cobra.Command{
Use: "update",
Short: "update <JSON_string> <user_auth_token>",
Long: `Update user metadata`,
Run: func(cmd *cobra.Command, args []string) {
if len(args) != 2 {
logUsage(cmd.Short)
return
}
var user mfxsdk.User
if err := json.Unmarshal([]byte(args[0]), &user); err != nil {
logError(err)
return
}
if err := sdk.UpdateUser(user, args[1]); err != nil {
logError(err)
return
}
logOK()
},
},
cobra.Command{
Use: "password",
Short: "password <old_password> <password> <user_auth_token>",
Long: `Update user password`,
Run: func(cmd *cobra.Command, args []string) {
if len(args) != 3 {
logUsage(cmd.Short)
return
}
user := mfxsdk.User{
OldPassword: args[0],
Password: args[1],
}
if err := sdk.UpdatePassword(user, args[2]); err != nil {
logError(err)
return
}
logOK()
},
},
}
// NewUsersCmd returns users command.
@ -63,7 +131,7 @@ func NewUsersCmd() *cobra.Command {
Short: "Users management",
Long: `Users management: create accounts and tokens"`,
Run: func(cmd *cobra.Command, args []string) {
logUsage("Usage: users [create | token]")
logUsage("Usage: users [create | get | token | password]")
},
}

View File

@ -41,6 +41,15 @@ func (sdk *MfxSDK) CreateToken(user, pwd string) (string, error)
func (sdk *MfxSDK) CreateUser(user, pwd string) error
CreateUser - create user
func (sdk *MfxSDK) User(pwd string) (user, error)
User - gets user
func (sdk *MfxSDK) UpdateUser(user, pwd string) error
UpdateUser - update user
func (sdk *MfxSDK) UpdatePassword(user, pwd string) error
UpdatePassword - update user password
func (sdk *MfxSDK) DeleteChannel(id, token string) error
DeleteChannel - removes channel

View File

@ -75,8 +75,10 @@ var _ SDK = (*mfSDK)(nil)
// User represents mainflux user its credentials.
type User struct {
Email string `json:"email"`
Password string `json:"password"`
Email string `json:"email"`
Metadata map[string]interface{} `json:"metadata,omitempty"`
Password string `json:"password,omitempty"`
OldPassword string `json:"old_password,omitempty"`
}
// Validate returns an error if user representation is invalid.
@ -143,9 +145,18 @@ type SDK interface {
// CreateUser registers mainflux user.
CreateUser(user User) error
// User returns user object.
User(token string) (User, error)
// CreateToken receives credentials and returns user token.
CreateToken(user User) (string, error)
// UpdateUser updates existing user.
UpdateUser(user User, token string) error
// UpdatePassword updates user password.
UpdatePassword(user User, token string) error
// CreateThing registers new thing and returns its id.
CreateThing(thing Thing, token string) (string, error)

View File

@ -41,6 +41,42 @@ func (sdk mfSDK) CreateUser(user User) error {
return nil
}
func (sdk mfSDK) User(token string) (User, error) {
url := createURL(sdk.baseURL, sdk.usersPrefix, "users")
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return User{}, err
}
resp, err := sdk.sendRequest(req, token, string(CTJSON))
if err != nil {
return User{}, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return User{}, err
}
if resp.StatusCode != http.StatusOK {
switch resp.StatusCode {
case http.StatusForbidden:
return User{}, ErrUnauthorized
default:
return User{}, ErrFetchFailed
}
}
var u User
if err := json.Unmarshal(body, &u); err != nil {
return User{}, err
}
return u, nil
}
func (sdk mfSDK) CreateToken(user User) (string, error) {
data, err := json.Marshal(user)
if err != nil {
@ -78,3 +114,65 @@ func (sdk mfSDK) CreateToken(user User) (string, error) {
return t.Token, nil
}
func (sdk mfSDK) UpdateUser(user User, token string) error {
data, err := json.Marshal(user)
if err != nil {
return ErrInvalidArgs
}
url := createURL(sdk.baseURL, sdk.usersPrefix, "users")
req, err := http.NewRequest(http.MethodPut, url, bytes.NewReader(data))
if err != nil {
return err
}
resp, err := sdk.sendRequest(req, token, string(CTJSON))
if err != nil {
return err
}
if resp.StatusCode != http.StatusOK {
switch resp.StatusCode {
case http.StatusForbidden:
return ErrUnauthorized
default:
return ErrFailedUpdate
}
}
return nil
}
func (sdk mfSDK) UpdatePassword(user User, token string) error {
data, err := json.Marshal(user)
if err != nil {
return ErrInvalidArgs
}
url := createURL(sdk.baseURL, sdk.usersPrefix, "password")
req, err := http.NewRequest(http.MethodPatch, url, bytes.NewReader(data))
if err != nil {
return err
}
resp, err := sdk.sendRequest(req, token, string(CTJSON))
if err != nil {
return err
}
if resp.StatusCode != http.StatusCreated {
switch resp.StatusCode {
case http.StatusBadRequest:
return ErrInvalidArgs
case http.StatusForbidden:
return ErrUnauthorized
default:
return ErrFailedUpdate
}
}
return nil
}