openapi: 3.0.0
servers: []
info:
  description: ''
  version: 1.0.0
  title: Audit Module API
  termsOfService: 'http://www.belladati.com'
  contact:
    email: developer@belladati.com
    name: Developer @ Belladati
tags: []
paths:
  /auth/token:
    post:
      description: Issue JWT token
      operationId: authTokenPost
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserPassword'
      responses:
        '200':
          description: Authentication successful
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Token'
        '401':
          description: Authentication failed

  /pause:
    get:
      summary: Pause module
      description: ''
      parameters:
        - name: name
          in: query
          required: true
          schema:
            type: string
      operationId: pause
      responses:
        '200':
          description: Pause OK
        '400':
          description: Invalid module name
  /resume:
    get:
      summary: Resume module
      description: ''
      parameters:
        - name: name
          in: query
          required: true
          schema:
            type: string
      operationId: resume
      responses:
        '200':
          description: Resume OK
          content:
            application/json:
              schema: {}
        '400':
          description: Invalid module name
  /shutdown:
    get:
      summary: Shutdown the host
      description: Will issue a system command to turn of the host
      operationId: shutdown
      responses:
        '200':
          description: Shutdown OK
          content:
            application/json:
              schema: {}
        '400':
          description: Invalid module name
  /restart:
    get:
      summary: Restart the host
      description: Will issue a system command to restart the host
      operationId: restart
      responses:
        '200':
          description: Restart OK
          content:
            application/json:
              schema: {}
        '400':
          description: Invalid module name
  /reload:
    post:
      summary: Reload module
      description: ''
      parameters:
        - name: name
          in: query
          required: true
          schema:
            type: string
      operationId: reload
      responses:
        '200':
          description: Reload OK
          content:
            application/json:
              schema: {}
        '400':
          description: Invalid module name
  /status:
    get:
      summary: ''
      description: ''
      parameters: []
      operationId: status
      responses:
        '200':
          description: Status response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StatusResponse'
  /config:
    post:
      description: Handle post config for existing module
      parameters:
        - name: name
          in: query
          required: true
          schema:
            type: string
      operationId: config
      responses:
        '200':
          description: Config OK
        '400':
          description: Config error
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AnyValue'
        description: Config JSON
  /module:
    post:
      description: Handle adding new module with config
      parameters:
        - name: name
          description: Name of the main module to add this new module into, use /mainmodules to get name of mainmodules
          in: query
          required: true
          schema:
            type: string
      operationId: modulePost
      requestBody:
        required: true
        description: Config JSON in various forms
        content:
          text/plain:
            schema:
              type: string
              description: Config JSON as plain string
          application/json:
            schema:
              $ref: '#/components/schemas/AnyValue'
              description: Config JSON
      responses:
        '200':
          description: Post config OK
        '400':
          description: Post config error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AnyValue'
    delete:
      description: Delete module
      parameters:
        - name: name
          description: Main module name
          in: query
          schema:
            type: string
        - name: moduleName
          description: Module name
          in: query
          schema:
            type: string
      operationId: moduleDelete
      responses:
        '200':
          description: Delete module
        '400':
          description: Delete module error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AnyValue'
    get:
      description: Get module status
      operationId: moduleGet
      parameters:
        - name: name
          description: Module name
          in: query
          schema:
            type: string
      responses:
        '404':
          description: Module not found
        '200':
          description: Module status
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModuleStatusResponse'
  /modules:
    get:
      description: List all connected modules and information about them, including audit itself
      operationId: modules
      responses:
        '200':
          description: OK response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModulesResponse'
  /mainmodules:
    get:
      description: Lists main modules and their submodules, typically there will be 2 main modules - GEN_SENDER and GEN_RECEIVER and one submodule for each
      operationId: mainmodules
      responses:
        200:
          description: Get main modules OK response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MainmodulesResponse'
  /setlicense:
    post:
      description: Propagates license from audit to all modules
      operationId: setlicense
      responses:
        200:
          description: Set license OK
  /user:
    post:
      description: Add or update user
      operationId: userPost
      parameters:
        - name: name
          description: Submodule name to post user to, not required
          in: query
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserRequest'
      responses:
        '200':
          description: Post user OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserPostResponse'
        '400':
          description: Post user error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AnyValue'
    delete:
      description: Delete user
      operationId: userDelete
      parameters:
        - name: name
          description: Submodule name to post user to, not required
          in: query
          schema:
            type: string
        - name: username
          in: query
          schema:
            type: string
      responses:
        '200':
          description: Delete user OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserPostResponse'
        '400':
          description: Delete user error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AnyValue'
  /sensors:
    get:
      description: Get sensors
      operationId: sensors
      responses:
        '200':
          description: Sensors statuses
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AnyValue'              
  /data:
    parameters:
      - name: name
        in: query
        required: true
        schema:
          type: string
      - name: start
        in: query
        schema:
          type: integer
      - name: limit
        in: query
        schema:
          type: integer
      - name: order
        in: query
        schema:
          type: string
    get:
      description: Get receiver data
      operationId: dataGet
      responses:
        '200':
          description: Data from receiver
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AnyValue'
    delete:
      description: Delete receiver data, produces query DELETE FROM ... WHERE id > start AND id <= stop AND rownum() <= limit
      operationId: dataDelete
      parameters:
        - in: query
          name: start
          schema:
            type: integer
        - in: query
          name: stop
          schema:
            type: integer
        - in: query
          name: limit
          schema:
            type: integer
      responses:
        '200':
          description: Data deleted
          content:
            text/plain:
              schema:
                type: integer
                description: Number of deleted message

  /module/{moduleName}:
    parameters:
      - in: path
        name: moduleName
        description: Module name
        schema:
          type: string
        required: true
    get:
      description: Get module status
      operationId: moduleStatus
      responses:
        '404':
          description: Module not found
        '200':
          description: Module status
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModuleStatusResponse'

  /module/{moduleName}/pause:
    get:
      description: Pause module
      operationId: modulePause
      parameters:
        - in: path
          name: moduleName
          schema:
            type: string
          required: true
      responses:
        '200':
          description: Module paused

  /module/{moduleName}/resume:
    get:
      description: Resume module
      operationId: moduleResume
      parameters:
        - in: path
          name: moduleName
          schema:
            type: string
          required: true
      responses:
        '200':
          description: Module resumed

  /module/{moduleName}/reload:
    get:
      description: Reload module config
      operationId: moduleReload
      parameters:
        - in: path
          name: moduleName
          schema:
            type: string
          required: true
      responses:
        '200':
          description: Module reload
    post:
      description: Reload module config
      operationId: moduleReloadPost
      parameters:
        - in: path
          name: moduleName
          schema:
            type: string
          required: true
      responses:
        '200':
          description: Module reload

  /module/{moduleName}/logs:
    get:
      description: Module logs
      operationId: moduleLogs
      parameters:
        - in: path
          name: moduleName
          schema:
            type: string
          required: true
      responses:
        '200':
          description: Plain text logs
          content:
            text/plain:
              schema:
                type: string

  /module/{moduleName}/users:
    post:
      description: Add new user to a module
      operationId: moduleUsersPost
      parameters:
        - in: path
          name: moduleName
          schema:
            type: string
          required: true
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserRequest'
      responses:
        '200':
          description: User was added successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserPostResponse'

  /module/{moduleName}/users/{username}:
    delete:
      description: Delete user from a module
      operationId: moduleUsersDelete
      parameters:
        - in: path
          name: moduleName
          schema:
            type: string
          required: true
        - in: path
          name: username
          schema:
            type: string
          required: true
      responses:
        '200':
          description: User was deleted successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserPostResponse'

  /receivers/{moduleName}/data:
    parameters:
      - in: path
        name: moduleName
        schema:
          type: string
        required: true
    get:
      description: Get list of the current messages
      operationId: receiverDataGet
      responses:
        '200':
          description: Current receiever data that receiver has received and has not been deleted yet
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AnyValue'
    delete:
      description: Delete receiver data
      operationId: receiverDataDelete
      parameters:
        - in: query
          name: start
          schema:
            type: integer
        - in: query
          name: stop
          schema:
            type: integer
        - in: query
          name: limit
          schema:
            type: integer
      responses:
        '200':
          description: Data deleted
          content:
            text/plain:
              schema:
                type: integer
                description: Number of deleted message

  /devices:
    get:
      description: List all connected devices
      operationId: devicesGet
      parameters:
        - in: query
          name: receiver_id
          description: Filter list by receiver
          schema:
            type: string
        - in: query
          name: device_id
          description: Filter list by device ID
          schema:
            type: string
        - in: query
          name: start
          description: Filter list by timestamp from
          schema:
            type: string
        - in: query
          name: stop
          description: Filter list by timestamp to
          schema:
            type: string
        - in: query
          name: sensor_id
          description: Filter list by sensor
          schema:
            type: string
        - in: query
          name: order
          description: List order by device ID, choose direction
          schema:
            type: string
            enum:
              - ASC
              - DESC
      responses:
        '200':
          description: Filtered list of devices
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DevicesList'

  /deviceGroups:
    get:
      description: List of defined device groups
      operationId: deviceGroupsGet
      responses:
        '200':
          description: Filtered list of devices
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeviceGroups'
    post:
      description: Create new device group
      operationId: deviceGroupsPost
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeviceGroup'
      responses:
        '200':
          description: Device group has been created

  /deviceGroups/{id}:
    delete:
      description: Delete device group
      operationId: deviceGroupsDelete
      parameters:
        - in: path
          name: id
          description: Filter list by receiver
          schema:
            type: integer
      responses:
        '200':
          description: Device group has been deleted



  /logs:
    get:
      description: Fetch module logs
      operationId: logs
      parameters:
        - in: query
          name: name
          schema:
            type: string
          required: true
        - in: query
          name: position
          schema:
              type: integer
        - in: query
          name: count
          schema:
              type: integer
      responses:
        '200':
          description: Plain text logs
          content:
            text/plain:
              schema:
                type: string

  /logout:
    get:
      description: Logout user from module
      operationId: logout
      responses:
        '401':
          description: User was logged out

