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:
parent
63dc1f69b6
commit
7df2ababc4
@ -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)
|
||||
```
|
||||
|
70
cli/users.go
70
cli/users.go
@ -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]")
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user