mirror of
https://github.com/mainflux/mainflux.git
synced 2025-04-29 13:49:28 +08:00

* Introduce Config response for bootstrap procedure Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add inital service implementation Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Enable status change Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Fix logger import Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update BSS to send config in valid format Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Use ConfigReader to create valid format response Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update config retrieval error handle Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Enable Thing deletion API Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add API support for fetching Thing by ID Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add list Things endpoint Update database schema Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Use MF API to update status Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Use Channels list Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Fix reading Thing from the database Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Create Mainflux Thing when adding new Thing to BS Create MF Thing as soon as Bootstrap service thing is added. There are 2 main reasons to create Thing when adding a new BS Thing over creating Thing on bootstrapping: 1) On bootstrapping time, user JWT will not be sent as a part of request, so there is no mechanism to send a valid API call to Mainflux. 2) This way, Bootstrap service will be in sync with Mainlux: each Thing existing in BS will also be in Mainflux. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add Thing update Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Remove API key from BS service Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Improve channels update algorithm Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Refactor code Remove unused fields, comment code and simplfy some method signatures. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Remove Identity Provider and use gRPC Update dependencies Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add external auth key Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update BS config reader Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update docker-compose Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update env variable read Add MQTT password to bootstrap response. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update response fields and tags Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Remove status check Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Enable BS of active Things Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add NewThing state Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Rename Status to State Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update README.md Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add filterng Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update List endpoint Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Fix Database query Remove copyright headers. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add filter type Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Gateway provisioning (1.d) Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update self-bootstrapping feature Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add mocks Update dependencies to the newest Mainflux version. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add thing service tests Mocks fix. Some of the service code intentionally left untested due to possible changes in future. Fix copyright headers and update Mainflux and other dependencies. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Use name "Config" instead of "Thing" Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Refactor code Remove commented code. Fix typo. Remove unused exported error. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Simplify service tests Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Remove Assign method Raise test coverage. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update database schema Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Store unknown bootstrap attempts Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update unknown bootstrap handling Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update naming Fix uses of `Thing` in DB and `api` package. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add endpoint tests Currently, only test for adding a new Config are implemented. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add initialization of DB tests Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add DB tests Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update readme file Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add API docs Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Remove Mainflux from vendor Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add licence headers Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Fix service and endpoint tests Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Raise test coverage Remove unused repsonse type. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update build and deployment Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update API docs Fix typo. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update imports formatting Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Make state response empty Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Raise test coverage Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update API docs Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update readme file Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Use uuid as a primary key Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Use Mainflux ID Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Remove `Created` state. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Move State to separate file Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Add Things prefix Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update API and API docs Be consistent in API naming and add some useful comments. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Refactor repository implementation Cleanup code, make it more readable. Fix missing drop in migrations. Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Use "cfg" insted of "thing" Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Fix tests Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com> * Update tables names Signed-off-by: Dusan Borovcanin <dusan.borovcanin@mainflux.com>
210 lines
4.7 KiB
Go
210 lines
4.7 KiB
Go
//
|
|
// Copyright (c) 2018
|
|
// Mainflux
|
|
//
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
//
|
|
|
|
package mocks
|
|
|
|
import (
|
|
"context"
|
|
"strconv"
|
|
"sync"
|
|
|
|
"github.com/mainflux/mainflux"
|
|
"github.com/mainflux/mainflux/things"
|
|
)
|
|
|
|
var _ things.Service = (*mainfluxThings)(nil)
|
|
|
|
type mainfluxThings struct {
|
|
mu sync.Mutex
|
|
counter uint64
|
|
things map[string]things.Thing
|
|
channels map[string]things.Channel
|
|
users mainflux.UsersServiceClient
|
|
connections map[string][]string
|
|
}
|
|
|
|
// NewThingsService returns Mainflux Things service mock.
|
|
// Only methods used by SDK are mocked.
|
|
func NewThingsService(things map[string]things.Thing, channels map[string]things.Channel, users mainflux.UsersServiceClient) things.Service {
|
|
return &mainfluxThings{
|
|
things: things,
|
|
channels: channels,
|
|
users: users,
|
|
connections: make(map[string][]string),
|
|
}
|
|
}
|
|
|
|
func (svc *mainfluxThings) AddThing(owner string, thing things.Thing) (things.Thing, error) {
|
|
svc.mu.Lock()
|
|
defer svc.mu.Unlock()
|
|
|
|
userID, err := svc.users.Identify(context.Background(), &mainflux.Token{Value: owner})
|
|
if err != nil {
|
|
return things.Thing{}, things.ErrUnauthorizedAccess
|
|
}
|
|
|
|
svc.counter++
|
|
thing.Owner = userID.Value
|
|
thing.ID = strconv.FormatUint(svc.counter, 10)
|
|
thing.Key = thing.ID
|
|
svc.things[thing.ID] = thing
|
|
return thing, nil
|
|
}
|
|
|
|
func (svc *mainfluxThings) ViewThing(owner, id string) (things.Thing, error) {
|
|
svc.mu.Lock()
|
|
defer svc.mu.Unlock()
|
|
|
|
userID, err := svc.users.Identify(context.Background(), &mainflux.Token{Value: owner})
|
|
if err != nil {
|
|
return things.Thing{}, things.ErrUnauthorizedAccess
|
|
}
|
|
|
|
if t, ok := svc.things[id]; ok && t.Owner == userID.Value {
|
|
return t, nil
|
|
|
|
}
|
|
|
|
return things.Thing{}, things.ErrNotFound
|
|
}
|
|
|
|
func (svc *mainfluxThings) Connect(owner, chanID, thingID string) error {
|
|
svc.mu.Lock()
|
|
defer svc.mu.Unlock()
|
|
|
|
userID, err := svc.users.Identify(context.Background(), &mainflux.Token{Value: owner})
|
|
if err != nil {
|
|
return things.ErrUnauthorizedAccess
|
|
}
|
|
|
|
if svc.channels[chanID].Owner != userID.Value {
|
|
return things.ErrNotFound
|
|
}
|
|
|
|
svc.connections[chanID] = append(svc.connections[chanID], thingID)
|
|
return nil
|
|
}
|
|
|
|
func (svc *mainfluxThings) Disconnect(owner, chanID, thingID string) error {
|
|
svc.mu.Lock()
|
|
defer svc.mu.Unlock()
|
|
|
|
userID, err := svc.users.Identify(context.Background(), &mainflux.Token{Value: owner})
|
|
if err != nil || svc.channels[chanID].Owner != userID.Value {
|
|
return things.ErrUnauthorizedAccess
|
|
}
|
|
|
|
ids := svc.connections[chanID]
|
|
i := 0
|
|
for _, t := range ids {
|
|
if t == thingID {
|
|
break
|
|
}
|
|
i++
|
|
}
|
|
|
|
if i == len(ids) {
|
|
return things.ErrNotFound
|
|
}
|
|
|
|
var tmp []string
|
|
if i != len(ids)-2 {
|
|
tmp = ids[i+1:]
|
|
}
|
|
ids = append(ids[:i], tmp...)
|
|
svc.connections[chanID] = ids
|
|
|
|
return nil
|
|
}
|
|
|
|
func (svc *mainfluxThings) RemoveThing(owner, id string) error {
|
|
svc.mu.Lock()
|
|
defer svc.mu.Unlock()
|
|
|
|
userID, err := svc.users.Identify(context.Background(), &mainflux.Token{Value: owner})
|
|
if err != nil {
|
|
return things.ErrUnauthorizedAccess
|
|
}
|
|
|
|
if t, ok := svc.things[id]; !ok || t.Owner != userID.Value {
|
|
return things.ErrNotFound
|
|
}
|
|
|
|
delete(svc.things, id)
|
|
conns := make(map[string][]string)
|
|
for k, v := range svc.connections {
|
|
idx := findIndex(v, id)
|
|
if idx != -1 {
|
|
var tmp []string
|
|
if idx != len(v)-2 {
|
|
tmp = v[idx+1:]
|
|
}
|
|
conns[k] = append(v[:idx], tmp...)
|
|
}
|
|
}
|
|
|
|
svc.connections = conns
|
|
return nil
|
|
}
|
|
|
|
func (svc *mainfluxThings) ViewChannel(owner, id string) (things.Channel, error) {
|
|
if c, ok := svc.channels[id]; ok {
|
|
return c, nil
|
|
}
|
|
return things.Channel{}, things.ErrNotFound
|
|
}
|
|
|
|
func (svc *mainfluxThings) UpdateThing(string, things.Thing) error {
|
|
panic("not implemented")
|
|
}
|
|
|
|
func (svc *mainfluxThings) ListThings(string, uint64, uint64) (things.ThingsPage, error) {
|
|
panic("not implemented")
|
|
}
|
|
|
|
func (svc *mainfluxThings) ListChannelsByThing(string, string, uint64, uint64) (things.ChannelsPage, error) {
|
|
panic("not implemented")
|
|
}
|
|
|
|
func (svc *mainfluxThings) ListThingsByChannel(string, string, uint64, uint64) (things.ThingsPage, error) {
|
|
panic("not implemented")
|
|
}
|
|
|
|
func (svc *mainfluxThings) CreateChannel(string, things.Channel) (things.Channel, error) {
|
|
panic("not implemented")
|
|
}
|
|
|
|
func (svc *mainfluxThings) UpdateChannel(string, things.Channel) error {
|
|
panic("not implemented")
|
|
}
|
|
|
|
func (svc *mainfluxThings) ListChannels(string, uint64, uint64) (things.ChannelsPage, error) {
|
|
panic("not implemented")
|
|
}
|
|
|
|
func (svc *mainfluxThings) RemoveChannel(string, string) error {
|
|
panic("not implemented")
|
|
}
|
|
|
|
func (svc *mainfluxThings) CanAccess(string, string) (string, error) {
|
|
panic("not implemented")
|
|
}
|
|
|
|
func (svc *mainfluxThings) Identify(string) (string, error) {
|
|
panic("not implemented")
|
|
}
|
|
|
|
func findIndex(list []string, val string) int {
|
|
for i, v := range list {
|
|
if v == val {
|
|
return i
|
|
}
|
|
}
|
|
|
|
return -1
|
|
}
|