Skip to content

Commit

Permalink
Added sdk and cli support
Browse files Browse the repository at this point in the history
Signed-off-by: nyagamunene <[email protected]>
  • Loading branch information
nyagamunene committed Jun 27, 2024
1 parent 5422966 commit ee8be04
Show file tree
Hide file tree
Showing 8 changed files with 209 additions and 0 deletions.
43 changes: 43 additions & 0 deletions cli/channels.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ package cli

import (
"encoding/json"
"fmt"
"net/url"
"strconv"

mgxsdk "github.com/absmach/magistrala/pkg/sdk/go"
"github.com/spf13/cobra"
Expand Down Expand Up @@ -208,6 +211,46 @@ var cmdChannels = []cobra.Command{
logJSON(ul)
},
},
{
Use: "search <query> <user_auth_token>",
Short: "Search channels",
Long: "Search channels by name, id or tags\n" +
"Usage:\n" +
"\tmagistrala-cli channels search <query> <user_auth_token>\n",
Run: func(cmd *cobra.Command, args []string) {
if len(args) != 2 {
logUsage(cmd.Use)
return
}

values, err := url.ParseQuery(args[0])
if err != nil {
logError(fmt.Errorf("Failed to parse query: %s", err))
}

pm := mgxsdk.PageMetadata{
Name: values.Get("name"),
Tag: values.Get("tags"),
Identity: values.Get("id"),
}

if off, err := strconv.Atoi(values.Get("offset")); err == nil {
pm.Offset = uint64(off)
}

if lim, err := strconv.Atoi(values.Get("limit")); err == nil {
pm.Limit = uint64(lim)
}

channels, err := sdk.SearchChannels(pm, args[1])
if err != nil {
logError(err)
return
}

logJSON(channels)
},
},
{
Use: "groups <channel_id> <user_auth_token>",
Short: "List groups",
Expand Down
41 changes: 41 additions & 0 deletions cli/groups.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ package cli

import (
"encoding/json"
"fmt"
"net/url"
"strconv"

mgclients "github.com/absmach/magistrala/pkg/clients"
mgxsdk "github.com/absmach/magistrala/pkg/sdk/go"
Expand Down Expand Up @@ -249,6 +252,44 @@ var cmdGroups = []cobra.Command{
logJSON(group)
},
},
{
Use: "search <query> <user_auth_token>",
Short: "Search groups",
Long: "Search groups by name, id or tags\n" +
"Usage:\n" +
"\tmagistrala-cli groups search <query> <user_auth_token>\n",
Run: func(cmd *cobra.Command, args []string) {
if len(args) != 2 {
logUsage(cmd.Use)
return
}

values, err := url.ParseQuery(args[0])
if err != nil {
logError(fmt.Errorf("Failed to parse query: %s", err))
}

pm := mgxsdk.PageMetadata{
Name: values.Get("name"),
Tag: values.Get("tags"),
Identity: values.Get("id"),
}

if off, err := strconv.Atoi(values.Get("offset")); err == nil {
pm.Offset = uint64(off)
}

if lim, err := strconv.Atoi(values.Get("limit")); err == nil {
pm.Limit = uint64(lim)
}
groups, err := sdk.SearchGroups(pm, args[1])
if err != nil {
logError(err)
return
}
logJSON(groups)
},
},
}