components:
  schemas:
    AnyValue: {}
    Users:
      type: object
      properties:
        username:
          type: string
        roles:
          type: array
          items:
            type: String
    StatusResponse:
      type: object
      properties:
        type:
          type: string
        name:
          type: string
        version:
          type: string
        status:
          type: string
        totalSensors:
          type: int
        datetime:
          type: string
        timestamp:
          type: string
        localMemberUUID:
          type: string
        clusterMembersUUID:
          type: array
          items:
            type: string
        sid:
          type: string
        licenseValid:
          type: string
        licenseError:
          type: string
        startupError:
          type: string
        config:
          type: AnyValue
        users:
          type: Users
    MainmodulesResponse:
      type: array
      items:
        type: AnyValue
    UserRequest:
      type: object
      properties:
        username:
          type: string
        password:
          type: string
        role:
          type: string
    UserPostResponse:
      type: object
      properties:
        username:
          type: string
        result:
          type: string
          enum:
            - ok
            - error
        error:
          type: string
    UserResponse:
      type: object
      properties:
        username:
          type: string
        password:
          type: string
        roles:
          type: array
          items:
            type: string
    AuthResponse:
      type: object
      properties:
        drop:
          type: boolean
        enabled:
          type: boolean
        merge:
          type: boolean
        users:
          type: array
          items:
            type: UserResponse
    ModuleStatusResponse:
      type: object
      properties:
        config:
          description: Module specific configuration, includes auth settings, every module has a different response
          type: AnyValue
        status:
          description: Module specific status information, with some common properties like status or name
          type: AnyValue
    ModulesResponse:
      type: array
      items:
        type: ModuleResponseArrayItem
    ModuleResponseArrayItem:
      type: object
      properties:
        name:
          type: string
        registration:
          type: string
        status:
          enum:
            - UP
            - PAUSED
            - TO_PAUSED
        type:
          type: string
        location:
          type: object
          properties:
            endpoint:
              type: string
            host:
              type: string
            port:
              type: integer
            root:
              type: string
            ssl:
              type: boolean
        metadata:
          type: object
          properties:
            type:
              type: string

    DevicesList:
      type: array
      items:
        type: object
        properties:
          id:
            type: integer
          json:
            type: string
          receiver_id:
            type: string
          sensor_id:
            type: string
          timestamp:
            type: number

    DeviceGroups:
      type: array
      items:
        type: DeviceGroup

    DeviceGroup:
      type: object
      properties:
        id:
          type: string
        type:
          type: string
          description: Type assignment method
          enum:
            - IP_BASED
            - CERTIFICATE_BASED
            - TOPIC_BASED
            - ID_BASED
            - RECEIVER_BASED
            - MANUAL
        typeValue:
          type: string
          description: >
            IP range (comma separated), for IP_BASED
            Certificate (PEM format), for CERTIFICATE_BASED
            Select receiver, for RECEIVER_BASED
            Device IDs (comma separated). for ID_BASED
            MQTT topic name, for TOPIC_BASED
        deviceType:
          type: integer
          description: ID of device type

    UserPassword:
      type: object
      properties:
        username:
          type: string
        password:
          type: string

    Token:
      type: object
      properties:
        token:
          type: string






