// Copyright (c) Mainflux // SPDX-License-Identifier: Apache-2.0 package cli import ( "encoding/json" mfxsdk "github.com/mainflux/mainflux/pkg/sdk/go" "github.com/spf13/cobra" ) var cmdThings = []cobra.Command{ { Use: "create ", Short: "Create thing", Long: `Create new thing, generate his UUID and store it`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { logUsage(cmd.Use) return } var thing mfxsdk.Thing if err := json.Unmarshal([]byte(args[0]), &thing); err != nil { logError(err) return } id, err := sdk.CreateThing(thing, args[1]) if err != nil { logError(err) return } logCreated(id) }, }, { Use: "get [all | ] ", Short: "Get things", Long: `Get all things or get thing by id. Things can be filtered by name or metadata all - lists all things - shows thing with provided `, Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { logUsage(cmd.Use) return } metadata, err := convertMetadata(Metadata) if err != nil { logError(err) return } pageMetadata := mfxsdk.PageMetadata{ Name: "", Offset: uint64(Offset), Limit: uint64(Limit), Metadata: metadata, } if args[0] == all { l, err := sdk.Things(pageMetadata, args[1]) if err != nil { logError(err) return } logJSON(l) return } t, err := sdk.Thing(args[0], args[1]) if err != nil { logError(err) return } logJSON(t) }, }, { Use: "delete ", Short: "Delete thing", Long: `Removes thing from database`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { logUsage(cmd.Use) return } if err := sdk.DeleteThing(args[0], args[1]); err != nil { logError(err) return } logOK() }, }, { Use: "identify ", Short: "Identify thing", Long: "Validates thing's key and returns its ID", Run: func(cmd *cobra.Command, args []string) { if len(args) != 1 { logUsage(cmd.Use) return } i, err := sdk.IdentifyThing(args[0]) if err != nil { logError(err) return } logJSON(i) }, }, { Use: "update [ | key ] ", Short: "Update thing", Long: `Update thing record`, Run: func(cmd *cobra.Command, args []string) { if len(args) < 2 { logUsage(cmd.Use) return } if args[0] == "key" { if err := sdk.UpdateThingKey(args[1], args[2], args[3]); err != nil { logError(err) return } logOK() return } var thing mfxsdk.Thing if err := json.Unmarshal([]byte(args[0]), &thing); err != nil { logError(err) return } if err := sdk.UpdateThing(thing, args[1]); err != nil { logError(err) return } logOK() }, }, { Use: "share ", Short: "share thing", Long: `Shares a thing with user identified. policies - '["policy1", ...]'`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 4 { logUsage(cmd.Use) return } var policies []string if err := json.Unmarshal([]byte(args[2]), &policies); err != nil { logError(err) return } if err := sdk.ShareThing(args[0], args[1], policies, args[2]); err != nil { logError(err) return } logOK() }, }, { Use: "connect ", Short: "Connect thing", Long: `Connect thing to the channel`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 3 { logUsage(cmd.Use) return } connIDs := mfxsdk.ConnectionIDs{ ChannelIDs: []string{args[1]}, ThingIDs: []string{args[0]}, } if err := sdk.Connect(connIDs, args[2]); err != nil { logError(err) return } logOK() }, }, { Use: "disconnect ", Short: "Disconnect thing", Long: `Disconnect thing to the channel`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 3 { logUsage(cmd.Use) return } if err := sdk.DisconnectThing(args[0], args[1], args[2]); err != nil { logError(err) return } logOK() }, }, { Use: "connections ", Short: "Connected list", Long: `List of Channels connected to Thing`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { logUsage(cmd.Use) return } pm := mfxsdk.PageMetadata{ Offset: uint64(Offset), Limit: uint64(Limit), Disconnected: false, } cl, err := sdk.ChannelsByThing(args[0], pm, args[1]) if err != nil { logError(err) return } logJSON(cl) }, }, { Use: "not-connected ", Short: "Not-connected list", Long: `List of Channels not connected to a Thing`, Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { logUsage(cmd.Use) return } pm := mfxsdk.PageMetadata{ Offset: uint64(Offset), Limit: uint64(Limit), Disconnected: true, } cl, err := sdk.ChannelsByThing(args[0], pm, args[1]) if err != nil { logError(err) return } logJSON(cl) }, }, } // NewThingsCmd returns things command. func NewThingsCmd() *cobra.Command { cmd := cobra.Command{ Use: "things [create | get | update | delete | connect | disconnect | connections | not-connected]", Short: "Things management", Long: `Things management: create, get, update or delete Thing, connect or disconnect Thing from Channel and get the list of Channels connected or disconnected from a Thing`, } for i := range cmdThings { cmd.AddCommand(&cmdThings[i]) } return &cmd }