# Copyright (c) Abstract Machines
# SPDX-License-Identifier: Apache-2.0

asyncapi: '2.6.0'
id: 'https://github.com/absmach/supermq/blob/main/api/asyncapi/mqtt.yaml'
info:
  title: SuperMQ MQTT Adapter
  version: '0.18.0'
  contact:
    name: SuperMQ Team
    url: 'https://github.com/absmach/supermq'
    email: info@abstractmachines.fr
  description: |
    MQTT adapter provides an MQTT API for sending messages through the platform. MQTT adapter uses [mProxy](https://github.com/absmach/mproxy) for proxying traffic between client and MQTT broker.
    Additionally, the MQTT adapter and the message broker are replicating the traffic between brokers.

  license:
    name: Apache 2.0
    url: 'https://github.com/absmach/supermq/blob/main/LICENSE'


defaultContentType: application/json

servers:
  dev:
    url: localhost:{port}
    protocol: mqtt
    description: Test broker
    variables:
      port:
        description: Secure connection (TLS) is available through port 8883.
        default: '1883'
        enum:
          - '1883'
          - '8883'
    security:
      - user-password: []

channels:
  /m/{domainPrefix}/c/{channelPrefix}/{subtopic}:
    parameters:
      domainPrefix:
        $ref: '#/components/parameters/domainPrefix'
        in: path
        required: true
      channelPrefix:
        $ref: '#/components/parameters/channelPrefix'
        in: path
        required: true
      subtopic:
        $ref: '#/components/parameters/subtopic'
        in: path
        required: false

    publish:
      traits:
        - $ref: '#/components/operationTraits/mqtt'
      message:
        $ref: '#/components/messages/jsonMsg'
    subscribe:
      traits:
        - $ref: '#/components/operationTraits/mqtt'
      message:
        $ref: '#/components/messages/jsonMsg'

components:
  messages:
    jsonMsg:
      title: JSON Message
      summary: Arbitrary JSON array or object.
      contentType: application/json
      payload:
        $ref: "#/components/schemas/jsonMsg"

  schemas:
    jsonMsg:
      type: object
      description: Arbitrary JSON object or array. SenML format is recommended.
      example: |
        ### SenML
        ```json
        [{"bn":"some-base-name:","bt":1641646520, "bu":"A","bver":5, "n":"voltage","u":"V","v":120.1}, {"n":"current","t":-5,"v":1.2}, {"n":"current","t":-4,"v":1.3}]
        ```
        ### JSON
        ```json
        {"field_1":"val_1", "t": 1641646525}
        ```
        ### JSON Array
        ```json
        [{"field_1":"val_1", "t": 1641646520},{"field_2":"val_2", "t": 1641646522}]
        ```

  parameters:
    domainPrefix:
      description: ID or route of the domain associated with the channel and client.
      schema:
        type: string
    channelPrefix:
      description: ID or route of the channel connected to the Client ID defined in the username.
      schema:
        type: string
    subtopic:
      description: Arbitrary message subtopic.
      schema:
        type: string
        default: ''

  securitySchemes:
    user-password:
      type: userPassword
      description: |
        username is client ID connected to the channel defined in the mqtt topic and
        password is client secret corresponding to the client ID

  operationTraits:
    mqtt:
      bindings:
        mqtt:
          qos: 2