openapi: 3.0.0
servers: []
info:
  description: ''
  version: 1.0.0
  title: Audit Module API
  termsOfService: 'http://www.belladati.com'
  contact:
    email: developer@belladati.com
    name: Developer @ Belladati
tags: []
paths:
  /auth/token:
    post:
      description: Issue JWT token
      operationId: authTokenPost
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserPassword'
      responses:
        '200':
          description: Authentication successful
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Token'
        '401':
          description: Authentication failed

  /pause:
    get:
      summary: Pause module
      description: ''
      parameters:
        - name: name
          in: query
          required: true
          schema:
            type: string
      operationId: pause
      responses:
        '200':
          description: Pause OK
        '400':
          description: Invalid module name
  /resume:
    get:
      summary: Resume module
      description: ''
      parameters:
        - name: name
          in: query
          required: true
          schema:
            type: string
      operationId: resume
      responses:
        '200':
          description: Resume OK
          content:
            application/json:
              schema: {}
        '400':
          description: Invalid module name
  /shutdown:
    get:
      summary: Shutdown the host
      description: Will issue a system command to turn of the host
      operationId: shutdown
      responses:
        '200':
          description: Shutdown OK
          content:
            application/json:
              schema: {}
        '400':
          description: Invalid module name
  /restart:
    get:
      summary: Restart the host
      description: Will issue a system command to restart the host
      operationId: restart
      responses:
        '200':
          description: Restart OK
          content:
            application/json:
              schema: {}
        '400':
          description: Invalid module name
  /reload:
    post:
      summary: Reload module
      description: ''
      parameters:
        - name: name
          in: query
          required: true
          schema:
            type: string
      operationId: reload
      responses:
        '200':
          description: Reload OK
          content:
            application/json:
              schema: {}
        '400':
          description: Invalid module name
  /status:
    get:
      summary: ''
      description: ''
      parameters: []
      operationId: status
      responses:
        '200':
          description: Status response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StatusResponse'
  /config:
    post:
      description: Handle post config for existing module
      parameters:
        - name: name
          in: query
          required: true
          schema:
            type: string
      operationId: config
      responses:
        '200':
          description: Config OK
        '400':
          description: Config error
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AnyValue'
        description: Config JSON
  /module:
    post:
      description: Handle adding new module with config
      parameters:
        - name: name
          description: Name of the main module to add this new module into, use /mainmodules to get name of mainmodules
          in: query
          required: true
          schema:
            type: string
      operationId: modulePost
      requestBody:
        required: true
        description: Config JSON in various forms
        content:
          text/plain:
            schema:
              type: string
              description: Config JSON as plain string
          application/json:
            schema:
              $ref: '#/components/schemas/AnyValue'
              description: Config JSON
      responses:
        '200':
          description: Post config OK
        '400':
          description: Post config error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AnyValue'
    delete:
      description: Delete module
      parameters:
        - name: name
          description: Main module name
          in: query
          schema:
            type: string
        - name: moduleName
          description: Module name
          in: query
          schema:
            type: string
      operationId: moduleDelete
      responses:
        '200':
          description: Delete module
        '400':
          description: Delete module error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AnyValue'
    get:
      description: Get module status
      operationId: moduleGet
      parameters:
        - name: name
          description: Module name
          in: query
          schema:
            type: string
      responses:
        '404':
          description: Module not found
        '200':
          description: Module status
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModuleStatusResponse'
  /modules:
    get:
      description: List all connected modules and information about them, including audit itself
      operationId: modules
      responses:
        '200':
          description: OK response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModulesResponse'
  /mainmodules:
    get:
      description: Lists main modules and their submodules, typically there will be 2 main modules - GEN_SENDER and GEN_RECEIVER and one submodule for each
      operationId: mainmodules
      responses:
        200:
          description: Get main modules OK response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MainmodulesResponse'
  /setlicense:
    post:
      description: Propagates license from audit to all modules
      operationId: setlicense
      responses:
        200:
          description: Set license OK
  /user:
    post:
      description: Add or update user
      operationId: userPost
      parameters:
        - name: name
          description: Submodule name to post user to, not required
          in: query
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserRequest'
      responses:
        '200':
          description: Post user OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserPostResponse'
        '400':
          description: Post user error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AnyValue'
    delete:
      description: Delete user
      operationId: userDelete
      parameters:
        - name: name
          description: Submodule name to post user to, not required
          in: query
          schema:
            type: string
        - name: username
          in: query
          schema:
            type: string
      responses:
        '200':
          description: Delete user OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserPostResponse'
        '400':
          description: Delete user error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AnyValue'
  /sensors:
    get:
      description: Get sensors
      operationId: sensors
      responses:
        '200':
          description: Sensors statuses
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AnyValue'              
  /data:
    parameters:
      - name: name
        in: query
        required: true
        schema:
          type: string
      - name: start
        in: query
        schema:
          type: integer
      - name: limit
        in: query
        schema:
          type: integer
      - name: order
        in: query
        schema:
          type: string
    get:
      description: Get receiver data
      operationId: dataGet
      responses:
        '200':
          description: Data from receiver
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AnyValue'
    delete:
      description: Delete receiver data, produces query DELETE FROM ... WHERE id > start AND id <= stop AND rownum() <= limit
      operationId: dataDelete
      parameters:
        - in: query
          name: start
          schema:
            type: integer
        - in: query
          name: stop
          schema:
            type: integer
        - in: query
          name: limit
          schema:
            type: integer
      responses:
        '200':
          description: Data deleted
          content:
            text/plain:
              schema:
                type: integer
                description: Number of deleted message

  /module/{moduleName}:
    parameters:
      - in: path
        name: moduleName
        description: Module name
        schema:
          type: string
        required: true
    get:
      description: Get module status
      operationId: moduleStatus
      responses:
        '404':
          description: Module not found
        '200':
          description: Module status
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ModuleStatusResponse'

  /module/{moduleName}/pause:
    get:
      description: Pause module
      operationId: modulePause
      parameters:
        - in: path
          name: moduleName
          schema:
            type: string
          required: true
      responses:
        '200':
          description: Module paused

  /module/{moduleName}/resume:
    get:
      description: Resume module
      operationId: moduleResume
      parameters:
        - in: path
          name: moduleName
          schema:
            type: string
          required: true
      responses:
        '200':
          description: Module resumed

  /module/{moduleName}/reload:
    get:
      description: Reload module config
      operationId: moduleReload
      parameters:
        - in: path
          name: moduleName
          schema:
            type: string
          required: true
      responses:
        '200':
          description: Module reload
    post:
      description: Reload module config
      operationId: moduleReloadPost
      parameters:
        - in: path
          name: moduleName
          schema:
            type: string
          required: true
      responses:
        '200':
          description: Module reload

  /module/{moduleName}/logs:
    get:
      description: Module logs
      operationId: moduleLogs
      parameters:
        - in: path
          name: moduleName
          schema:
            type: string
          required: true
      responses:
        '200':
          description: Plain text logs
          content:
            text/plain:
              schema:
                type: string

  /module/{moduleName}/users:
    post:
      description: Add new user to a module
      operationId: moduleUsersPost
      parameters:
        - in: path
          name: moduleName
          schema:
            type: string
          required: true
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserRequest'
      responses:
        '200':
          description: User was added successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserPostResponse'

  /module/{moduleName}/users/{username}:
    delete:
      description: Delete user from a module
      operationId: moduleUsersDelete
      parameters:
        - in: path
          name: moduleName
          schema:
            type: string
          required: true
        - in: path
          name: username
          schema:
            type: string
          required: true
      responses:
        '200':
          description: User was deleted successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserPostResponse'

  /receivers/{moduleName}/data:
    parameters:
      - in: path
        name: moduleName
        schema:
          type: string
        required: true
    get:
      description: Get list of the current messages
      operationId: receiverDataGet
      responses:
        '200':
          description: Current receiever data that receiver has received and has not been deleted yet
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AnyValue'
    delete:
      description: Delete receiver data
      operationId: receiverDataDelete
      parameters:
        - in: query
          name: start
          schema:
            type: integer
        - in: query
          name: stop
          schema:
            type: integer
        - in: query
          name: limit
          schema:
            type: integer
      responses:
        '200':
          description: Data deleted
          content:
            text/plain:
              schema:
                type: integer
                description: Number of deleted message

  /devices:
    get:
      description: List all connected devices
      operationId: devicesGet
      parameters:
        - in: query
          name: receiver_id
          description: Filter list by receiver
          schema:
            type: string
        - in: query
          name: device_id
          description: Filter list by device ID
          schema:
            type: string
        - in: query
          name: start
          description: Filter list by timestamp from
          schema:
            type: string
        - in: query
          name: stop
          description: Filter list by timestamp to
          schema:
            type: string
        - in: query
          name: sensor_id
          description: Filter list by sensor
          schema:
            type: string
        - in: query
          name: order
          description: List order by device ID, choose direction
          schema:
            type: string
            enum:
              - ASC
              - DESC
      responses:
        '200':
          description: Filtered list of devices
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DevicesList'

  /deviceGroups:
    get:
      description: List of defined device groups
      operationId: deviceGroupsGet
      responses:
        '200':
          description: Filtered list of devices
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeviceGroups'
    post:
      description: Create new device group
      operationId: deviceGroupsPost
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeviceGroup'
      responses:
        '200':
          description: Device group has been created

  /deviceGroups/{id}:
    delete:
      description: Delete device group
      operationId: deviceGroupsDelete
      parameters:
        - in: path
          name: id
          description: Filter list by receiver
          schema:
            type: integer
      responses:
        '200':
          description: Device group has been deleted



  /logs:
    get:
      description: Fetch module logs
      operationId: logs
      parameters:
        - in: query
          name: name
          schema:
            type: string
          required: true
        - in: query
          name: position
          schema:
              type: integer
        - in: query
          name: count
          schema:
              type: integer
      responses:
        '200':
          description: Plain text logs
          content:
            text/plain:
              schema:
                type: string

  /logout:
    get:
      description: Logout user from module
      operationId: logout
      responses:
        '401':
          description: User was logged out

