Skip to content

Commit

Permalink
Merge branch 'master' into user-reading
Browse files Browse the repository at this point in the history
  • Loading branch information
dborovcanin committed Dec 9, 2021
2 parents f08bff3 + 7e9ab45 commit f886ad3
Show file tree
Hide file tree
Showing 41 changed files with 2,098 additions and 1,142 deletions.
5 changes: 4 additions & 1 deletion api/things.yml
Original file line number Diff line number Diff line change
Expand Up @@ -636,7 +636,10 @@ components:
id:
type: string
format: uuid
description: Thing unique identifier
description: Thing unique identifier. This can be either
provided by the user or left blank. If the user provides a UUID,
it would be validated. If there is not one provided then
the service will generate one in UUID format.
ThingReqSchema:
type: object
properties:
Expand Down
1 change: 1 addition & 0 deletions docker/.env
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,7 @@ MF_SMTP_NOTIFIER_DB_USER=mainflux
MF_SMTP_NOTIFIER_DB_PASS=mainflux
MF_SMTP_NOTIFIER_DB=subscriptions
MF_SMTP_NOTIFIER_TEMPLATE=smtp-notifier.tmpl
MF_SMTP_NOTIFIER_FROM_ADDR=from@example.com


### SMPP Notifier
Expand Down
1 change: 1 addition & 0 deletions docker/addons/smtp-notifier/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ services:
MF_EMAIL_FROM_NAME: ${MF_EMAIL_FROM_NAME}
MF_EMAIL_TEMPLATE: ${MF_EMAIL_TEMPLATE}
MF_SMTP_NOTIFIER_TEMPLATE: ${MF_SMTP_NOTIFIER_TEMPLATE}
MF_SMTP_NOTIFIER_FROM_ADDR: ${MF_SMTP_NOTIFIER_FROM_ADDR}
ports:
- ${MF_SMTP_NOTIFIER_PORT}:${MF_SMTP_NOTIFIER_PORT}
networks:
Expand Down
2 changes: 1 addition & 1 deletion docker/templates/smtp-notifier.tmpl
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
To: {{.To}}
To: {{range $index, $v := .To}}{{if $index}},{{end}}{{$v}}{{end}}
From: {{.From}}
Subject: {{.Subject}}
{{.Header}}
Expand Down
2 changes: 1 addition & 1 deletion docker/templates/users.tmpl
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
To: {{.To}}
To: {{range $index, $v := .To}}{{if $index}},{{end}}{{$v}}{{end}}
From: {{.From}}
Subject: {{.Subject}}
{{.Header}}
Expand Down
5 changes: 2 additions & 3 deletions docker/vernemq/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
# Builder
FROM erlang:22-alpine AS builder
FROM erlang:23.3.2-alpine AS builder
RUN apk add --update git build-base bsd-compat-headers openssl-dev snappy-dev curl \
&& git clone https://github.com/vernemq/vernemq \
&& git clone -b 1.12.3 https://github.com/vernemq/vernemq \
&& cd vernemq \
&& git checkout eb1a262035af47e90d9edf07f36c1b1503557c1f \
&& make -j 16 rel

