Groups#

Auth service#

For grouping Mainflux entities there are groups object in the auth service. Grouping of entities can be done for things and users but additionally you can use groups for grouping some external entities as well. Groups are organized like a tree, group can have one parent and children. Group with no parent is root of the tree.

Create a group#

curl -is -S -X POST http://localhost/groups -d '{"name":"<group_name>","description":"<group_description>","parent_id":"<parent_id>","metadata":<group_metadata>}' -H 'Content-Type: application/json' -H "Authorization: $TOK"                    
HTTP/1.1 201 Created
Server: nginx/1.16.0
Date: Fri, 09 Apr 2021 08:02:02 GMT
Content-Type: application/json
Content-Length: 0
Connection: keep-alive
Location: /groups/01F2TTDYGMP6DW083NE6E0DKH2
Access-Control-Expose-Headers: Location
  • group_name - name of the group
  • group_description - description of group up to 1024 characters.
  • parent_id - id of parent group, if not specified created group is tree root.
  • metadata - custom metadata that can be attached to group object for specific application needs.

Fetch a group#

curl -s -S -X GET http://localhost/groups/01F2TTDYGMP6DW083NE6E0DKH2 -H "Authorization: $TOK" 

Create a child#

curl -is -S -X POST http://localhost/groups -d '{"name":"test1","description":"<group_description>","parent_id":"01F2TTDYGMP6DW083NE6E0DKH2","metadata":{"group_attr":"attr_value"}}' -H 'Content-Type: application/json' -H "Authorization: $TOK" 
HTTP/1.1 201 Created
Server: nginx/1.16.0
Date: Fri, 09 Apr 2021 08:09:37 GMT
Content-Type: application/json
Content-Length: 0
Connection: keep-alive
Location: /groups/01F2TTVV5NJH63FE5KXMNPWB8P
Access-Control-Expose-Headers: Location

Fetch a child group#

curl -s -S -X GET http://localhost/groups/01F2TTVV5NJH63FE5KXMNPWB8P -H "Authorization: $TOK" | jq
{
  "id": "01F2TTVV5NJH63FE5KXMNPWB8P",
  "name": "test1",
  "owner_id": "8e968002-1b19-4e17-bfb6-f0064888a2d1",
  "parent_id": "01F2TTDYGMP6DW083NE6E0DKH2",
  "description": "group for test",
  "metadata": {
    "group_attr": "attr_value"
  },
  "level": 1,
  "created_at": "2021-04-09T08:09:37.718Z",
  "updated_at": "2021-04-09T08:09:37.718Z"
}
  • owner_id - is attached by service, it is id of the user that issued create request.
  • level - is generated by service, it represents a level in a tree hierarchy
  • created_at - time of creation, generated by service.
  • updated_at - time of update, generated by service.

Fetch group hierarchy#

To fetch a group hierarchy you can either fetch children for a group or a direct ascendant line

Fetch a parent#

 curl -s -S -X GET http://localhost/groups/<group_id>/parents?tree=true&level=5 -H "Authorization: <auth_token>" | jq
{
  "total": 2,
  "level": 1,
  "name": "",
  "groups": [
    {
      "id": "01F2TTDYGMP6DW083NE6E0DKH2",
      "name": "test",
      "owner_id": "8e968002-1b19-4e17-bfb6-f0064888a2d1",
      "description": "group for test",
      "metadata": {
        "group_attr": "attr_value"
      },
      "level": 1,
      "path": "01F2TTDYGMP6DW083NE6E0DKH2",
      "children": [
        {
          "id": "01F2TTVV5NJH63FE5KXMNPWB8P",
          "name": "test1",
          "owner_id": "8e968002-1b19-4e17-bfb6-f0064888a2d1",
          "parent_id": "01F2TTDYGMP6DW083NE6E0DKH2",
          "description": "group for test",
          "metadata": {
            "group_attr": "attr_value"
          },
          "level": 2,
          "path": "01F2TTDYGMP6DW083NE6E0DKH2.01F2TTVV5NJH63FE5KXMNPWB8P",
          "created_at": "2021-04-09T08:09:37.718Z",
          "updated_at": "2021-04-09T08:09:37.718Z"
        }
      ],
      "created_at": "2021-04-09T08:02:02.389Z",
      "updated_at": "2021-04-09T08:02:02.389Z"
    }
  ]
}
  • tree - if true response is JSON that represent a groups tree structure. If ommited or false than groups will be retrieve as list
  • level - limits the hierarchy to be retrieved. Max level to be fetched in one request is 5.

Fetch children#

curl -s -S -X GET http://localhost/groups/01F2TTDYGMP6DW083NE6E0DKH2/children\?tree\=true\&level\=5 -H "Authorization: $TOK" | jq
{
  "total": 3,
  "level": 5,
  "name": "",
  "groups": [
    {
      "id": "01F2TTDYGMP6DW083NE6E0DKH2",
      "name": "test",
      "owner_id": "8e968002-1b19-4e17-bfb6-f0064888a2d1",
      "description": "group for test",
      "metadata": {
        "group_attr": "attr_value"
      },
      "level": 1,
      "path": "01F2TTDYGMP6DW083NE6E0DKH2",
      "children": [
        {
          "id": "01F2TTVV5NJH63FE5KXMNPWB8P",
          "name": "test1",
          "owner_id": "8e968002-1b19-4e17-bfb6-f0064888a2d1",
          "parent_id": "01F2TTDYGMP6DW083NE6E0DKH2",
          "description": "group for test",
          "metadata": {
            "group_attr": "attr_value"
          },
          "level": 2,
          "path": "01F2TTDYGMP6DW083NE6E0DKH2.01F2TTVV5NJH63FE5KXMNPWB8P",
          "created_at": "2021-04-09T08:09:37.718Z",
          "updated_at": "2021-04-09T08:09:37.718Z"
        },
        {
          "id": "01F2TTJPXSZ7K941T57MX3V03M",
          "name": "test",
          "owner_id": "8e968002-1b19-4e17-bfb6-f0064888a2d1",
          "parent_id": "01F2TTDYGMP6DW083NE6E0DKH2",
          "description": "group for test",
          "metadata": {
            "group_attr": "attr_value"
          },
          "level": 2,
          "path": "01F2TTDYGMP6DW083NE6E0DKH2.01F2TTJPXSZ7K941T57MX3V03M",
          "created_at": "2021-04-09T08:04:38.458Z",
          "updated_at": "2021-04-09T08:04:38.458Z"
        }
      ],
      "created_at": "2021-04-09T08:02:02.389Z",
      "updated_at": "2021-04-09T08:02:02.389Z"
    }
  ]
}

