asyncapi: 3.0.0
info:
  title: Streetlights API
  version: 1.0.0
  description: "The Smartylighting Streetlights API allows you to remotely manage the city lights.\n\n### Check out its awesome features:\n\n* Turn a specific streetlight on/off \U0001F303\n* Dim a specific streetlight \U0001F60E\n* Receive real-time information about environmental lighting conditions \U0001F4C8\n"
  license:
    name: Apache 2.0
    url: 'https://www.apache.org/licenses/LICENSE-2.0'
defaultContentType: application/json
servers:
  production:
    host: 'test.mosquitto.org:{port}'
    protocol: mqtt
    description: Test broker
    variables:
      port:
        description: Secure connection (TLS) is available through port 8883.
        default: '1883'
        enum:
          - '1883'
          - '8883'
channels:
  'smartylighting/streetlights/1/0/event/{streetlightId}/lighting/measured':
    address: 'smartylighting/streetlights/1/0/event/{streetlightId}/lighting/measured'
    messages:
      receiveLightMeasurement.message:
        $ref: '#/components/messages/lightMeasured'
    description: The topic on which measured values may be produced and consumed.
    parameters:
      streetlightId:
        $ref: '#/components/parameters/streetlightId'
  'smartylighting/streetlights/1/0/action/{streetlightId}/turn/on':
    address: 'smartylighting/streetlights/1/0/action/{streetlightId}/turn/on'
    messages:
      turnOn.message:
        $ref: '#/components/messages/turnOnOff'
    parameters:
      streetlightId:
        $ref: '#/components/parameters/streetlightId'
  'smartylighting/streetlights/1/0/action/{streetlightId}/turn/off':
    address: 'smartylighting/streetlights/1/0/action/{streetlightId}/turn/off'
    messages:
      turnOff.message:
        $ref: '#/components/messages/turnOnOff'
    parameters:
      streetlightId:
        $ref: '#/components/parameters/streetlightId'
  'smartylighting/streetlights/1/0/action/{streetlightId}/dim':
    address: 'smartylighting/streetlights/1/0/action/{streetlightId}/dim'
    messages:
      dimLight.message:
        $ref: '#/components/messages/dimLight'
    parameters:
      streetlightId:
        $ref: '#/components/parameters/streetlightId'
  some.channel:
    address: some.channel
    messages:
      subscribe.message.0:
        $ref: '#/components/messages/successMessage'
      subscribe.message.1:
        $ref: '#/components/messages/failureMessage'

  someRequest:
    address: "someRequest"
    description: ""
    messages:
      SomeRequestReceive:
        $ref: "#/components/messages/SomeRequestReceive"

  someRequestReply:
    address: null
    messages:
      SomeRequestSend:
        $ref: "#/components/messages/SomeRequestSend"
  someSendRequest:
    address: "someRequest"
    description: ""
    messages:
      SomeRequestReceive:
        $ref: "#/components/messages/SomeRequestSend"
  someSendRequestReply:
    address: null
    messages:
      SomeSendRequestReply:
        $ref: "#/components/messages/SomeRequestReceive"
operations:
  receiveLightMeasurement:
    action: receive
    channel:
      $ref: >-
        #/channels/smartylighting~1streetlights~11~10~1event~1{streetlightId}~1lighting~1measured
    summary: >-
      Inform about environmental lighting conditions of a particular
      streetlight.
    description: |
      This is the description with **bold** text.

      On multiple lines.
    tags:
      - name: oparation-tag1
        externalDocs:
          description: External docs description 1
          url: 'https://www.asyncapi.com/'
      - name: oparation-tag2
        description: Description 2
        externalDocs:
          url: 'https://www.asyncapi.com/'
      - name: oparation-tag3
      - name: oparation-tag4
        description: Description 4
      - name: message-tag5
        externalDocs:
          url: 'https://www.asyncapi.com/'
    traits:
      - $ref: '#/components/operationTraits/kafka'
    messages:
      - $ref: '#/channels/smartylighting~1streetlights~11~10~1event~1{streetlightId}~1lighting~1measured/messages/receiveLightMeasurement.message'
  turnOn:
    action: send
    channel:
      $ref: >-
        #/channels/smartylighting~1streetlights~11~10~1action~1{streetlightId}~1turn~1on
    traits:
      - $ref: '#/components/operationTraits/kafka'
    messages:
      - $ref: '#/channels/smartylighting~1streetlights~11~10~1action~1{streetlightId}~1turn~1on/messages/turnOn.message'
  turnOff:
    action: send
    channel:
      $ref: >-
        #/channels/smartylighting~1streetlights~11~10~1action~1{streetlightId}~1turn~1off
    traits:
      - $ref: '#/components/operationTraits/kafka'
    messages:
      - $ref: '#/channels/smartylighting~1streetlights~11~10~1action~1{streetlightId}~1turn~1off/messages/turnOff.message'
  dimLight:
    action: send
    channel:
      $ref: >-
        #/channels/smartylighting~1streetlights~11~10~1action~1{streetlightId}~1dim
    traits:
      - $ref: '#/components/operationTraits/kafka'
    messages:
      - $ref: '#/channels/smartylighting~1streetlights~11~10~1action~1{streetlightId}~1dim/messages/dimLight.message'
  some.channel.subscribe:
    action: send
    channel:
      $ref: '#/channels/some.channel'
    description: this description shows in markdown
    messages:
      - $ref: '#/channels/some.channel/messages/subscribe.message.0'
      - $ref: '#/channels/some.channel/messages/subscribe.message.1'
  createSomeRequest:
    action: "receive"
    channel:
      $ref: "#/channels/someRequest"
    tags:
        - name: "response-reply"
    reply:
      address:
        location: "$message.payload#/replyTo"
      channel:
        $ref: "#/channels/someRequestReply"
  createSomeSendRequest:
    action: "send"
    channel:
      $ref: "#/channels/someSendRequest"
    tags:
        - name: "request-reply"
    reply:
      address:
        location: "$message.payload#/replyTo"
      channel:
        $ref: "#/channels/someSendRequestReply"