# Executor
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ require (
github.com/docker/go-units v0.4.0 // indirect
github.com/dsnet/golib/memfile v0.0.0-20200723050859-c110804dfa93 // indirect
github.com/fsnotify/fsnotify v1.4.9 // indirect
github.com/fxamacker/cbor/v2 v2.2.0 // indirect
github.com/fxamacker/cbor/v2 v2.3.0 // indirect
github.com/go-logfmt/logfmt v0.5.0 // indirect
github.com/go-stack/stack v1.8.0 // indirect
github.com/golang/snappy v0.0.3 // indirect
Expand Down
3 changes: 2 additions & 1 deletion go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -297,8 +297,9 @@ github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWo
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/fxamacker/cbor v1.3.2 h1:jMCvPyzpTVWoe1jRDUFPupVoV+DzDvnc1VP+9VU4ql8=
github.com/fxamacker/cbor v1.3.2/go.mod h1:Uy2lR31/2WfmW0yiA4i3t+we5kF3B/wzKsttcux+i/g=
github.com/fxamacker/cbor/v2 v2.2.0 h1:6eXqdDDe588rSYAi1HfZKbx6YYQO4mxQ9eC6xYpU/JQ=
github.com/fxamacker/cbor/v2 v2.2.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo=
github.com/fxamacker/cbor/v2 v2.3.0 h1:aM45YGMctNakddNNAezPxDUpv38j44Abh+hifNuqXik=
github.com/fxamacker/cbor/v2 v2.3.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo=
github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4=
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
Expand Down
6 changes: 4 additions & 2 deletions internal/email/email.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ package email
import (
"bytes"
"fmt"
"html/template"
"net/mail"
"net/smtp"
"text/template"

"github.com/mainflux/mainflux/logger"
"github.com/mainflux/mainflux/pkg/errors"
Expand Down Expand Up @@ -89,7 +90,8 @@ func (a *Agent) Send(To []string, From, Subject, Header, Content, Footer string)
Footer: Footer,
}
if From == "" {
tmpl.From = a.conf.FromName
from := mail.Address{Name: a.conf.FromName, Address: a.conf.FromAddress}
tmpl.From = from.String()
}

if err := a.tmpl.Execute(email, tmpl); err != nil {
Expand Down
56 changes: 38 additions & 18 deletions pkg/sdk/go/channels_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,10 @@ import (
)

var (
channel = sdk.Channel{ID: "001", Name: "test"}
ch1 = sdk.Channel{Name: "test1"}
ch2 = sdk.Channel{ID: "fe6b4e92-cc98-425e-b0aa-000000000001", Name: "test1"}
ch3 = sdk.Channel{ID: "fe6b4e92-cc98-425e-b0aa-000000000002", Name: "test2"}
chPrefix = "fe6b4e92-cc98-425e-b0aa-"
emptyChannel = sdk.Channel{}
)

Expand All @@ -24,6 +27,8 @@ func TestCreateChannel(t *testing.T) {
ts := newThingsServer(svc)
defer ts.Close()

chWrongExtID := sdk.Channel{ID: "b0aa-000000000001", Name: "1", Metadata:metadata}

sdkConf := sdk.Config{
ThingsURL: ts.URL,
MsgContentType: contentType,
Expand All @@ -41,21 +46,21 @@ func TestCreateChannel(t *testing.T) {
}{
{
desc: "create new channel",
channel: channel,
channel: ch1,
token: token,
err: nil,
empty: false,
},
{
desc: "create new channel with empty token",
channel: channel,
channel: ch1,
token: "",
err: createError(sdk.ErrFailedCreation, http.StatusUnauthorized),
empty: true,
},
{
desc: "create new channel with invalid token",
channel: channel,
channel: ch1,
token: wrongValue,
err: createError(sdk.ErrFailedCreation, http.StatusUnauthorized),
empty: true,
Expand All @@ -67,6 +72,20 @@ func TestCreateChannel(t *testing.T) {
err: nil,
empty: false,
},
{
desc: "create a new channel with external UUID",
channel: ch2,
token: token,
err: nil,
empty: false,
},
{
desc: "create a new channel with wrong external UUID",
channel: chWrongExtID,
token: token,
err: createError(sdk.ErrFailedCreation, http.StatusBadRequest),
empty: true,
},
}

for _, tc := range cases {
Expand All @@ -90,8 +109,8 @@ func TestCreateChannels(t *testing.T) {
mainfluxSDK := sdk.NewSDK(sdkConf)

channels := []sdk.Channel{
sdk.Channel{ID: "001", Name: "1"},
sdk.Channel{ID: "002", Name: "2"},
ch2,
ch3,
}

cases := []struct {
Expand Down Expand Up @@ -141,7 +160,7 @@ func TestCreateChannels(t *testing.T) {
}

func TestChannel(t *testing.T) {
svc := newThingsService(map[string]string{token: email})
svc := newThingsService(map[string]string{token: adminEmail})
ts := newThingsServer(svc)
defer ts.Close()
sdkConf := sdk.Config{
Expand All @@ -151,7 +170,7 @@ func TestChannel(t *testing.T) {
}

mainfluxSDK := sdk.NewSDK(sdkConf)
id, err := mainfluxSDK.CreateChannel(channel, token)
id, err := mainfluxSDK.CreateChannel(ch2, token)
require.Nil(t, err, fmt.Sprintf("unexpected error: %s", err))

cases := []struct {
Expand All @@ -166,7 +185,7 @@ func TestChannel(t *testing.T) {
chanID: id,
token: token,
err: nil,
response: channel,
response: ch2,
},
{
desc: "get non-existent channel",
Expand Down Expand Up @@ -204,7 +223,9 @@ func TestChannels(t *testing.T) {
var channels []sdk.Channel
mainfluxSDK := sdk.NewSDK(sdkConf)
for i := 1; i < 101; i++ {
ch := sdk.Channel{ID: fmt.Sprintf("%03d", i), Name: "test"}
id := fmt.Sprintf("%s%012d", chPrefix, i)
name := fmt.Sprintf("test-%d", i)
ch := sdk.Channel{ID: id, Name: name}
_, err := mainfluxSDK.CreateChannel(ch, token)
require.Nil(t, err, fmt.Sprintf("unexpected error: %s", err))
channels = append(channels, ch)
Expand Down Expand Up @@ -294,10 +315,9 @@ func TestChannelsByThing(t *testing.T) {
var chsDiscoNum = 1
var channels []sdk.Channel
for i := 1; i < n+1; i++ {
ch := sdk.Channel{
ID: fmt.Sprintf("%03d", i),
Name: "test",
}
id := fmt.Sprintf("%s%012d", chPrefix, i)
name := fmt.Sprintf("test-%d", i)
ch := sdk.Channel{ID: id, Name: name}
cid, err := mainfluxSDK.CreateChannel(ch, token)
require.Nil(t, err, fmt.Sprintf("unexpected error: %s", err))

Expand Down Expand Up @@ -409,7 +429,7 @@ func TestChannelsByThing(t *testing.T) {
}

func TestUpdateChannel(t *testing.T) {
svc := newThingsService(map[string]string{token: email})
svc := newThingsService(map[string]string{token: adminEmail})
ts := newThingsServer(svc)
defer ts.Close()
sdkConf := sdk.Config{
Expand All @@ -419,7 +439,7 @@ func TestUpdateChannel(t *testing.T) {
}

mainfluxSDK := sdk.NewSDK(sdkConf)
id, err := mainfluxSDK.CreateChannel(channel, token)
id, err := mainfluxSDK.CreateChannel(ch2, token)
require.Nil(t, err, fmt.Sprintf("unexpected error %s", err))

cases := []struct {
Expand Down Expand Up @@ -467,7 +487,7 @@ func TestUpdateChannel(t *testing.T) {
}

func TestDeleteChannel(t *testing.T) {
svc := newThingsService(map[string]string{token: email})
svc := newThingsService(map[string]string{token: adminEmail})
ts := newThingsServer(svc)
defer ts.Close()
sdkConf := sdk.Config{
Expand All @@ -477,7 +497,7 @@ func TestDeleteChannel(t *testing.T) {
}

mainfluxSDK := sdk.NewSDK(sdkConf)
id, err := mainfluxSDK.CreateChannel(channel, token)
id, err := mainfluxSDK.CreateChannel(ch2, token)
require.Nil(t, err, fmt.Sprintf("unexpected error: %s", err))

cases := []struct {
Expand Down
50 changes: 24 additions & 26 deletions pkg/sdk/go/groups.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,14 @@ import (
"net/http"
"strings"

"github.com/mainflux/mainflux/auth"
"github.com/mainflux/mainflux/pkg/errors"
)

const groupsEndpoint = "groups"

type assignRequest struct {
Type string `json:"type,omitempty"`
Members []string `json:"members"`
}
const (
groupsEndpoint = "groups"
MaxLevel = uint64(5)
MinLevel = uint64(1)
)

func (sdk mfSDK) CreateGroup(g Group, token string) (string, error) {
data, err := json.Marshal(g)
Expand Down Expand Up @@ -128,75 +126,75 @@ func (sdk mfSDK) Unassign(token, groupID string, memberIDs ...string) error {
return nil
}

func (sdk mfSDK) Members(groupID, token string, offset, limit uint64) (auth.MemberPage, error) {
func (sdk mfSDK) Members(groupID, token string, offset, limit uint64) (MembersPage, error) {
url := fmt.Sprintf("%s, %s/%s/members?offset=%d&limit=%d&", sdk.authURL, groupsEndpoint, groupID, offset, limit)
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return auth.MemberPage{}, err
return MembersPage{}, err
}

resp, err := sdk.sendRequest(req, token, string(CTJSON))
if err != nil {
return auth.MemberPage{}, err
return MembersPage{}, err
}
defer resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return auth.MemberPage{}, err
return MembersPage{}, err
}

if resp.StatusCode != http.StatusOK {
return auth.MemberPage{}, errors.Wrap(ErrFailedFetch, errors.New(resp.Status))
return MembersPage{}, errors.Wrap(ErrFailedFetch, errors.New(resp.Status))
}

var tp auth.MemberPage
var tp MembersPage
if err := json.Unmarshal(body, &tp); err != nil {
return auth.MemberPage{}, err
return MembersPage{}, err
}

return tp, nil
}

func (sdk mfSDK) Groups(offset, limit uint64, token string) (auth.GroupPage, error) {
func (sdk mfSDK) Groups(offset, limit uint64, token string) (GroupsPage, error) {
url := fmt.Sprintf("%s/%s?offset=%d&limit=%d&tree=false", sdk.authURL, groupsEndpoint, offset, limit)
return sdk.getGroups(token, url)
}

func (sdk mfSDK) Parents(id string, offset, limit uint64, token string) (auth.GroupPage, error) {
url := fmt.Sprintf("%s/%s/%s/parents?offset=%d&limit=%d&tree=false&level=%d", sdk.authURL, groupsEndpoint, id, offset, limit, auth.MaxLevel)
func (sdk mfSDK) Parents(id string, offset, limit uint64, token string) (GroupsPage, error) {
url := fmt.Sprintf("%s/%s/%s/parents?offset=%d&limit=%d&tree=false&level=%d", sdk.authURL, groupsEndpoint, id, offset, limit, MaxLevel)
return sdk.getGroups(token, url)
}

func (sdk mfSDK) Children(id string, offset, limit uint64, token string) (auth.GroupPage, error) {
url := fmt.Sprintf("%s/%s/%s/children?offset=%d&limit=%d&tree=false&level=%d", sdk.authURL, groupsEndpoint, id, offset, limit, auth.MaxLevel)
func (sdk mfSDK) Children(id string, offset, limit uint64, token string) (GroupsPage, error) {
url := fmt.Sprintf("%s/%s/%s/children?offset=%d&limit=%d&tree=false&level=%d", sdk.authURL, groupsEndpoint, id, offset, limit, MaxLevel)
return sdk.getGroups(token, url)
}

func (sdk mfSDK) getGroups(token, url string) (auth.GroupPage, error) {
func (sdk mfSDK) getGroups(token, url string) (GroupsPage, error) {
req, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return auth.GroupPage{}, err
return GroupsPage{}, err
}

resp, err := sdk.sendRequest(req, token, string(CTJSON))
if err != nil {
return auth.GroupPage{}, err
return GroupsPage{}, err
}
defer resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return auth.GroupPage{}, err
return GroupsPage{}, err
}

if resp.StatusCode != http.StatusOK {
return auth.GroupPage{}, errors.Wrap(ErrFailedFetch, errors.New(resp.Status))
return GroupsPage{}, errors.Wrap(ErrFailedFetch, errors.New(resp.Status))
}

var tp auth.GroupPage
var tp GroupsPage
if err := json.Unmarshal(body, &tp); err != nil {
return auth.GroupPage{}, err
return GroupsPage{}, err
}
return tp, nil
}
Expand Down
5 changes: 5 additions & 0 deletions pkg/sdk/go/requests.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@

package sdk

type assignRequest struct {
Type string `json:"type,omitempty"`
Members []string `json:"members"`
}

// UserPasswordReq contains old and new passwords
type UserPasswordReq struct {
OldPassword string `json:"old_password,omitempty"`
Expand Down
5 changes: 5 additions & 0 deletions pkg/sdk/go/responses.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,8 @@ type UsersPage struct {
Users []User `json:"users"`
pageRes
}

type MembersPage struct {
Members []Member `json:"members"`
pageRes
}
Loading

0 comments on commit f886ad3

Please sign in to comment.