components:
  schemas:
    AnyValue: {}
    Users:
      type: object
      properties:
        username:
          type: string
        roles:
          type: array
          items:
            type: String
    StatusResponse:
      type: object
      properties:
        type:
          type: string
        name:
          type: string
        version:
          type: string
        status:
          type: string
        totalSensors:
          type: int
        datetime:
          type: string
        timestamp:
          type: string
        localMemberUUID:
          type: string
        clusterMembersUUID:
          type: array
          items:
            type: string
        sid:
          type: string
        licenseValid:
          type: string
        licenseError:
          type: string
        startupError:
          type: string
        config:
          type: AnyValue
        users:
          type: Users
    MainmodulesResponse:
      type: array
      items:
        type: AnyValue
    UserRequest:
      type: object
      properties:
        username:
          type: string
        password:
          type: string
        role:
          type: string
    UserPostResponse:
      type: object
      properties:
        username:
          type: string
        result:
          type: string
          enum:
            - ok
            - error
        error:
          type: string
    UserResponse:
      type: object
      properties:
        username:
          type: string
        password:
          type: string
        roles:
          type: array
          items:
            type: string
    AuthResponse:
      type: object
      properties:
        drop:
          type: boolean
        enabled:
          type: boolean
        merge:
          type: boolean
        users:
          type: array
          items:
            type: UserResponse
    ModuleStatusResponse:
      type: object
      properties:
        config:
          description: Module specific configuration, includes auth settings, every module has a different response
          type: AnyValue
        status:
          description: Module specific status information, with some common properties like status or name
          type: AnyValue
    ModulesResponse:
      type: array
      items:
        type: ModuleResponseArrayItem
    ModuleResponseArrayItem:
      type: object
      properties:
        name:
          type: string
        registration:
          type: string
        status:
          enum:
            - UP
            - PAUSED
            - TO_PAUSED
        type:
          type: string
        location:
          type: object
          properties:
            endpoint:
              type: string
            host:
              type: string
            port:
              type: integer
            root:
              type: string
            ssl:
              type: boolean
        metadata:
          type: object
          properties:
            type:
              type: string

    DevicesList:
      type: array
      items:
        type: object
        properties:
          id:
            type: integer
          json:
            type: string
          receiver_id:
            type: string
          sensor_id:
            type: string
          timestamp:
            type: number

    DeviceGroups:
      type: array
      items:
        type: DeviceGroup

    DeviceGroup:
      type: object
      properties:
        id:
          type: string
        type:
          type: string
          description: Type assignment method
          enum:
            - IP_BASED
            - CERTIFICATE_BASED
            - TOPIC_BASED
            - ID_BASED
            - RECEIVER_BASED
            - MANUAL
        typeValue:
          type: string
          description: >
            IP range (comma separated), for IP_BASED
            Certificate (PEM format), for CERTIFICATE_BASED
            Select receiver, for RECEIVER_BASED
            Device IDs (comma separated). for ID_BASED
            MQTT topic name, for TOPIC_BASED
        deviceType:
          type: integer
          description: ID of device type

    UserPassword:
      type: object
      properties:
        username:
          type: string
        password:
          type: string

    Token:
      type: object
      properties:
        token:
          type: string