Assign a member to a group#

You can assign members to a group by putting entity ids into a group For example assigning users to a group

curl -isSX POST http://localhost/groups/<group_id>/members -d '{"members":["<user_id1>",..."<user_idN>"],"type":"users"}' -H "Authorization: $TOK" -H 'Content-Type: application/json'
HTTP/1.1 200 OK
Server: nginx/1.16.0
Date: Fri, 09 Apr 2021 09:40:35 GMT
Content-Type: application/json
Content-Length: 0
Connection: keep-alive
Access-Control-Expose-Headers: Location

Or assigning things to a group

curl -isSX POST http://localhost/groups/01F2TTDYGMP6DW083NE6E0DKH2/members -d '{"members":["a0b1d516-67c6-4e8d-8ea2-ad4aff444ca3","9a036414-5d47-4122-9e58-b3b6953a2097"],"type":"things"}' -H "Authorization: $TOK" -H 'Content-Type: application/json'
HTTP/1.1 200 OK
Server: nginx/1.16.0
Date: Fri, 09 Apr 2021 09:43:24 GMT
Content-Type: application/json
Content-Length: 0
Connection: keep-alive
Access-Control-Expose-Headers: Location

To fetch members you can use endpoint on auth, things or users service. Endpoint on auth service only retrieves member ids. Endpoints on things and users will retrieve full objects.

Fetching members#

Fetching from auth service#

curl -sSX GET http://localhost/groups/01F2TTDYGMP6DW083NE6E0DKH2/members  -H "Authorization: $TOK" | jq
{
  "limit": 10,
  "total": 0,
  "name": "",
  "Members": [
    {
      "ID": "5ec9f5f4-5221-43f4-a56f-9594ab110efa",
      "Type": "users"
    },
    {
      "ID": "8e968002-1b19-4e17-bfb6-f0064888a2d1",
      "Type": "users"
    },
    {
      "ID": "a0b1d516-67c6-4e8d-8ea2-ad4aff444ca3",
      "Type": "things"
    },
    {
      "ID": "9a036414-5d47-4122-9e58-b3b6953a2097",
      "Type": "things"
    }
  ]
}

You can filter by type

curl -sSX GET http://localhost/groups/01F2TTDYGMP6DW083NE6E0DKH2/members\?type\='users'  -H "Authorization: $TOK" | jq
{
  "limit": 10,
  "total": 2,
  "level": 0,
  "name": "",
  "Members": [
    {
      "ID": "5ec9f5f4-5221-43f4-a56f-9594ab110efa",
      "Type": "users"
    },
    {
      "ID": "8e968002-1b19-4e17-bfb6-f0064888a2d1",
      "Type": "users"
    }
  ]
}

Fetching from users service#

curl -sSX GET http://localhost/groups/users/01F2TTDYGMP6DW083NE6E0DKH2  -H "Authorization: $TOK" | jq        
{
  "total": 2,
  "offset": 0,
  "limit": 10,
  "users": [
    {
      "id": "5ec9f5f4-5221-43f4-a56f-9594ab110efa",
      "email": "admin@example.com"
    },
    {
      "id": "8e968002-1b19-4e17-bfb6-f0064888a2d1",
      "email": "moko@example.com"
    }
  ]
}

Fetching from things service#

 curl -sSX GET http://localhost/groups/things/01F2TTDYGMP6DW083NE6E0DKH2  -H "Authorization: $TOK" | jq
{
  "total": 2,
  "offset": 0,
  "limit": 10,
  "order": "",
  "direction": "",
  "things": [
    {
      "id": "a0b1d516-67c6-4e8d-8ea2-ad4aff444ca3",
      "key": "54dfc44c-3471-4903-a6b5-529dc7a2dd41"
    },
    {
      "id": "9a036414-5d47-4122-9e58-b3b6953a2097",
      "key": "e874fc75-461d-4ece-ac55-2d7cdc10c20a"
    }
  ]
}

Fetching membership#

For entity that is being put in multiple groups it is possible to retrieve a list of groups it belongs to.

curl -sSX GET http://localhost/members/<member_id>/groups  -H "Authorization: $TOK" | jq 
{
  "total": 1,
  "level": 0,
  "name": "",
  "groups": [
    {
      "id": "01F2TTDYGMP6DW083NE6E0DKH2",
      "name": "test",
      "owner_id": "8e968002-1b19-4e17-bfb6-f0064888a2d1",
      "description": "group for test",
      "metadata": {
        "group_attr": "attr_value"
      },
      "level": 0,
      "path": "",
      "created_at": "0001-01-01T00:00:00Z",
      "updated_at": "0001-01-01T00:00:00Z"
    }
  ]
}
  • member_id - is either thing or user id, or some other enitity if groups are being used for grouping external entities.