swagger: '2.0'
info:
  title: API
  version: 1.0.1
  description: 'Схема API программного обеспечения Radius BlackMine системы точного позиционирования «РадиуСкан-Р».'
basePath: '/api/'
tags:
  - name: Сессия
  - name: Сотрудники/Транспорт
  - name: Пользователь
  - name: Горизонт
  - name: Считыватель
  - name: Цепочка
  - name: Загрузка
paths:
  #
  # РАЗДЕЛ Сессия
  #

  # Вход в систему
  /session/login:
    post:
      tags:
        - Сессия
      summary: Получить токен сессии (login)
      operationId: sessionlogin
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - in: body
          description: Данные для входа в систему.
          schema:
            type: object
            required:
              - login
              - password
            properties:
              login:
                type: string
              password:
                type: string
      responses:
        '200':
          description: Успешный вход в систему
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0619 },
                'success': 1,
                'token': '535c3112-c4b9-4f84-ab22-9258606b5159',
                'user':
                  {
                    'id': 1,
                    'login': 'admin',
                    'fio': 'Администратор',
                    'is_admin': true,
                    'email': null,
                    'path': null
                  }
              }
        '401':
          description: Не правильный логин или пароль!
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.044 },
                'success': 0,
                'message': 'Не правильный логин или пароль!'
              }

  # Выход из системы
  /session/logout:
    get:
      tags:
        - Сессия
      summary: Завершить сессию (logout)
      description: ''
      operationId: sessionlogout
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
      responses:
        default:
          description: Сессия завершена

  # Проверка сессии
  /session/check:
    get:
      tags:
        - Сессия
      summary: Проверить токен сессии
      description: ''
      operationId: sessioncheck
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
      responses:
        '200':
          description: Сессия активна
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0443 },
                'success': 1,
                'user':
                  {
                    'id': 1,
                    'login': 'admin',
                    'fio': 'Администратор',
                    'is_admin': true,
                    'email': null,
                    'path': null
                  }
              }
        '404':
          description: Сессия не найдена или завершена
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0395 },
                'success': 0,
                'message': 'Указанный токен не активен!'
              }

  #
  # РАЗДЕЛ Пользователь
  #

  # Пользователь
  /user:
    # Получить список
    get:
      tags:
        - Пользователь
      summary: Получить список всех пользователей
      description: ''
      operationId: userlist
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0594 },
                'success': 1,
                'data':
                  [
                    {
                      'id': 1,
                      'login': 'admin',
                      'fio': "\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440",
                      'is_admin': true,
                      'email': null,
                      'path': null
                    }
                  ]
              }
        '401':
          description: Требуется авторизация
    # Создать пользователя
    put:
      tags:
        - Пользователь
      summary: Создать нового пользователя
      operationId: usercreate
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - in: body
          description: Данные для добавления объекта.
          schema:
            type: object
            required:
              - login
              - password
              - fio
              - is_admin
            properties:
              fio:
                type: string
                description: Ф.И.О.
                example: 'Иванов Иван'
              login:
                type: string
                description: Логин
                example: 'ivan'
              email:
                type: string
                description: E-mail
                example: 'ivan@mail.ru'
              password:
                type: string
                description: Пароль
                example: 'IvanPass'
              is_admin:
                type: boolean
                description: Администратор?
                example: true
      responses:
        '201':
          description: Успешно добавлено
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.062 },
                'success': 1,
                'data':
                  {
                    'id': 2,
                    'login': 'ivan',
                    'fio': "\u0418\u0432\u0430\u043d\u043e\u0432 \u0418\u0432\u0430\u043d",
                    'is_admin': 'true',
                    'email': 'ivan@mail.ru',
                    'path': null
                  }
              }
        '400':
          description: Не валидные входные параметры./Не удалось сохранить объект./Пользователь с таким логином уже существует!
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Пользователь с таким логином уже существует!'
              }
        '401':
          description: Требуется авторизация

  # Пользователь по ID
  /user/:id:
    # Чтение одного
    get:
      tags:
        - Пользователь
      summary: Получить данные о пользователе по его ID
      operationId: userread
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - name: id
          in: query
          description: id user
          required: false
          explode: true
          schema:
            items:
              type: integer
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0574 },
                'success': 1,
                'data':
                  {
                    'id': 2,
                    'login': 'ivan',
                    'fio': "\u0418\u0432\u0430\u043d\u043e\u0432 \u0418\u0432\u0430\u043d",
                    'is_admin': 'true',
                    'email': 'ivan@mail.ru',
                    'path': null
                  }
              }
        '401':
          description: Требуется авторизация
        '404':
          description: Объект не найден
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Объект не найден'
              }
    # Изменение
    post:
      tags:
        - Пользователь
      summary: Изменить данные о пользователе по его ID
      description: ''
      operationId: userupdate
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - name: id
          in: query
          description: ID пользователя
          required: true
          explode: true
          schema:
            items:
              type: integer
        - in: body
          description: Данные для добавления объекта.
          schema:
            type: object
            required:
              - login
              - fio
            properties:
              fio:
                type: string
                description: Ф.И.О.
                example: 'Иванов Иван'
              login:
                type: string
                description: Логин
                example: 'ivan'
              email:
                type: string
                description: E-mail
                example: 'ivan@mail.ru'
              password:
                type: string
                description: Пароль
                example: 'IvanPass'
              is_admin:
                type: boolean
                description: Администратор?
                example: true
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.062 },
                'success': 1,
                'data':
                  {
                    'id': 2,
                    'login': 'ivan',
                    'fio': "\u0418\u0432\u0430\u043d\u043e\u0432 \u0418\u0432\u0430\u043d",
                    'is_admin': 'true',
                    'email': 'ivan@mail.ru',
                    'path': null
                  }
              }
        '400':
          description: Не валидные входные параметры./Не удалось сохранить объект.
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Не удалось сохранить объект.'
              }
        '401':
          description: Требуется авторизация
        '404':
          description: Объект не найден
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Объект не найден'
              }
    # Удаление
    delete:
      tags:
        - Пользователь
      summary: Удалить пользователя по его ID
      description: ''
      operationId: userdelete
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - name: id
          in: query
          description: ID сотрудника/транспорта
          required: true
          explode: true
          schema:
            items:
              type: integer
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              { 'perfomance': { 'total': 0.0864 }, 'success': 1 }
        '400':
          description: Не удалось удалить объект
        '401':
          description: Требуется авторизация
        '404':
          description: Объект не найден

  #
  # РАЗДЕЛ Сотрудники/Транспорт
  #

  # Сотрудники/Транспорт
  /worker:
    # Получить всех
    get:
      tags:
        - Сотрудники/Транспорт
      summary: Получить список всех сотрудников/транспорта
      description: ''
      operationId: workerlist
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0566 },
                'success': 1,
                'data':
                  [
                    {
                      'id': '34Н',
                      'fio': 'Иванов Иван Иванович',
                      'mac': 10203040500,
                      'num': 1,
                      'worker_type_id': 3
                    },
                    {
                      'id': 'А333ЕЕ24',
                      'fio': 'Камаз',
                      'mac': 10203040506,
                      'num': 2,
                      'worker_type_id': 1
                    }
                  ]
              }
        '401':
          description: Требуется авторизация

    # Создать
    put:
      tags:
        - Сотрудники/Транспорт
      summary: Создать новый объект
      operationId: workercreate
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - in: body
          description: Данные для добавления объекта. Тип объекта (1 - транспорт, 2 - водитель, 3 - сотрудник)
          schema:
            type: object
            required:
              - worker_type_id
              - id
              - fio
              - mac
            properties:
              worker_type_id:
                type: integer
                description: Тип объекта (1 - транспорт, 2 - водитель, 3 - сотрудник)
                example: 1
              id:
                type: string
                description: Табельный номер/Номер машины
                example: 'А333ЕЕ24'
              fio:
                type: string
                description: Ф.И.О. сотрудника/Наименование транспорта
                example: 'Камаз'
              mac:
                type: string
                description: MAC-адрес
                example: '010203040506'
      responses:
        '201':
          description: Успешно добавлено
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0574 },
                'success': 1,
                'data':
                  {
                    'id': 'А333ЕЕ24',
                    'fio': 'Камаз',
                    'mac': 10203040506,
                    'num': 1,
                    'worker_type_id': 1
                  }
              }
        '400':
          description: Не валидные входные параметры./Не удалось сохранить объект./Работник с таким номером уже существует!
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Работник с таким номером уже существует!'
              }
        '401':
          description: Требуется авторизация

  # Сотрудники/Транспорт по ID
  /worker/:id:
    # Чтение одного
    get:
      tags:
        - Сотрудники/Транспорт
      summary: Получить данные о сотруднике/транспорте по его ID
      operationId: workerread
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - name: id
          in: query
          description: ID сотрудника/транспорта
          required: true
          explode: true
          schema:
            items:
              type: integer
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0574 },
                'success': 1,
                'data':
                  {
                    'id': 'А333ЕЕ24',
                    'fio': 'Камаз',
                    'mac': 10203040506,
                    'num': 1,
                    'worker_type_id': 1
                  }
              }
        '401':
          description: Требуется авторизация
        '404':
          description: Объект не найден
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Объект не найден'
              }

    # Изменить
    post:
      tags:
        - Сотрудники/Транспорт
      summary: Изменить данные о сотруднике/транспорте по его ID
      operationId: workerupdate
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - name: id
          in: query
          description: ID сотрудника/транспорта
          required: true
          explode: true
          schema:
            items:
              type: integer
        - in: body
          description: Данные для изменения объекта. Тип объекта (1 - транспорт, 2 - водитель, 3 - сотрудник)
          schema:
            type: object
            required:
              - worker_type_id
              - id
              - fio
              - mac
            properties:
              worker_type_id:
                type: integer
                description: Тип объекта (1 - транспорт, 2 - водитель, 3 - сотрудник)
                example: 1
              id:
                type: string
                description: Табельный номер/Номер машины
                example: 'А333ЕЕ24'
              fio:
                type: string
                description: Ф.И.О. сотрудника/Наименование транспорта
                example: 'Камаз'
              mac:
                type: string
                description: MAC-адрес
                example: '010203040506'
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0574 },
                'success': 1,
                'data':
                  {
                    'id': 'А333ЕЕ24',
                    'fio': 'Камаз',
                    'mac': 10203040506,
                    'num': 1,
                    'worker_type_id': 1
                  }
              }
        '400':
          description: Не валидные входные параметры./Не удалось сохранить объект.
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Не удалось сохранить объект.'
              }
        '401':
          description: Требуется авторизация
        '404':
          description: Объект не найден
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Объект не найден'
              }

    # Удаление
    delete:
      tags:
        - Сотрудники/Транспорт
      summary: Удалить сотрудника/транспорт по его ID
      description: ''
      operationId: workerdelete
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - name: id
          in: query
          description: ID сотрудника/транспорта
          required: true
          explode: true
          schema:
            items:
              type: integer
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              { 'perfomance': { 'total': 0.0864 }, 'success': 1 }
        '400':
          description: Не удалось удалить объект
        '401':
          description: Требуется авторизация
        '404':
          description: Объект не найден

  # Сотрудники/Транспорт получить список с фильтрацией
  /worker/filter/:horizon_id:
    get:
      tags:
        - Сотрудники/Транспорт
      summary: 'Получить список сотрудников/транспорта с фильтрацией по ID горизонта'
      description: ''
      operationId: workerfilter
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - name: horizon_id
          in: path
          description: ID горизонта
          required: false
          explode: true
          example: 3
          schema:
            items:
              type: integer
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0533 },
                'success': 1,
                'params': { 'horizon_id': 3 },
                'data':
                  {
                    'workers':
                      [
                        {
                          'worker_id': 6678,
                          'speed': 0,
                          'horizon': 3,
                          'distance': 15,
                          'chain': 14,
                          'is_danger': false,
                          'mac': 'b8:d6:1a:a7:1a:44',
                          'last_connect': '2023-02-20T10:36:00.614733777Z',
                          'fio': 'test',
                          'worker_type_id': 3,
                          'is_online': true
                        },
                        {
                          'worker_id': 4564,
                          'speed': 0,
                          'horizon': 3,
                          'distance': 5,
                          'chain': 14,
                          'is_danger': false,
                          'mac': 'ac:67:b2:72:9e:d4',
                          'last_connect': '2023-02-20T10:36:00.590539909Z',
                          'fio': 'smirnov',
                          'worker_type_id': 3,
                          'is_online': true
                        }
                      ],
                    'offline': []
                  }
              }
        '401':
          description: Требуется авторизация

  #
  # РАЗДЕЛ Горизонт
  #

  # Горизонт
  /horizon:
    # Получить список всех горизонтов
    get:
      tags:
        - Горизонт
      summary: Получить список всех горизонтов
      description: ''
      operationId: horizonlist
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0807 },
                'success': 1,
                'data':
                  [
                    {
                      'id': 1,
                      'name': "\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u04421",
                      'map': "\/files\/map\/c7c85d20-ae67-44b7-9211-4e290f743ea5.jpg",
                      'width': 1048,
                      'height': 747
                    },
                    {
                      'id': 2,
                      'name': "\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u04422",
                      'map': "\/files\/map\/ebd4a89a-08df-4170-9eb6-1f1e01eae515.jpg",
                      'width': 332,
                      'height': 294
                    }
                  ]
              }
        '401':
          description: Требуется авторизация

    # Создать новый горизонт
    put:
      tags:
        - Горизонт
      summary: Создать новый горизонт
      operationId: horizoncreate
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - in: body
          description: Данные для добавления объекта.
          schema:
            type: object
            required:
              - name
              - map
            properties:
              name:
                type: string
                description: Название горизонта
                example: 'Горизонт2'
              map:
                type: string
                description: Изображение карты горизонта (файл)
                example: '/files/map/ebd4a89a-08df-4170-9eb6-1f1e01eae515.jpg'
      responses:
        '201':
          description: Успешно добавлено
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0784 },
                'success': 1,
                'data':
                  {
                    'id': 2,
                    'name': "\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u04422",
                    'map': "\/files\/map\/ebd4a89a-08df-4170-9eb6-1f1e01eae515.jpg",
                    'width': 332,
                    'height': 294
                  }
              }
        '400':
          description: Не валидные входные параметры./Не удалось сохранить объект.
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Не валидные входные параметры.'
              }
        '401':
          description: Требуется авторизация

  # Горизонт по ID
  /horizon/:id:
    # Получить один
    get:
      tags:
        - Горизонт
      summary: Получить данные о горизонте по его ID
      operationId: horizonread
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - name: id
          in: query
          description: ID горизонта
          required: true
          explode: true
          schema:
            items:
              type: integer
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0574 },
                'success': 1,
                'data':
                  {
                    'id': 2,
                    'name': "\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u04422",
                    'map': "\/files\/map\/ebd4a89a-08df-4170-9eb6-1f1e01eae515.jpg",
                    'width': 332,
                    'height': 294
                  }
              }
        '401':
          description: Требуется авторизация
        '404':
          description: Объект не найден
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Объект не найден'
              }

    # Изменить
    post:
      tags:
        - Горизонт
      summary: Изменить данные горизонта по его ID
      operationId: horizonupdate
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - name: id
          in: query
          description: ID горизонта
          required: true
          explode: true
          schema:
            items:
              type: integer
        - in: body
          description: Данные для добавления объекта.
          schema:
            type: object
            required:
              - name
              - map
            properties:
              name:
                type: string
                description: Название горизонта
                example: 'Горизонт2'
              map:
                type: string
                description: Изображение карты горизонта (файл)
                example: '/files/map/ebd4a89a-08df-4170-9eb6-1f1e01eae515.jpg'
      responses:
        '200':
          description: Успешно добавлено
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0784 },
                'success': 1,
                'data':
                  {
                    'id': 2,
                    'name': "\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u04422",
                    'map': "\/files\/map\/ebd4a89a-08df-4170-9eb6-1f1e01eae515.jpg",
                    'width': 332,
                    'height': 294
                  }
              }
        '400':
          description: Не валидные входные параметры./Не удалось сохранить объект.
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Не валидные входные параметры.'
              }
        '401':
          description: Требуется авторизация
        '404':
          description: Объект не найден
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Объект не найден'
              }

    # Удалить
    delete:
      tags:
        - Горизонт
      summary: Удалить гоизонт по его ID
      description: ''
      operationId: horizondelete
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - name: id
          in: query
          description: ID сотрудника/транспорта
          required: true
          explode: true
          schema:
            items:
              type: integer
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              { 'perfomance': { 'total': 0.0864 }, 'success': 1 }
        '400':
          description: Не удалось удалить объект
        '401':
          description: Требуется авторизация
        '404':
          description: Объект не найден

  #
  # РАЗДЕЛ Считыватель
  #

  # Считыватель
  /ac:
    # Получить список всех считывателей
    get:
      tags:
        - Считыватель
      summary: Получить список всех считывателей
      description: ''
      operationId: aclist
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.062 },
                'success': 1,
                'data':
                  [
                    {
                      'id': 3,
                      'horizon_id': 1,
                      'host': '10.10.10.10',
                      'login': null,
                      'password': null,
                      'coord_x': 180,
                      'coord_y': 176.140625,
                      'place': 1,
                      'max_rssi': -30,
                      'name': 1,
                      'identifier': 1
                    },
                    {
                      'id': 4,
                      'horizon_id': 1,
                      'host': '10.10.10.10',
                      'login': null,
                      'password': null,
                      'coord_x': 373,
                      'coord_y': 339.140625,
                      'place': 2,
                      'max_rssi': -30,
                      'name': 2,
                      'identifier': 2
                    },
                    {
                      'id': 5,
                      'horizon_id': 1,
                      'host': '10.10.10.10',
                      'login': null,
                      'password': null,
                      'coord_x': 662,
                      'coord_y': 316.140625,
                      'place': 3,
                      'max_rssi': -30,
                      'name': 3,
                      'identifier': 3
                    },
                    {
                      'id': 6,
                      'horizon_id': 1,
                      'host': null,
                      'login': null,
                      'password': null,
                      'coord_x': 662,
                      'coord_y': 316.140625,
                      'place': null,
                      'max_rssi': -30,
                      'name': null,
                      'identifier': null
                    }
                  ]
              }
        '401':
          description: Требуется авторизация

    # Создать новый считыватель
    put:
      tags:
        - Считыватель
      summary: Создать новый считыватель
      operationId: accreate
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - in: body
          description: Данные для добавления объекта.
          schema:
            type: object
            required:
              - horizon_id
              - coord_x
              - coord_y
            properties:
              horizon_id:
                type: integer
                description: ID горизонта, на котором установлен считыватель
                example: 1
              coord_x:
                type: double
                description: Координата по оси Х
                example: 880
              coord_y:
                type: double
                description: Координата по оси Y
                example: 427.140625
              max_rssi:
                type: double
                description: Опорный сигнал, dB
                example: -30
      responses:
        '201':
          description: Успешно добавлено
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0825 },
                'success': 1,
                'data':
                  {
                    'id': 7,
                    'horizon_id': 1,
                    'host': null,
                    'login': null,
                    'password': null,
                    'coord_x': 880,
                    'coord_y': 427.140625,
                    'place': null,
                    'max_rssi': -30,
                    'name': null,
                    'identifier': null
                  }
              }
        '400':
          description: Не валидные входные параметры./Не удалось сохранить объект.
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Не валидные входные параметры.'
              }
        '401':
          description: Требуется авторизация

  # Считыватель по ID
  /ac/:id:
    # Получить один
    get:
      tags:
        - Считыватель
      summary: Получить данные о считывателе по его ID
      operationId: acread
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - name: id
          in: query
          description: ID горизонта
          required: true
          explode: true
          schema:
            items:
              type: integer
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0574 },
                'success': 1,
                'data':
                  {
                    'id': 3,
                    'horizon_id': 1,
                    'host': '10.10.10.10',
                    'login': null,
                    'password': null,
                    'coord_x': 180,
                    'coord_y': 176.140625,
                    'place': 1,
                    'max_rssi': -30,
                    'name': 1,
                    'identifier': 1
                  }
              }
        '401':
          description: Требуется авторизация
        '404':
          description: Объект не найден
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Объект не найден'
              }

    # Изменить
    post:
      tags:
        - Считыватель
      summary: Изменить данные о считывателе по его ID
      operationId: acupdate
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - name: id
          in: query
          description: ID горизонта
          required: true
          explode: true
          schema:
            items:
              type: integer
        - in: body
          description: Данные для добавления объекта.
          schema:
            type: object
            required:
              - horizon_id
            properties:
              identifier:
                type: string
                description: ID устройства
                example: 'СЧ045'
              name:
                type: string
                description: Наименование
                example: 'Считыватель 45'
              host:
                type: string
                description: IP-адрес считывателя
                example: '10.10.10.9'
              login:
                type: string
                description: Логин
                example: 'admin'
              password:
                type: string
                description: Пароль
                example: 'admin123'
              max_rssi:
                type: double
                description: Опорный сигнал, dB
                example: -30
              place:
                type: string
                description: Место расположения
                example: 'Склад №3'
      responses:
        '200':
          description: Успешно добавлено
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.3424 },
                'success': 1,
                'data':
                  {
                    'id': 4,
                    'horizon_id': 1,
                    'host': '10.10.10.9',
                    'login': 'admin',
                    'password': 'admin123',
                    'coord_x': 373,
                    'coord_y': 339.140625,
                    'place': 'Склад №3',
                    'max_rssi': -30,
                    'name': 'Считыватель 45',
                    'identifier': 'СЧ045'
                  }
              }
        '400':
          description: Не валидные входные параметры./Не удалось сохранить объект.
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Не валидные входные параметры.'
              }
        '401':
          description: Требуется авторизация
        '404':
          description: Объект не найден
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Объект не найден'
              }

    # Удалить
    delete:
      tags:
        - Считыватель
      summary: Удалить считыватель по его ID
      description: ''
      operationId: acdelete
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - name: id
          in: query
          description: ID считывателя
          required: true
          explode: true
          schema:
            items:
              type: integer
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              { 'perfomance': { 'total': 0.0864 }, 'success': 1 }
        '400':
          description: Не удалось удалить объект
        '401':
          description: Требуется авторизация
        '404':
          description: Объект не найден

  # Считыватель с фильтром
  /ac/filter/:horizon_id:
    get:
      tags:
        - Считыватель
      summary: 'Получить список считывателей с фильтрацией по ID горизонта'
      description: ''
      operationId: acfilter1
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - name: horizon_id
          in: path
          description: ID горизонта
          required: false
          explode: true
          example: 3
          schema:
            items:
              type: integer
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.058 },
                'success': 1,
                'params': { 'horizon_id': 3 },
                'data':
                  [
                    {
                      'id': 18,
                      'horizon_id': 3,
                      'host': '10.88.0.31',
                      'login': 'admin',
                      'password': 'password',
                      'coord_x': 115,
                      'coord_y': 121.42554859725,
                      'place': 2,
                      'max_rssi': -30,
                      'name': 2,
                      'identifier': 2
                    },
                    {
                      'id': 17,
                      'horizon_id': 3,
                      'host': '10.88.0.30',
                      'login': 'admin',
                      'password': 'password',
                      'coord_x': 37,
                      'coord_y': 71.387293050193,
                      'place': 1,
                      'max_rssi': -30,
                      'name': 1,
                      'identifier': 1
                    },
                    {
                      'id': 36,
                      'horizon_id': 3,
                      'host': '10.0.88.32',
                      'login': 'admin',
                      'password': 'radius2',
                      'coord_x': 145.25,
                      'coord_y': 62.080182099579,
                      'place': null,
                      'max_rssi': -30,
                      'name': 32,
                      'identifier': 32
                    }
                  ]
              }
        '401':
          description: Требуется авторизация

  /ac/filter/:search:
    get:
      tags:
        - Считыватель
      summary: 'Получить список считывателей с фильтрацией по ФИО/табельному номеру'
      description: ''
      operationId: acfilter2
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - name: search
          in: path
          description: Ф.И.О. сотрудника или его табельный номер
          required: false
          explode: true
          example: Смирнов
          schema:
            items:
              type: string
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.1453 },
                'success': 1,
                'params': { 'search': 'Смирнов' },
                'data':
                  [
                    {
                      'worker_id': 4564,
                      'speed': 0,
                      'horizon': 3,
                      'chain': 14,
                      'is_danger': false,
                      'mac': 'ac:67:b2:72:9e:d4',
                      'last_connect': '2023-02-20T10:27:00.576482693Z',
                      'fio': 'Смирнов',
                      'worker_type_id': 3,
                      'is_online': true,
                      'horizon_id': 3,
                      'worker_name': 'Смирнов',
                      'ac_distance': 30,
                      'worker_distance': 5,
                      'ac_1_x': 37,
                      'ac_1_y': 71.387293050193,
                      'ac_2_x': 115,
                      'ac_2_y': 121.42554859725,
                      'horizon_width': 284,
                      'horizon_height': 177
                    }
                  ]
              }
        '401':
          description: Требуется авторизация

  #
  # РАЗДЕЛ Цепочка
  #

  # Цепочка
  /chain:
    # Получить список
    get:
      tags:
        - Цепочка
      summary: Получить список всех цепочек
      description: ''
      operationId: chainlist
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0592 },
                'success': 1,
                'data':
                  [
                    {
                      'id': 3,
                      'ac1_id': 5,
                      'ac2_id': 1,
                      'distance': 50,
                      'line': null,
                      'is_danger': true
                    },
                    {
                      'id': 2,
                      'ac1_id': 4,
                      'ac2_id': 1,
                      'distance': 100,
                      'line': null,
                      'is_danger': false
                    },
                    {
                      'id': 1,
                      'ac1_id': 3,
                      'ac2_id': 1,
                      'distance': 50,
                      'line': null,
                      'is_danger': false
                    },
                    {
                      'id': 4,
                      'ac1_id': 6,
                      'ac2_id': 1,
                      'distance': 0,
                      'line': null,
                      'is_danger': false
                    },
                    {
                      'id': 5,
                      'ac1_id': 7,
                      'ac2_id': 1,
                      'distance': 0,
                      'line': null,
                      'is_danger': false
                    }
                  ]
              }
        '401':
          description: Требуется авторизация

    # Создать
    put:
      tags:
        - Цепочка
      summary: Создать новую цепочку
      operationId: chaincreate
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - in: body
          description: Данные для добавления объекта.
          schema:
            type: object
            required:
              - ac1_id
              - ac2_id
              - distance
              - is_danger
            properties:
              ac1_id:
                type: integer
                description: ID начального считывателя
                example: 5
              ac2_id:
                type: integer
                description: ID конечного считывателя
                example: 3
              distance:
                type: integer
                description: Расстояние между считывателями
                example: 100
              is_danger:
                type: boolean
                description: Опасная зона?
                example: true
      responses:
        '201':
          description: Успешно добавлено
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0824 },
                'success': 1,
                'data':
                  {
                    'id': 7,
                    'ac1_id': 5,
                    'ac2_id': 3,
                    'distance': 30,
                    'line': null,
                    'is_danger': 'true'
                  }
              }
        '400':
          description: Не валидные входные параметры./Не удалось сохранить объект.
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Не валидные входные параметры.'
              }
        '401':
          description: Требуется авторизация

  # Цепочка по ID
  /chain/:id:
    # Получить одного
    get:
      tags:
        - Цепочка
      summary: Получить данные о цепочке по её ID
      operationId: chainread
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: string
        - name: id
          in: query
          description: ID горизонта
          required: true
          explode: true
          schema:
            items:
              type: integer
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0574 },
                'success': 1,
                'data':
                  {
                    'id': 3,
                    'ac1_id': 5,
                    'ac2_id': 1,
                    'distance': 50,
                    'line': null,
                    'is_danger': true
                  }
              }
        '401':
          description: Требуется авторизация
        '404':
          description: Объект не найден
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Объект не найден'
              }

    # Изменить
    post:
      tags:
        - Цепочка
      summary: Изменить данные о цепочке по её ID
      operationId: chainupdate
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - name: id
          in: query
          description: ID горизонта
          required: true
          explode: true
          schema:
            items:
              type: integer
        - in: body
          description: Данные для добавления объекта.
          schema:
            type: object
            required:
              - ac1_id
              - ac2_id
              - distance
              - is_danger
            properties:
              ac1_id:
                type: integer
                description: ID начального считывателя
                example: 5
              ac2_id:
                type: integer
                description: ID конечного считывателя
                example: 3
              distance:
                type: integer
                description: Расстояние между считывателями
                example: 100
              is_danger:
                type: boolean
                description: Опасная зона?
                example: true
      responses:
        '200':
          description: Успешно добавлено
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0824 },
                'success': 1,
                'data':
                  {
                    'id': 7,
                    'ac1_id': 5,
                    'ac2_id': 3,
                    'distance': 30,
                    'line': null,
                    'is_danger': 'true'
                  }
              }
        '400':
          description: Не валидные входные параметры./Не удалось сохранить объект.
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Не валидные входные параметры.'
              }
        '401':
          description: Требуется авторизация

    # Удалить
    delete:
      tags:
        - Цепочка
      summary: Удалить цепочку по её ID
      description: ''
      operationId: chaindelete
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - name: id
          in: query
          description: ID цепочки
          required: true
          explode: true
          schema:
            items:
              type: integer
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              { 'perfomance': { 'total': 0.0864 }, 'success': 1 }
        '400':
          description: Не удалось удалить объект
        '401':
          description: Требуется авторизация
        '404':
          description: Объект не найден

  #
  # РАЗДЕЛ Смена
  #

  # Смена
  /shift:
    # Получить список
    get:
      tags:
        - Смена
      summary: Получить список всех смен
      description: ''
      operationId: shiftlist
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0598 },
                'success': 1,
                'data':
                  [
                    {
                      'id': 1,
                      'name': 1,
                      'start_time': '20:00',
                      'end_time': '21:00',
                      'is_next_date': false
                    }
                  ]
              }
        '401':
          description: Требуется авторизация

    # Создать
    put:
      tags:
        - Смена
      summary: Создать новую смену
      operationId: shiftcreate
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - in: body
          description: Данные для добавления объекта.
          schema:
            type: object
            required:
              - name
              - start_time
              - end_time
              - is_next_date
            properties:
              name:
                type: string
                description: Название
                example: 'Ночная'
              start_time:
                type: string
                description: Время начала
                example: '23:00'
              end_time:
                type: string
                description: Время окончания
                example: '07:00'
              is_next_date:
                type: boolean
                description: Переходит на следующий день?
                example: true
      responses:
        '200':
          description: Успешно добавлено
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0495 },
                'success': 1,
                'data': { 'status': 'success' }
              }
        '400':
          description: Не валидные входные параметры./Не удалось сохранить объект.
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Не валидные входные параметры.'
              }
        '401':
          description: Требуется авторизация

    # Изменить
    post:
      tags:
        - Смена
      summary: Изменить смену по её ID
      operationId: shiftupdate
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - in: body
          description: Данные для изменения объекта.
          schema:
            type: object
            required:
              - id
              - name
              - start_time
              - end_time
              - is_next_date
            properties:
              id:
                type: integer
                description: ID смены
                example: 1
              name:
                type: string
                description: Название
                example: 'Ночная'
              start_time:
                type: string
                description: Время начала
                example: '23:00'
              end_time:
                type: string
                description: Время окончания
                example: '07:00'
              is_next_date:
                type: boolean
                description: Переходит на следующий день?
                example: true
      responses:
        '200':
          description: Успешно добавлено
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0495 },
                'success': 1,
                'data': { 'status': 'success' }
              }
        '400':
          description: Не валидные входные параметры./Не удалось сохранить объект.
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Не валидные входные параметры.'
              }
        '401':
          description: Требуется авторизация

  /shift/:id:
    # Получить список
    delete:
      tags:
        - Смена
      summary: Удалить данные о смене по её ID
      description: ''
      operationId: shiftdelete
      produces:
        - 'application/json'
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: 'string'
        - name: id
          in: query
          description: ID смены
          required: true
          explode: true
          schema:
            items:
              type: integer
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0495 },
                'success': 1,
                'data': { 'status': 'success' }
              }
        '401':
          description: Требуется авторизация
        '404':
          description: Объект не найден
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Объект не найден'
              }
  #
  # РАЗДЕЛ Загрузка
  #

  # Загрузка новой иконки
  /upload/icon:
    post:
      tags:
        - Загрузка
      summary: Загрузка новой иконки
      operationId: uploadicon
      consumes:
        - multipart/form-data
      produces:
        - application/json
      parameters:
        - name: 'token'
          in: 'header'
          required: true
          type: string
        - name: id
          in: formData
          description: 'ID объекта (1 - считыватель онлайн, 2 - сотрудник, 3 - считыватель оффлайн, 4 - транспорт)'
          required: true
          type: integer
        - name: file
          in: formData
          description: 'Файл изображения'
          required: true
          type: file
      responses:
        '201':
          description: Успешно
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0608 },
                'success': 1,
                'data':
                  {
                    'id': 2,
                    'filename': '/files/icon/3ed5635e-10d7-45f1-87ce-2fd136403583.jpg',
                    'name': 'Рабочий'
                  }
              }
        '401':
          description: Требуется авторизация
        '404':
          description: Объект не найден
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Объект не найден'
              }

  # Загрузка новой карты
  /upload/map:
    post:
      tags:
        - Загрузка
      summary: Загрузить изображение карты
      operationId: uploadmap
      consumes:
        - multipart/form-data
      produces:
        - application/json
      parameters:
        - name: token
          in: header
          required: true
          type: string
        - name: image
          in: formData
          description: Файл изображения
          required: true
          type: file
      responses:
        '201':
          description: Успешно
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0787 },
                'success': 1,
                'data':
                  {
                    'image': '/files/map/b9081fa3-0be2-45e3-9bb9-68248890c079.jpg',
                    'width': 1280,
                    'height': 905
                  }
              }
        '401':
          description: Требуется авторизация
        '404':
          description: Объект не найден
          examples:
            application/json:
              {
                'perfomance': { 'total': 0.0741 },
                'success': 0,
                'err_message': 'Объект не найден'
              }

  #
  # РАЗДЕЛ Статистика
  #

  # Статистика
  /report:
    get:
      tags:
        - Статистика
      summary: Получить отчёт по требуемым параметрам
      operationId: reportsearch
      produces:
        - 'application/json'
      parameters:
        - in: path
          name: horizon
          schema:
            type: integer
          required: false
          description: Фильтр для поиска по горизонтам
        - in: path
          name: chain_id
          schema:
            type: integer
          required: false
          description: Фильтр для поиска по цепочкам
        - in: path
          name: chain_ac1_addr
          schema:
            type: string
          required: false
          description: Фильтр для поиска по IP-адресу начального считывателя в сегменте
        - in: path
          name: chain_ac2_addr
          schema:
            type: string
          required: false
          description: Фильтр для поиска по IP-адресу конечного считывателя в сегменте
        - in: path
          name: chain_is_danger
          schema:
            type: boolean
          required: false
          description: Фильтр для поиска по опасным зонам
        - in: path
          name: start_date
          schema:
            type: string
          required: false
          description: Фильтр для поиска по дате начала для выгрузки отчета
        - in: path
          name: end_date
          schema:
            type: string
          required: false
          description: Фильтр для поиска по дате окончания для выгрузки отчета
        - in: path
          name: intervalByMin
          schema:
            type: integer
          required: false
          description: Интервал поиска по времени?
        - in: path
          name: worker_id
          schema:
            type: integer
          required: false
          description: Фильтр для поиска по ID сотрудника/транспорта
        - in: path
          name: worker_mac
          schema:
            type: string
          required: false
          description: Фильтр для поиска по MAC сотрудника/транспорта
        - in: path
          name: worker_type_id
          schema:
            type: integer
          required: false
          description: Фильтр для поиска по типу сотрудника/транспорта
        - in: path
          name: page
          schema:
            type: integer
          required: false
          description: Параметр для выдачи постранично. Указывается номер страницы.
        - in: path
          name: size
          schema:
            type: integer
          required: false
          description: Параметр для выдачи постранично. Указывается количество выгружаемых записей из БД на одну страницу.
      responses:
        '200':
          description: Успешно
          examples:
            application/json:
              {
                'perfomance': { 'total': 1.7539 },
                'success': 1,
                'data':
                  [
                    {
                      'id': 13272019,
                      'horizon': '3',
                      'valid': true,
                      'chain_id': 11,
                      'chain_ac1_addr': '192.168.1.11',
                      'chain_ac1_max_rssi': -30,
                      'chain_ac2_addr': '192.168.1.98',
                      'chain_ac2_max_rssi': -30,
                      'chain_horizon_id': 3,
                      'chain_distance': 150,
                      'time_stamp': '2023-02-01T17:26:00Z',
                      'worker_id': '8',
                      'worker_mac': '30:c6:f7:5a:c6:44',
                      'worker_name': '8',
                      'worker_type_name': 'Сотрудник',
                      'worker_type_id': '3',
                      'ac1_name': '475.1.1',
                      'ac2_name': 'Ламповая',
                      'ac1_id': 4,
                      'ac2_id': 6
                    },
                    {
                      'id': 13272030,
                      'horizon': '3',
                      'distance': 160,
                      'valid': true,
                      'chain_id': 5,
                      'chain_ac1_addr': '192.168.1.12',
                      'chain_ac1_max_rssi': -30,
                      'chain_ac2_addr': '192.168.1.11',
                      'chain_ac2_max_rssi': -30,
                      'chain_horizon_id': 3,
                      'chain_distance': 160,
                      'time_stamp': '2023-02-01T17:27:00Z',
                      'worker_id': '19',
                      'worker_mac': '34:ab:95:fb:1f:ec',
                      'worker_name': '19',
                      'worker_type_name': 'Сотрудник',
                      'worker_type_id': '3',
                      'ac1_name': '475.1.2',
                      'ac2_name': '475.1.1',
                      'ac1_id': 5,
                      'ac2_id': 4
                    },
                    {
                      'id': 13272032,
                      'horizon': '3',
                      'distance': 160,
                      'valid': true,
                      'chain_id': 5,
                      'chain_ac1_addr': '192.168.1.12',
                      'chain_ac1_max_rssi': -30,
                      'chain_ac2_addr': '192.168.1.11',
                      'chain_ac2_max_rssi': -30,
                      'chain_horizon_id': 3,
                      'chain_distance': 160,
                      'time_stamp': '2023-02-01T17:27:00Z',
                      'worker_id': '8',
                      'worker_mac': '30:c6:f7:5a:c6:44',
                      'worker_name': '8',
                      'worker_type_name': 'Сотрудник',
                      'worker_type_id': '3',
                      'ac1_name': '475.1.2',
                      'ac2_name': '475.1.1',
                      'ac1_id': 5,
                      'ac2_id': 4
                    }
                  ]
              }
        '401':
          description: Требуется авторизация
        '500':
          description: Не валидные входные параметры