components:
  messages:
    lightMeasured:
      name: lightMeasured
      title: Light measured
      summary: >-
        Inform about environmental lighting conditions of a particular
        streetlight.
      contentType: application/json
      tags:
        - name: message-tag1
          externalDocs:
            description: External docs description 1
            url: 'https://www.asyncapi.com/'
        - name: message-tag2
          description: Description 2
          externalDocs:
            url: 'https://www.asyncapi.com/'
        - name: message-tag3
        - name: message-tag4
          description: Description 4
        - name: message-tag5
          externalDocs:
            url: 'https://www.asyncapi.com/'
      traits:
        - $ref: '#/components/messageTraits/commonHeaders'
      payload:
        $ref: '#/components/schemas/lightMeasuredPayload'
    turnOnOff:
      name: turnOnOff
      title: Turn on/off
      summary: Command a particular streetlight to turn the lights on or off.
      traits:
        - $ref: '#/components/messageTraits/commonHeaders'
      payload:
        $ref: '#/components/schemas/turnOnOffPayload'
    dimLight:
      name: dimLight
      title: Dim light
      summary: Command a particular streetlight to dim the lights.
      traits:
        - $ref: '#/components/messageTraits/commonHeaders'
      payload:
        $ref: '#/components/schemas/dimLightPayload'
    successMessage:
      name: Success
      payload:
        type: object
        properties:
          result:
            type: string
            examples:
              - success
    failureMessage:
      name: Failure
      payload:
        type: object
        properties:
          error:
            type: object
            properties:
              errorCode:
                type: integer
              errorMessage:
                type: string
        examples:
          - error:
              errorCode: 404
              errorMessage: Something messed up
    SomeRequestSend:
      name: SomeRequestSend
      payload:
        type: object
        properties:
          someId:
            type: integer
      correlationId:
        $ref: "#/components/correlationIds/someRequestCorrelationId"
    SomeRequestReceive:
      name: SomeRequestReceive
      payload:
        type: object
        properties:
          someId:
            type: integer
          someText:
            type: string
            examples:
              - some important text
      correlationId:
        $ref: "#/components/correlationIds/someRequestCorrelationId"
  schemas:
    lightMeasuredPayload:
      type: object
      properties:
        lumens:
          type: integer
          minimum: 0
          description: Light intensity measured in lumens.
          x-pi: false
        sentAt:
          $ref: '#/components/schemas/sentAt'
    turnOnOffPayload:
      type: object
      properties:
        command:
          type: string
          enum:
            - 'on'
            - 'off'
          description: Whether to turn on or off the light.
          x-pi: false
        sentAt:
          $ref: '#/components/schemas/sentAt'
    dimLightPayload:
      type: object
      properties:
        percentage:
          type: integer
          description: Percentage to which the light should be dimmed to.
          minimum: 0
          maximum: 100
        sentAt:
          $ref: '#/components/schemas/sentAt'
    sentAt:
      type: string
      format: date-time
      description: Date and time when the message was sent.
  securitySchemes:
    apiKey:
      type: apiKey
      in: user
      description: Provide your API key as the user and leave the password empty.
    supportedOauthFlows:
      type: oauth2
      description: Flows to support OAuth 2.0
      flows:
        implicit:
          authorizationUrl: 'https://authserver.example/auth'
          availableScopes:
            'streetlights:on': Ability to switch lights on
            'streetlights:off': Ability to switch lights off
            'streetlights:dim': Ability to dim the lights
        password:
          tokenUrl: 'https://authserver.example/token'
          availableScopes:
            'streetlights:on': Ability to switch lights on
            'streetlights:off': Ability to switch lights off
            'streetlights:dim': Ability to dim the lights
        clientCredentials:
          tokenUrl: 'https://authserver.example/token'
          availableScopes:
            'streetlights:on': Ability to switch lights on
            'streetlights:off': Ability to switch lights off
            'streetlights:dim': Ability to dim the lights
        authorizationCode:
          authorizationUrl: 'https://authserver.example/auth'
          tokenUrl: 'https://authserver.example/token'
          refreshUrl: 'https://authserver.example/refresh'
          availableScopes:
            'streetlights:on': Ability to switch lights on
            'streetlights:off': Ability to switch lights off
            'streetlights:dim': Ability to dim the lights
    openIdConnectWellKnown:
      type: openIdConnect
      openIdConnectUrl: 'https://authserver.example/.well-known'
  parameters:
    streetlightId:
      description: The ID of the streetlight.
  messageTraits:
    commonHeaders:
      headers:
        type: object
        properties:
          my-app-header:
            type: integer
            minimum: 0
            maximum: 100
  operationTraits:
    kafka:
      bindings:
        kafka:
          clientId:
            const: my-app-id
  correlationIds:
    someRequestCorrelationId:
      location: '$message.payload#/replyTo'
