package rest
import (
"bytes"
"encoding/json"
"fmt"
"net/url"
"time"
"github.com/matterbridge/Rocket.Chat.Go.SDK/models"
)
type logoutResponse struct {
Status
Data struct {
Message string `json:"message"`
} `json:"data"`
}
type logonResponse struct {
Status
Data struct {
Token string `json:"authToken"`
UserID string `json:"userID"`
} `json:"data"`
}
type CreateUserResponse struct {
Status
User struct {
ID string `json:"_id"`
CreatedAt time.Time `json:"createdAt"`
Services struct {
Password struct {
Bcrypt string `json:"bcrypt"`
} `json:"password"`
} `json:"services"`
Username string `json:"username"`
Emails []struct {
Address string `json:"address"`
Verified bool `json:"verified"`
} `json:"emails"`
Type string `json:"type"`
Status string `json:"status"`
Active bool `json:"active"`
Roles []string `json:"roles"`
UpdatedAt time.Time `json:"_updatedAt"`
Name string `json:"name"`
CustomFields map[string]string `json:"customFields"`
} `json:"user"`
}
// Login a user. The Email and the Password are mandatory. The auth token of the user is stored in the Client instance.
//
// https://rocket.chat/docs/developer-guides/rest-api/authentication/login
func (c *Client) Login(credentials *models.UserCredentials) error {
if c.auth != nil {
return nil
}
if credentials.ID != "" && credentials.Token != "" {
c.auth = &authInfo{id: credentials.ID, token: credentials.Token}
return nil
}
response := new(logonResponse)
data := url.Values{"user": {credentials.Email}, "password": {credentials.Password}}
if err := c.PostForm("login", data, response); err != nil {
return err
}
c.auth = &authInfo{id: response.Data.UserID, token: response.Data.Token}
credentials.ID, credentials.Token = response.Data.UserID, response.Data.Token
return nil
}
// CreateToken creates an access token for a user
//
// https://rocket.chat/docs/developer-guides/rest-api/users/createtoken/
func (c *Client) CreateToken(userID, username string) (*models.UserCredentials, error) {
response := new(logonResponse)
data := url.Values{"userId": {userID}, "username": {username}}
if err := c.PostForm("users.createToken", data, response); err != nil {
return nil, err
}
credentials := &models.UserCredentials{}
credentials.ID, credentials.Token = response.Data.UserID, response.Data.Token
return credentials, nil
}
// Logout a user. The function returns the response message of the server.
//
// https://rocket.chat/docs/developer-guides/rest-api/authentication/logout
func (c *Client) Logout() (string, error) {
if c.auth == nil {
return "Was not logged in", nil
}
response := new(logoutResponse)
if err := c.Get("logout", nil, response); err != nil {
return "", err
}
return response.Data.Message, nil
}
// CreateUser being logged in with a user that has permission to do so.
//
// https://rocket.chat/docs/developer-guides/rest-api/users/create
func (c *Client) CreateUser(req *models.CreateUserRequest) (*CreateUserResponse, error) {
body, err := json.Marshal(req)
if err != nil {
return nil, err
}
response := new(CreateUserResponse)
err = c.Post("users.create", bytes.NewBuffer(body), response)
return response, err
}
// UpdateUser updates a user's data being logged in with a user that has permission to do so.
//
// https://rocket.chat/docs/developer-guides/rest-api/users/update/
func (c *Client) UpdateUser(req *models.UpdateUserRequest) (*CreateUserResponse, error) {
body, err := json.Marshal(req)
if err != nil {
return nil, err
}
response := new(CreateUserResponse)
err = c.Post("users.update", bytes.NewBuffer(body), response)
return response, err
}
// SetUserAvatar updates a user's avatar being logged in with a user that has permission to do so.
// Currently only passing an URL is possible.
//
// https://rocket.chat/docs/developer-guides/rest-api/users/setavatar/
func (c *Client) SetUserAvatar(userID, username, avatarURL string) (*Status, error) {
body := fmt.Sprintf(`{ "userId": "%s","username": "%s","avatarUrl":"%s"}`, userID, username, avatarURL)
response := new(Status)
err := c.Post("users.setAvatar", bytes.NewBufferString(body), response)
return response, err
}