1
0
mirror of https://github.com/mainflux/mainflux.git synced 2025-04-29 13:49:28 +08:00
Mainflux.mainflux/sdk/go/channels.go
Drasko DRASKOVIC a8eb7ae039
MF-354 - Add Go SDK (#357)
* MF-354 - Add Go SDK

This PR adds Go SDK. It also refactors `cli` to use new SDK.

Signed-off-by: drasko <drasko.draskovic@gmail.com>

* Use http consts. Add doc.

Signed-off-by: drasko <drasko.draskovic@gmail.com>

* Insline const

Signed-off-by: drasko <drasko.draskovic@gmail.com>

* Add initial SDK tests

Signed-off-by: drasko <drasko.draskovic@gmail.com>

* Fix SDK to return values (not HTTP rsp)

Signed-off-by: drasko <drasko.draskovic@gmail.com>

* Fix CLI and test

Signed-off-by: drasko <drasko.draskovic@gmail.com>

* fix typos, add header

Signed-off-by: drasko <drasko.draskovic@gmail.com>

* Fix doc

Signed-off-by: drasko <drasko.draskovic@gmail.com>

* Fix doc, add comment

Signed-off-by: drasko <drasko.draskovic@gmail.com>

* Inline error checks

Signed-off-by: drasko <drasko.draskovic@gmail.com>

* Fix typos

Signed-off-by: drasko <drasko.draskovic@gmail.com>

* Inline errs

Signed-off-by: drasko <drasko.draskovic@gmail.com>

* Fix typo

Signed-off-by: drasko <drasko.draskovic@gmail.com>

* Change fnc parameter name

Signed-off-by: drasko <drasko.draskovic@gmail.com>

* Rename getters to Go standard

Signed-off-by: drasko <drasko.draskovic@gmail.com>

* Use struct and interface

Signed-off-by: drasko <drasko.draskovic@gmail.com>

* Simplify sdk struct

Signed-off-by: drasko <drasko.draskovic@gmail.com>

* Fix README

Signed-off-by: drasko <drasko.draskovic@gmail.com>
2018-10-14 16:44:21 +02:00

145 lines
3.1 KiB
Go

//
// Copyright (c) 2018
// Mainflux
//
// SPDX-License-Identifier: Apache-2.0
//
package sdk
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"strconv"
"strings"
"github.com/mainflux/mainflux/things"
)
const channelsEndpoint = "channels"
// CreateChannel - creates new channel and generates UUID
func (sdk *MfxSDK) CreateChannel(data, token string) (string, error) {
url := fmt.Sprintf("%s/%s", sdk.url, channelsEndpoint)
req, err := http.NewRequest(http.MethodPost, url, strings.NewReader(data))
if err != nil {
return "", err
}
resp, err := sdk.sendRequest(req, token, contentTypeJSON)
if err != nil {
return "", err
}
if resp.StatusCode != http.StatusCreated {
return "", fmt.Errorf("%d", resp.StatusCode)
}
return resp.Header.Get("Location"), nil
}
// Channels - gets all channels
func (sdk *MfxSDK) Channels(token string) ([]things.Channel, error) {
url := fmt.Sprintf("%s/%s?offset=%s&limit=%s",
sdk.url, channelsEndpoint, strconv.Itoa(offset), strconv.Itoa(limit))
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return nil, err
}
resp, err := sdk.sendRequest(req, token, contentTypeJSON)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("%d", resp.StatusCode)
}
l := listChannelsRes{}
if err := json.Unmarshal(body, &l); err != nil {
return nil, err
}
return l.Channels, nil
}
// Channel - gets channel by ID
func (sdk *MfxSDK) Channel(id, token string) (things.Channel, error) {
url := fmt.Sprintf("%s/%s/%s", sdk.url, channelsEndpoint, id)
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return things.Channel{}, err
}
resp, err := sdk.sendRequest(req, token, contentTypeJSON)
if err != nil {
return things.Channel{}, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return things.Channel{}, err
}
if resp.StatusCode != http.StatusOK {
return things.Channel{}, fmt.Errorf("%d", resp.StatusCode)
}
c := things.Channel{}
if err := json.Unmarshal(body, &c); err != nil {
return things.Channel{}, err
}
return c, nil
}
// UpdateChannel - update a channel
func (sdk *MfxSDK) UpdateChannel(id, data, token string) error {
url := fmt.Sprintf("%s/%s/%s", sdk.url, channelsEndpoint, id)
req, err := http.NewRequest(http.MethodPut, url, strings.NewReader(data))
if err != nil {
return err
}
resp, err := sdk.sendRequest(req, token, contentTypeJSON)
if err != nil {
return err
}
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("%d", resp.StatusCode)
}
return nil
}
// DeleteChannel - removes channel
func (sdk *MfxSDK) DeleteChannel(id, token string) error {
url := fmt.Sprintf("%s/%s/%s", sdk.url, channelsEndpoint, id)
req, err := http.NewRequest(http.MethodDelete, url, nil)
if err != nil {
return err
}
resp, err := sdk.sendRequest(req, token, contentTypeJSON)
if err != nil {
return err
}
if resp.StatusCode != http.StatusNoContent {
return fmt.Errorf("%d", resp.StatusCode)
}
return nil
}