var groupAssignCmds = []cobra.Command{
Expand Down
2 changes: 2 additions & 0 deletions internal/apiutil/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,9 @@ var (
// ErrEmptyMessage indicates empty message.
ErrEmptyMessage = errors.New("empty message")

// ErrEmptySearchQuery indicates empty search query.
ErrEmptySearchQuery = errors.New("search query must not be empty")

// ErrLenSearchQuery indicates search query length.
ErrLenSearchQuery = errors.New("search query must be at least 3 characters")
)
19 changes: 19 additions & 0 deletions pkg/sdk/go/channels.go
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,25 @@ func (sdk mgSDK) ListChannelUsers(channelID string, pm PageMetadata, token strin
return up, nil
}

func (sdk mgSDK) SearchChannels(pm PageMetadata, token string) (ChannelsPage, errors.SDKError) {
url, err := sdk.withQueryParams(sdk.thingsURL, fmt.Sprintf("%s/%s", channelsEndpoint, searchEndpoint), pm)
if err != nil {
return ChannelsPage{}, errors.NewSDKError(err)
}

_, body, sdkerr := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK)
if sdkerr != nil {
return ChannelsPage{}, sdkerr
}

var cp ChannelsPage
if err := json.Unmarshal(body, &cp); err != nil {
return ChannelsPage{}, errors.NewSDKError(err)
}

return cp, nil
}

func (sdk mgSDK) AddUserGroupToChannel(channelID string, req UserGroupsRequest, token string) errors.SDKError {
data, err := json.Marshal(req)
if err != nil {
Expand Down
19 changes: 19 additions & 0 deletions pkg/sdk/go/groups.go
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,25 @@ func (sdk mgSDK) DisableGroup(id, token string) (Group, errors.SDKError) {
return sdk.changeGroupStatus(id, disableEndpoint, token)
}

func (sdk mgSDK) SearchGroups(pm PageMetadata, token string) (GroupsPage, errors.SDKError) {
url, err := sdk.withQueryParams(sdk.usersURL, fmt.Sprintf("%s/%s", groupsEndpoint, searchEndpoint), pm)
if err != nil {
return GroupsPage{}, errors.NewSDKError(err)
}

_, body, sdkerr := sdk.processRequest(http.MethodGet, url, token, nil, nil, http.StatusOK)
if sdkerr != nil {
return GroupsPage{}, sdkerr
}

var gp GroupsPage
if err := json.Unmarshal(body, &gp); err != nil {
return GroupsPage{}, errors.NewSDKError(err)
}

return gp, nil
}

func (sdk mgSDK) AddUserToGroup(groupID string, req UsersRelationRequest, token string) errors.SDKError {
data, err := json.Marshal(req)
if err != nil {
Expand Down
24 changes: 24 additions & 0 deletions pkg/sdk/go/sdk.go
Original file line number Diff line number Diff line change
Expand Up @@ -569,6 +569,18 @@ type SDK interface {
// fmt.Println(group)
DisableGroup(id, token string) (Group, errors.SDKError)

//SearchGroups returns page of groups.
//
// example:
// pm := sdk.PageMetadata{
// Offset: 0,
// Limit: 10,
// Name: "My Group",
// }
// groups, _ := sdk.SearchGroups(pm, "token")
// fmt.Println(groups)
SearchGroups(pm PageMetadata, token string) (GroupsPage, errors.SDKError)

// AddUserToGroup add user to a group.
//
// example:
Expand Down Expand Up @@ -735,6 +747,18 @@ type SDK interface {
// fmt.Println(users)
ListChannelUsers(channelID string, pm PageMetadata, token string) (UsersPage, errors.SDKError)

// SearchChannel search channel by name.
//
// example:
// pm := sdk.PageMetadata{
// Offset: 0,
// Limit: 10,
// Name: "My Channel",
// }
// channels, _ := sdk.SearchChannels(pm, "token")
// fmt.Println(channels)
SearchChannels(pm PageMetadata, token string) (ChannelsPage, errors.SDKError)

// AddUserGroupToChannel add user group to a channel.
//
// example:
Expand Down
1 change: 1 addition & 0 deletions pkg/sdk/go/users.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ const (
refreshTokenEndpoint = "tokens/refresh"
membersEndpoint = "members"
PasswordResetEndpoint = "password"
searchEndpoint = "search"
)

// User represents magistrala user its credentials.
Expand Down
60 changes: 60 additions & 0 deletions pkg/sdk/mocks/sdk.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit ee8be04

Please sign in to comment.