definitions:
  User:
    type: object
    title: Пользователь
    required:
      - login
      - password
      - fio
      - is_admin
    properties:
      id:
        description: ID
        type: integer
        default: 'autoincrement'
        minimum: 1
      login:
        description: Логин
        type: string
        notnull: true
        maxlength: 255
      password:
        description: Пароль
        type: string
        notnull: true
        maxlength: 255
      fio:
        description: Ф.И.О.
        type: string
        notnull: true
        maxlength: 255
      email:
        description: Email
        type: string
        maxlength: 255
      path:
        description: Путь до ПО
        type: string
      is_admin:
        description: Администратор?
        type: boolean
        default: false
        notnull: true
  Session:
    type: object
    title: Сессия
    required:
      - token
    properties:
      id:
        description: ID
        type: integer
        default: 'autoincrement'
        minimum: 1
      token:
        description: Токен
        type: string
        notnull: true
      user_id:
        description: ID пользователя
        type: integer
        notnull: true
        minimum: 1
  Ac:
    type: object
    title: Считыватель
    required:
      - horizon_id
      - coord_x
      - coord_y
      - max_rssi
    properties:
      id:
        description: ID
        type: integer
        default: 'autoincrement'
        minimum: 1
      horizon_id:
        description: ID горизонта
        type: integer
        notnull: true
      host:
        description: Адрес считывателя
        type: string
      login:
        description: Логин
        type: string
      password:
        description: Пароль
        type: string
      coord_x:
        description: Координата Х на карте
        type: double
        notnull: true
      coord_y:
        description: Координата Y на карте
        type: double
        notnull: true
      place:
        description: 'Место установки'
        type: string
      max_rssi:
        description: Уровень максимального сигнала
        type: double
        notnull: true
      name:
        description: 'Наименование'
        type: string
      identifier:
        description: 'Идентификатор'
        type: string
  Chain:
    type: object
    title: Цепочка
    required:
      - ac1_id
      - ac2_id
      - distance
      - is_danger
    properties:
      id:
        description: ID
        type: integer
        default: 'autoincrement'
        minimum: 1
      ac1_id:
        description: ID начального считывателя
        type: integer
        notnull: true
      ac2_id:
        description: ID конечного считывателя
        type: integer
        notnull: true
      distance:
        description: Рассточние между считывателями
        type: integer
      line:
        description: Ломанная линия между точками
        type: string
      is_danger:
        description: Опасная зона?
        type: boolean
        notnull: true
  Horizon:
    type: object
    title: Горизонт
    required:
      - name
      - map
    properties:
      id:
        description: ID
        type: integer
        default: 'autoincrement'
        minimum: 1
      name:
        description: Название горизонта
        type: string
        notnull: true
      map:
        description: Изображение карты для горизонта
        type: string
        notnull: true
  Worker:
    type: object
    title: Сотрудники/Транспорт
    required:
      - id
      - fio
      - mac
      - worker_type_id
    properties:
      id:
        description: Табельный номер / Номер транспорта
        type: string
      fio:
        description: ф.И.О. сотрудника / Наименование транспорта
        type: string
        notnull: true
      mac:
        description: MAC-адрес
        type: string
        notnull: true
      num:
        description: ID
        type: integer
        default: 'autoincrement'
        minimum: 1
      worker_type_id:
        description: Тип объекта (1 - транспорт, 2 - водитель, 3 - сотрудник)
        type: integer
        notnull: true
