SMQ-2570 - Update clients and channels api docs (#2578)

Signed-off-by: Felix Gateru <felix.gateru@gmail.com>
This commit is contained in:
Felix Gateru
2024-12-10 13:55:45 +03:00
committed by GitHub
parent ed7f818514
commit 1e77579b33
15 changed files with 1845 additions and 1140 deletions
+35 -6
View File
@@ -13,23 +13,28 @@ on:
- "auth/api/http/**"
- "bootstrap/api**"
- "certs/api/**"
- "channels/api/http/**"
- "clients/api/http/**"
- "consumers/notifiers/api/**"
- "domains/api/http/**"
- "groups/api/http/**"
- "http/api/**"
- "invitations/api/**"
- "journal/api/**"
- "provision/api/**"
- "readers/api/**"
- "clients/api/**"
- "users/api/**"
env:
TOKENS_URL: http://localhost:9002/users/tokens/issue
DOMAINS_URL: http://localhost:8189/domains
CREATE_DOMAINS_URL: http://localhost:9003/domains
USER_IDENTITY: admin@example.com
USER_SECRET: 12345678
DOMAIN_NAME: demo-test
USERS_URL: http://localhost:9002
CLIENTS_URL: http://localhost:9000
CLIENTS_URL: http://localhost:9006
CHANNELS_URL: http://localhost:9005
GROUPS_URL: http://localhost:9004
HTTP_ADAPTER_URL: http://localhost:8008
INVITATIONS_URL: http://localhost:9020
AUTH_URL: http://localhost:8189
@@ -62,8 +67,7 @@ jobs:
- name: Set access token
run: |
export USER_TOKEN=$(curl -sSX POST $TOKENS_URL -H "Content-Type: application/json" -d "{\"identity\": \"$USER_IDENTITY\",\"secret\": \"$USER_SECRET\"}" | jq -r .access_token)
export DOMAIN_ID=$(curl -sSX POST $DOMAINS_URL -H "Content-Type: application/json" -H "Authorization: Bearer $USER_TOKEN" -d "{\"name\":\"$DOMAIN_NAME\",\"alias\":\"$DOMAIN_NAME\"}" | jq -r .id)
export USER_TOKEN=$(curl -sSX POST $TOKENS_URL -H "Content-Type: application/json" -d "{\"identity\": \"$USER_IDENTITY\",\"secret\": \"$USER_SECRET\",\"domain_id\": \"$DOMAIN_ID\"}" | jq -r .access_token)
export DOMAIN_ID=$(curl -sSX POST $CREATE_DOMAINS_URL -H "Content-Type: application/json" -H "Authorization: Bearer $USER_TOKEN" -d "{\"name\":\"$DOMAIN_NAME\",\"alias\":\"$DOMAIN_NAME\"}" | jq -r .id)
echo "USER_TOKEN=$USER_TOKEN" >> $GITHUB_ENV
export CLIENT_SECRET=$(supermq-cli provision test | /usr/bin/grep -Eo '"secret": "[^"]+"' | awk 'NR % 2 == 0' | sed 's/"secret": "\(.*\)"/\1/')
echo "CLIENT_SECRET=$CLIENT_SECRET" >> $GITHUB_ENV
@@ -92,6 +96,11 @@ jobs:
- ".github/workflows/api-tests.yml"
- "api/openapi/certs.yml"
- "certs/api/**"
domains:
- ".github/workflows/api-tests.yml"
- "api/openapi/domains.yml"
- "domains/api/http/**"
http:
- ".github/workflows/api-tests.yml"
@@ -116,7 +125,17 @@ jobs:
clients:
- ".github/workflows/api-tests.yml"
- "api/openapi/clients.yml"
- "clients/api/**"
- "clients/api/http/**"
channels:
- ".github/workflows/api-tests.yml"
- "api/openapi/channels.yml"
- "channels/api/http/**"
groups:
- ".github/workflows/api-tests.yml"
- "api/openapi/groups.yml"
- "groups/api/http/**"
users:
- ".github/workflows/api-tests.yml"
@@ -142,6 +161,16 @@ jobs:
checks: all
report: false
args: '--header "Authorization: Bearer ${{ env.USER_TOKEN }}" --contrib-openapi-formats-uuid --hypothesis-suppress-health-check=filter_too_much --stateful=links'
- name: Run Channels API tests
if: steps.changes.outputs.channels == 'true'
uses: schemathesis/action@v1
with:
schema: api/openapi/channels.yml
base-url: ${{ env.CHANNELS_URL }}
checks: all
report: false
args: '--header "Authorization: Bearer ${{ env.USER_TOKEN }}" --contrib-openapi-formats-uuid --hypothesis-suppress-health-check=filter_too_much --stateful=links'
- name: Run HTTP Adapter API tests
if: steps.changes.outputs.http == 'true'
+6 -3
View File
@@ -5,7 +5,7 @@ SMQ_DOCKER_IMAGE_NAME_PREFIX ?= supermq
BUILD_DIR ?= build
SERVICES = auth users clients groups channels domains http coap ws postgres-writer postgres-reader timescale-writer \
timescale-reader cli bootstrap mqtt provision certs invitations journal
TEST_API_SERVICES = journal auth bootstrap certs http invitations notifiers provision readers clients users
TEST_API_SERVICES = journal auth bootstrap certs http invitations notifiers provision readers clients users channels groups domains
TEST_API = $(addprefix test_api_,$(TEST_API_SERVICES))
DOCKERS = $(addprefix docker_,$(SERVICES))
DOCKERS_DEV = $(addprefix docker_dev_,$(SERVICES))
@@ -168,7 +168,10 @@ define test_api_service
endef
test_api_users: TEST_API_URL := http://localhost:9002
test_api_clients: TEST_API_URL := http://localhost:9000
test_api_clients: TEST_API_URL := http://localhost:9006
test_api_domains: TEST_API_URL := http://localhost:9003
test_api_channels: TEST_API_URL := http://localhost:9005
test_api_groups: TEST_API_URL := http://localhost:9004
test_api_http: TEST_API_URL := http://localhost:8008
test_api_invitations: TEST_API_URL := http://localhost:9020
test_api_auth: TEST_API_URL := http://localhost:8189
@@ -264,4 +267,4 @@ run_addons: check_certs
done
run_live: check_certs
GOPATH=$(go env GOPATH) docker compose -f docker/docker-compose.yml -f docker/docker-compose-live.yaml --env-file docker/.env -p $(DOCKER_PROJECT) $(DOCKER_COMPOSE_COMMAND) $(args)
GOPATH=$(go env GOPATH) docker compose -f docker/docker-compose.yml -f docker/docker-compose-live.yaml --env-file docker/.env -p $(DOCKER_PROJECT) $(DOCKER_COMPOSE_COMMAND) $(args)
+1 -4
View File
@@ -421,9 +421,6 @@ components:
client_cert:
type: string
description: Client certificate.
client_key:
type: string
description: Key for the client_cert.
ca_cert:
type: string
description: Issuing CA certificate.
@@ -652,7 +649,7 @@ components:
content:
application/health+json:
schema:
$ref: "./schemas/HealthInfo.yml"
$ref: "./schemas/health_info.yml"
ConfigUpdateCertsRes:
description: Data retrieved. Config certs updated.
content:
+1 -1
View File
@@ -299,7 +299,7 @@ components:
content:
application/health+json:
schema:
$ref: "./schemas/HealthInfo.yml"
$ref: "./schemas/health_info.yml"
securitySchemes:
bearerAuth:
File diff suppressed because it is too large Load Diff
+429 -1119
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -161,7 +161,7 @@ components:
content:
application/health+json:
schema:
$ref: "./schemas/HealthInfo.yml"
$ref: "./schemas/health_info.yml"
securitySchemes:
bearerAuth:
+1 -1
View File
@@ -323,7 +323,7 @@ components:
content:
application/health+json:
schema:
$ref: "./schemas/HealthInfo.yml"
$ref: "./schemas/health_info.yml"
ServiceError:
description: Unexpected server-side error occurred.
+1 -1
View File
@@ -278,7 +278,7 @@ components:
content:
application/health+json:
schema:
$ref: "./schemas/HealthInfo.yml"
$ref: "./schemas/health_info.yml"
securitySchemes:
bearerAuth:
+1 -1
View File
@@ -115,7 +115,7 @@ components:
content:
application/health+json:
schema:
$ref: "./schemas/HealthInfo.yml"
$ref: "./schemas/health_info.yml"
securitySchemes:
bearerAuth:
+1 -1
View File
@@ -292,7 +292,7 @@ components:
content:
application/health+json:
schema:
$ref: "./schemas/HealthInfo.yml"
$ref: "./schemas/health_info.yml"
securitySchemes:
bearerAuth:
+257
View File
@@ -0,0 +1,257 @@
# Copyright (c) Abstract Machines
# SPDX-License-Identifier: Apache-2.0
components:
schemas:
NewRole:
type: object
properties:
role_id:
type: string
format: uuid
example: bb7edb32-2eac-4aad-aebe-ed96fe073879
description: Role unique identifier.
role_name:
type: string
description: Role's name.
example: "roleName"
entity_id:
type: string
format: uuid
example: bb7edb32-2eac-4aad-aebe-ed96fe073879
description: Entity unique identifier.
created_by:
type: string
format: uuid
example: bb7edb32-2eac-4aad-aebe-ed96fe073879
description: Role creator unique identifier.
created_at:
type: string
format: date-time
example: "2019-11-26 13:31:52"
description: Time when the channel was created.
updated_by:
type: string
format: uuid
example: ""
description: Role updater unique identifier.
updated_at:
type: string
format: date-time
example: ""
description: Time when the channel was created.
Role:
type: object
properties:
role_id:
type: string
format: uuid
example: bb7edb32-2eac-4aad-aebe-ed96fe073879
description: Role unique identifier.
role_name:
type: string
description: Role's name.
example: "roleName"
entity_id:
type: string
format: uuid
example: bb7edb32-2eac-4aad-aebe-ed96fe073879
description: Entity unique identifier.
created_by:
type: string
format: uuid
example: bb7edb32-2eac-4aad-aebe-ed96fe073879
description: Role creator unique identifier.
created_at:
type: string
format: date-time
example: "2019-11-26 13:31:52"
description: Time when the channel was created.
updated_by:
type: string
format: uuid
example: bb7edb32-2eac-4aad-aebe-ed96fe073879
description: Role updater unique identifier.
updated_at:
type: string
format: date-time
example: "2019-11-26 13:31:52"
description: Time when the channel was created.
CreateRoleObj:
type: object
properties:
role_name:
type: string
description: Role's name.
example: "roleName"
optional_actions:
type: array
description: List of optional actions.
items:
type: string
example:
[
"read",
"update",
]
optional_members:
type: array
minItems: 0
description: List of optional members.
items:
type: string
example:
[
"5dc1ce4b-7cc9-4f12-98a6-9d74cc4980bb",
"c01ed106-e52d-4aa4-bed3-39f360177cfa",
]
UpdateRoleObj:
type: object
properties:
name:
type: string
description: Role's name.
RolesPage:
type: object
properties:
roles:
type: array
items:
$ref: '#/components/schemas/Role'
description: List of roles.
total:
type: integer
description: Total number of roles.
example: 1
offset:
type: integer
description: Number of items to skip during retrieval.
limit:
type: integer
example: 10
description: Maximum number of items to return in one page.
RoleActionsObj:
type: object
properties:
actions:
type: array
description: List of actions to be added to a role.
items:
type: string
example:
[
"read",
"update",
]
RoleMembersObj:
type: object
properties:
members:
type: array
description: List of members to be added to a role.
items:
type: string
example:
[
"5dc1ce4b-7cc9-4f12-98a6-9d74cc4980bb",
"c01ed106-e52d-4aa4-bed3-39f360177cfa",
]
parameters:
RoleName:
name: roleName
description: Role's name.
in: path
schema:
type: string
required: true
example: "roleName"
requestBodies:
CreateRoleReq:
description: JSON- formatted object decsribing a new role to be created.
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateRoleObj'
UpdateRoleReq:
description: JSON- formatted object decsribing a role to be updated.
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/UpdateRoleObj'
AddRoleActionsReq:
description: JSON- formatted object decsribing an action to be added to a role.
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/RoleActionsObj'
AddRoleMembersReq:
description: JSON- formatted object decsribing a member to be added to a role.
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/RoleMembersObj'
responses:
CreateRoleRes:
description: Role created successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/NewRole'
ListRolesRes:
description: Role retrieved successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/RolesPage'
GetRoleRes:
description: Role retrieved successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/Role'
AddRoleActionsRes:
description: Action added to role successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/RoleActionsObj'
ListRoleActionsRes:
description: Role actions retrieved successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/RoleActionsObj'
AddRoleMembersRes:
description: Member added to role successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/RoleMembersObj'
ListRoleMembersRes:
description: Role members retrieved successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/RoleMembersObj'
+1 -1
View File
@@ -417,7 +417,7 @@ components:
content:
application/health+json:
schema:
$ref: "./schemas/HealthInfo.yml"
$ref: "./schemas/health_info.yml"
securitySchemes:
bearerAuth:
+4 -1
View File
@@ -193,7 +193,10 @@ func EncodeError(_ context.Context, err error, w http.ResponseWriter) {
errors.Contains(err, apiutil.ErrSelfParentingNotAllowed),
errors.Contains(err, apiutil.ErrMissingChildrenGroupIDs),
errors.Contains(err, apiutil.ErrMissingParentGroupID),
errors.Contains(err, apiutil.ErrMissingConnectionType):
errors.Contains(err, apiutil.ErrMissingConnectionType),
errors.Contains(err, apiutil.ErrMissingRoleName),
errors.Contains(err, apiutil.ErrMissingPolicyEntityType),
errors.Contains(err, apiutil.ErrMissingRoleMembers):
err = unwrap(err)
w.WriteHeader(http.StatusBadRequest)