openapi: 3.0.3
info:
  title: rfidregistry
  version: 1.0.1784206246015
  description: Сервис rfidregistry
  license:
    name: CC BY-NC-ND 4.0
    url: https://gitlab.infra.rtkit.dev/openapi/key/raw/main/LICENCE.md
tags:
  - name: record(auth)
    description: Методы record. Требуют авторизацию. Доступны из интернета
  - name: system(public)
    description: Методы system. Не требуют авторизацию. Доступны из интернета
paths:
  /rfidregistry/api/v1/record:
    post:
      summary: >-
        Метод сохранения записи.

        Нельзя отвязать ключ, который привязал кто-то другой.

        Разрешения: rfidregistry:record:save.

        Метод доступен для: Token: seller, employee, application, service, device_admin, ltp_first, admin, master, owner, mrf, bti, manager, external_seller. При наличии разрешений
      operationId: RecordService_PostRecord
      responses:
        "200":
          description: Успешный ответ
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/v1PostRecordResponse"
        "400":
          description: Ошибка
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/v1PostRecordResponse"
        "401":
          description: Запрос не авторизован
        "403":
          description: В доступе отказано
        "409":
          description: В базе данных хранится более новая версия объекта
        "500":
          description: Внутренняя ошибка сервиса
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/v1PostRecordResponse"
        default:
          description: Ошибки транспортного слоя
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/rpcStatus"
      requestBody:
        content:
          application/json:
            schema:
              $ref: "#/components/schemas/v1PostRecordRequest"
        required: true
      tags:
        - record(auth)
      security:
        - oauth2:
            - rfidregistry:edit
          bearerHttp: []
      parameters:
        - in: header
          name: X-Request-Id
          schema:
            type: string
            format: uuid
          description: Уникальный идентификатор запроса. Создаётся клиентом на каждый запрос
        - in: header
          name: X-Device-Id
          schema:
            type: string
          description: Уникальный идентификатор устройства. Создаётся клиентом при первом
            запуске приложения. Если есть способ однозначно узнать идентификатор
            устройства, то создаётся на основе него и остаётся неизменным после
            переустановки приложения
        - in: header
          name: X-Api-Key
          schema:
            type: string
          description: Уникальный ключ для партнера. Создается администратором и
            передается партнерам.
        - in: header
          name: Canary
          schema:
            type: string
          description: Параметр балансировки запроса. Если для заголовка запроса
            установлено значение always, он будет перенаправлен на канареечный
            деплой. Если для заголовка установлено значение never, он никогда не
            будет перенаправлен на канареечный деплой
  /rfidregistry/api/v1/record/count:
    get:
      summary: >-
        Метод получения количества записей.

        Разрешения: rfidregistry:record:list.

        Метод доступен для: Token: seller, employee, application, service, device_admin, ltp_first, admin, master, owner, mrf, bti, manager, external_seller. При наличии разрешений
      operationId: RecordService_GetRecordCount
      responses:
        "200":
          description: Успешный ответ
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/v1GetRecordCountResponse"
        "400":
          description: Ошибка
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/v1GetRecordCountResponse"
        "401":
          description: Запрос не авторизован
        "403":
          description: В доступе отказано
        "500":
          description: Внутренняя ошибка сервиса
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/v1GetRecordCountResponse"
        default:
          description: Ошибки транспортного слоя
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/rpcStatus"
      parameters:
        - name: filter.rfidTypes
          description: |-
            По типам ключей

             - RFID_TYPE_UNKNOWN: Значение не указано
             - FOB: Брелок
             - CARD: Карта
             - BAND: Браслет
             - STICKER: Стикер
             - ACTIVE_TAG: Активная метка
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: string
              enum:
                - FOB
                - CARD
                - BAND
                - STICKER
                - ACTIVE_TAG
        - name: filter.encryptionTypes
          description: |-
            По типам шифрования

             - ENCRYPTION_TYPE_UNKNOWN: Значение не указано
             - SL0: Без шифрования
             - SL1: С шифрованием, копируемый
             - SL3: С шифрованием, не копируемый
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: string
              enum:
                - SL0
                - SL1
                - SL3
        - name: filter.uids
          description: По номерам ключей
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: string
        - name: filter.statusTypes
          description: |-
            По типам статуса

             - STATUS_TYPE_UNKNOWN: Значение не указано
             - NEW: Новый
             - SHIPPED: Отгружен
             - DEFECT: Брак
             - IN_USE: Использован
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: string
              enum:
                - NEW
                - SHIPPED
                - DEFECT
                - IN_USE
        - name: filter.inUseRfidIds
          description: По номерам привязанных ключей
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: string
        - name: filter.resourceOwnerIds
          description: По владельцам
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: string
        - name: filter.orderNumbers
          description: По номерам заказа
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: string
        - name: filter.inUseResourceOwnerIds
          description: По владельцам привязанных ключей
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: string
        - name: filter.isDeleted
          description: |-
            По удалённым записям.
            По умолчанию: false
          in: query
          required: false
          schema:
            type: boolean
        - name: filter.text
          description: |-
            По тексту.
            Если значение не передано то поиск по нему не производится.
            # Диапазон: 3..64.
            # Поиск производится по полям:
            # - Номер заказа;
            # - Производитель
          in: query
          required: false
          schema:
            type: string
        - name: filter.startShippedAt
          description: Дата отгрузки от
          in: query
          required: false
          schema:
            type: string
            format: date-time
        - name: filter.endShippedAt
          description: Дата отгрузки до
          in: query
          required: false
          schema:
            type: string
            format: date-time
        - name: filter.packageInfoBoxes
          description: По номеру коробки
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: integer
              format: int32
        - name: filter.packageInfoPlaces
          description: По номеру места в коробке
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: integer
              format: int32
        - name: filter.identificationMethodTypes
          description: |-
            По методу идентификации

             - IDENTIFICATION_METHOD_TYPE_UNKNOWN: Значение не указано
             - MIFARE: Значение Mifare
             - BLE: Значение Bluetooth low energy
             - UHF: Значение Ultra high frequency
             - EM_MARINE: Значение em-marine
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: string
              enum:
                - MIFARE
                - BLE
                - UHF
                - EM_MARINE
        - in: header
          name: X-Request-Id
          schema:
            type: string
            format: uuid
          description: Уникальный идентификатор запроса. Создаётся клиентом на каждый запрос
        - in: header
          name: X-Device-Id
          schema:
            type: string
          description: Уникальный идентификатор устройства. Создаётся клиентом при первом
            запуске приложения. Если есть способ однозначно узнать идентификатор
            устройства, то создаётся на основе него и остаётся неизменным после
            переустановки приложения
        - in: header
          name: X-Api-Key
          schema:
            type: string
          description: Уникальный ключ для партнера. Создается администратором и
            передается партнерам.
        - in: header
          name: Canary
          schema:
            type: string
          description: Параметр балансировки запроса. Если для заголовка запроса
            установлено значение always, он будет перенаправлен на канареечный
            деплой. Если для заголовка установлено значение never, он никогда не
            будет перенаправлен на канареечный деплой
      tags:
        - record(auth)
      security:
        - oauth2:
            - rfidregistry:read
            - rfidregistry:edit
          bearerHttp: []
  /rfidregistry/api/v1/record/list:
    get:
      summary: >-
        Метод получения списка записей.

        Разрешения: rfidregistry:record:list.

        Метод доступен для: Token: seller, employee, application, service, device_admin, ltp_first, admin, master, owner, mrf, bti, manager, external_seller. При наличии разрешений
      operationId: RecordService_GetRecordList
      responses:
        "200":
          description: Успешный ответ
          content:
            application/json:
              schema:
                type: object
                properties:
                  result:
                    $ref: "#/components/schemas/v1GetRecordListResponse"
                  error:
                    $ref: "#/components/schemas/rpcStatus"
                title: Поток объектов v1GetRecordListResponse
        "400":
          description: Ошибка
        "401":
          description: Запрос не авторизован
        "403":
          description: В доступе отказано
        "500":
          description: Внутренняя ошибка сервиса
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/rpcStatus"
      parameters:
        - name: filter.rfidTypes
          description: |-
            По типам ключей

             - RFID_TYPE_UNKNOWN: Значение не указано
             - FOB: Брелок
             - CARD: Карта
             - BAND: Браслет
             - STICKER: Стикер
             - ACTIVE_TAG: Активная метка
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: string
              enum:
                - FOB
                - CARD
                - BAND
                - STICKER
                - ACTIVE_TAG
        - name: filter.encryptionTypes
          description: |-
            По типам шифрования

             - ENCRYPTION_TYPE_UNKNOWN: Значение не указано
             - SL0: Без шифрования
             - SL1: С шифрованием, копируемый
             - SL3: С шифрованием, не копируемый
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: string
              enum:
                - SL0
                - SL1
                - SL3
        - name: filter.uids
          description: По номерам ключей
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: string
        - name: filter.statusTypes
          description: |-
            По типам статуса

             - STATUS_TYPE_UNKNOWN: Значение не указано
             - NEW: Новый
             - SHIPPED: Отгружен
             - DEFECT: Брак
             - IN_USE: Использован
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: string
              enum:
                - NEW
                - SHIPPED
                - DEFECT
                - IN_USE
        - name: filter.inUseRfidIds
          description: По номерам привязанных ключей
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: string
        - name: filter.resourceOwnerIds
          description: По владельцам
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: string
        - name: filter.orderNumbers
          description: По номерам заказа
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: string
        - name: filter.inUseResourceOwnerIds
          description: По владельцам привязанных ключей
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: string
        - name: filter.isDeleted
          description: |-
            По удалённым записям.
            По умолчанию: false
          in: query
          required: false
          schema:
            type: boolean
        - name: filter.text
          description: |-
            По тексту.
            Если значение не передано то поиск по нему не производится.
            # Диапазон: 3..64.
            # Поиск производится по полям:
            # - Номер заказа;
            # - Производитель
          in: query
          required: false
          schema:
            type: string
        - name: filter.startShippedAt
          description: Дата отгрузки от
          in: query
          required: false
          schema:
            type: string
            format: date-time
        - name: filter.endShippedAt
          description: Дата отгрузки до
          in: query
          required: false
          schema:
            type: string
            format: date-time
        - name: filter.packageInfoBoxes
          description: По номеру коробки
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: integer
              format: int32
        - name: filter.packageInfoPlaces
          description: По номеру места в коробке
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: integer
              format: int32
        - name: filter.identificationMethodTypes
          description: |-
            По методу идентификации

             - IDENTIFICATION_METHOD_TYPE_UNKNOWN: Значение не указано
             - MIFARE: Значение Mifare
             - BLE: Значение Bluetooth low energy
             - UHF: Значение Ultra high frequency
             - EM_MARINE: Значение em-marine
          in: query
          required: false
          explode: true
          schema:
            type: array
            items:
              type: string
              enum:
                - MIFARE
                - BLE
                - UHF
                - EM_MARINE
        - name: paging.orderByType
          description: >-
            Тип значения сортировки.

            Если значение не передано, то будет взято значение по умолчанию.

            # По умолчанию: NEW_AT

             - ORDER_BY_TYPE_UNKNOWN: Значение не указано
             - NEW_AT: По дате перевода в статус new (дате создания)
             - CHANGED_AT: По времени изменения
             - ORDER_AT: По времени заказа
             - ORDER_NUMBER: По номеру заказа
             - RANK: По рангу для поиска по тексту.
            Применяется когда передано поле для поиска по тексту.

            В случае если текстовое поле не передано, применяется значение по умолчанию
          in: query
          required: false
          schema:
            type: string
            enum:
              - NEW_AT
              - CHANGED_AT
              - ORDER_AT
              - ORDER_NUMBER
              - RANK
        - name: paging.directionType
          description: |-
            Тип направления сортировки.
            # По умолчанию: DESC

             - DIRECTION_TYPE_UNKNOWN: Значение не указано
             - DESC: От большего к меньшему
             - ASC: От меньшего к большему
          in: query
          required: false
          schema:
            type: string
            enum:
              - DESC
              - ASC
        - name: paging.limit
          description: |-
            Количество записей на страницу.
            Если значение 0 (не передано), то будет взято значение по умолчанию.
            # Диапазон: 0..100.
            # По умолчанию: 20
          in: query
          required: false
          schema:
            type: integer
            format: int32
        - name: paging.offset
          description: |-
            Сдвиг.
            # Диапазон: 0..2147483647
          in: query
          required: false
          schema:
            type: integer
            format: int32
        - in: header
          name: X-Request-Id
          schema:
            type: string
            format: uuid
          description: Уникальный идентификатор запроса. Создаётся клиентом на каждый запрос
        - in: header
          name: X-Device-Id
          schema:
            type: string
          description: Уникальный идентификатор устройства. Создаётся клиентом при первом
            запуске приложения. Если есть способ однозначно узнать идентификатор
            устройства, то создаётся на основе него и остаётся неизменным после
            переустановки приложения
        - in: header
          name: X-Api-Key
          schema:
            type: string
          description: Уникальный ключ для партнера. Создается администратором и
            передается партнерам.
        - in: header
          name: Canary
          schema:
            type: string
          description: Параметр балансировки запроса. Если для заголовка запроса
            установлено значение always, он будет перенаправлен на канареечный
            деплой. Если для заголовка установлено значение never, он никогда не
            будет перенаправлен на канареечный деплой
      tags:
        - record(auth)
      security:
        - oauth2:
            - rfidregistry:read
            - rfidregistry:edit
          bearerHttp: []
  "/rfidregistry/api/v1/record/{id}":
    get:
      summary: >-
        Метод получения записи.

        Разрешения: rfidregistry:record:card.

        Метод доступен для: Token: seller, employee, application, service, device_admin, ltp_first, admin, master, owner, mrf, bti, manager, external_seller. При наличии разрешений
      operationId: RecordService_GetRecord
      responses:
        "200":
          description: Успешный ответ
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/v1GetRecordResponse"
        "400":
          description: Ошибка
        "401":
          description: Запрос не авторизован
        "403":
          description: В доступе отказано
        "404":
          description: Объект не найден
        "500":
          description: Внутренняя ошибка сервиса
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/rpcStatus"
      parameters:
        - name: id
          description: |-
            Идентификатор.
            # Тип: Guid
          in: path
          required: true
          schema:
            type: string
        - in: header
          name: X-Request-Id
          schema:
            type: string
            format: uuid
          description: Уникальный идентификатор запроса. Создаётся клиентом на каждый запрос
        - in: header
          name: X-Device-Id
          schema:
            type: string
          description: Уникальный идентификатор устройства. Создаётся клиентом при первом
            запуске приложения. Если есть способ однозначно узнать идентификатор
            устройства, то создаётся на основе него и остаётся неизменным после
            переустановки приложения
        - in: header
          name: X-Api-Key
          schema:
            type: string
          description: Уникальный ключ для партнера. Создается администратором и
            передается партнерам.
        - in: header
          name: Canary
          schema:
            type: string
          description: Параметр балансировки запроса. Если для заголовка запроса
            установлено значение always, он будет перенаправлен на канареечный
            деплой. Если для заголовка установлено значение never, он никогда не
            будет перенаправлен на канареечный деплой
      tags:
        - record(auth)
      security:
        - oauth2:
            - rfidregistry:read
            - rfidregistry:edit
          bearerHttp: []
    delete:
      summary: >-
        Метод удаления записи.

        Можно удалять только свои записи.

        Нельзя удалить ключ, если его использует кто-то другой.

        Разрешения: rfidregistry:record:remove.

        Метод доступен для: Token: seller, employee, application, service, device_admin, ltp_first, admin, master, owner, mrf, bti, manager, external_seller. При наличии разрешений
      operationId: RecordService_DeleteRecord
      responses:
        "200":
          description: Успешный ответ
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/v1DeleteRecordResponse"
        "400":
          description: Ошибка
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/v1DeleteRecordResponse"
        "401":
          description: Запрос не авторизован
        "403":
          description: В доступе отказано
        "404":
          description: Объект не найден
        "500":
          description: Внутренняя ошибка сервиса
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/v1DeleteRecordResponse"
        default:
          description: Ошибки транспортного слоя
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/rpcStatus"
      parameters:
        - name: id
          description: |-
            Идентификатор записи.
            # Тип: Guid
          in: path
          required: true
          schema:
            type: string
        - in: header
          name: X-Request-Id
          schema:
            type: string
            format: uuid
          description: Уникальный идентификатор запроса. Создаётся клиентом на каждый запрос
        - in: header
          name: X-Device-Id
          schema:
            type: string
          description: Уникальный идентификатор устройства. Создаётся клиентом при первом
            запуске приложения. Если есть способ однозначно узнать идентификатор
            устройства, то создаётся на основе него и остаётся неизменным после
            переустановки приложения
        - in: header
          name: X-Api-Key
          schema:
            type: string
          description: Уникальный ключ для партнера. Создается администратором и
            передается партнерам.
        - in: header
          name: Canary
          schema:
            type: string
          description: Параметр балансировки запроса. Если для заголовка запроса
            установлено значение always, он будет перенаправлен на канареечный
            деплой. Если для заголовка установлено значение never, он никогда не
            будет перенаправлен на канареечный деплой
      tags:
        - record(auth)
      security:
        - oauth2:
            - rfidregistry:edit
          bearerHttp: []
  /rfidregistry/api/v1/system/status:
    get:
      summary: |-
        Метод получения статуса сервиса.
        Не требует авторизации
      operationId: SystemService_GetSystemStatus
      responses:
        "200":
          description: Успешный ответ
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/v1GetSystemStatusResponse"
        "400":
          description: Ошибка
        "500":
          description: Внутренняя ошибка сервиса
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/rpcStatus"
      tags:
        - system(public)
      parameters:
        - in: header
          name: X-Request-Id
          schema:
            type: string
            format: uuid
          description: Уникальный идентификатор запроса. Создаётся клиентом на каждый запрос
        - in: header
          name: X-Device-Id
          schema:
            type: string
          description: Уникальный идентификатор устройства. Создаётся клиентом при первом
            запуске приложения. Если есть способ однозначно узнать идентификатор
            устройства, то создаётся на основе него и остаётся неизменным после
            переустановки приложения
        - in: header
          name: X-Api-Key
          schema:
            type: string
          description: Уникальный ключ для партнера. Создается администратором и
            передается партнерам.
        - in: header
          name: Canary
          schema:
            type: string
          description: Параметр балансировки запроса. Если для заголовка запроса
            установлено значение always, он будет перенаправлен на канареечный
            деплой. Если для заголовка установлено значение never, он никогда не
            будет перенаправлен на канареечный деплой
components:
  schemas:
    RecordAesKeyConfiguration:
      type: object
      properties:
        address:
          type: string
          title: |-
            Адрес.
            # Паттерн: /^[A-Za-z0-9=]+$/
        data:
          type: string
          title: |-
            Данные.
            # Паттерн: /^[A-Za-z0-9=]+$/
      title: Конфигурация шифрования ключа
      required:
        - address
        - data
    RecordDataCell:
      type: object
      properties:
        section:
          type: integer
          format: int32
          title: |-
            Сектор.
            # Диапазон: 0..127
        block:
          type: integer
          format: int32
          title: |-
            Блок.
            # Диапазон: 0..127
        data:
          type: string
          title: |-
            Данные.
            # Паттерн: /^[A-Za-z0-9=]+$/
      title: Содержимое ячейки ключа
      required:
        - section
        - block
        - data
    RecordEncryptionType:
      type: string
      enum:
        - SL0
        - SL1
        - SL3
      description: |-
        - ENCRYPTION_TYPE_UNKNOWN: Значение не указано
         - SL0: Без шифрования
         - SL1: С шифрованием, копируемый
         - SL3: С шифрованием, не копируемый
      title: |-
        Справочник типов шифрования ключа.
        # Тип: byte
    RecordIdentificationMethodType:
      type: string
      enum:
        - MIFARE
        - BLE
        - UHF
        - EM_MARINE
      description: |-
        - IDENTIFICATION_METHOD_TYPE_UNKNOWN: Значение не указано
         - MIFARE: Значение Mifare
         - BLE: Значение Bluetooth low energy
         - UHF: Значение Ultra high frequency
         - EM_MARINE: Значение em-marine
      title: |-
        Справочник методов идентификации.
        # Тип: byte
    RecordPagingDirectionType:
      type: string
      enum:
        - DESC
        - ASC
      description: |-
        - DIRECTION_TYPE_UNKNOWN: Значение не указано
         - DESC: От большего к меньшему
         - ASC: От меньшего к большему
      title: |-
        Справочник типов направлений сортировки.
        # Тип: byte
    RecordPagingOrderByType:
      type: string
      enum:
        - NEW_AT
        - CHANGED_AT
        - ORDER_AT
        - ORDER_NUMBER
        - RANK
      description: >-
        - ORDER_BY_TYPE_UNKNOWN: Значение не указано
         - NEW_AT: По дате перевода в статус new (дате создания)
         - CHANGED_AT: По времени изменения
         - ORDER_AT: По времени заказа
         - ORDER_NUMBER: По номеру заказа
         - RANK: По рангу для поиска по тексту.
        Применяется когда передано поле для поиска по тексту.

        В случае если текстовое поле не передано, применяется значение по умолчанию
      title: |-
        Справочник типов значений сортировки.
        # Тип: byte
    RecordRfidType:
      type: string
      enum:
        - FOB
        - CARD
        - BAND
        - STICKER
        - ACTIVE_TAG
      description: |-
        - RFID_TYPE_UNKNOWN: Значение не указано
         - FOB: Брелок
         - CARD: Карта
         - BAND: Браслет
         - STICKER: Стикер
         - ACTIVE_TAG: Активная метка
      title: |-
        Справочник типов ключей.
        # Тип: byte
    RecordSavingError:
      type: object
      properties:
        statusTypeRestricted:
          title: Перевод статуса запрещён
          allOf:
            - $ref: "#/components/schemas/SavingErrorStatusTypeRestricted"
        uidExist:
          title: Запись уже существует
          allOf:
            - $ref: "#/components/schemas/SavingErrorUidExist"
        ownedByAnotherUser:
          title: Вы не владелец
          allOf:
            - $ref: "#/components/schemas/SavingErrorOwnedByAnotherUser"
        alreadyLinked:
          title: Ключ уже использован
          allOf:
            - $ref: "#/components/schemas/SavingErrorAlreadyLinked"
        conflict:
          title: Конфликт версий
          allOf:
            - $ref: "#/components/schemas/SavingErrorConflict"
      title: >-
        Ошибка сохранения записи.

        Эти проверки выполняются при работе с базой данных и сторонними сервисами
    RecordStatusType:
      type: string
      enum:
        - NEW
        - SHIPPED
        - DEFECT
        - IN_USE
      description: |-
        - STATUS_TYPE_UNKNOWN: Значение не указано
         - NEW: Новый
         - SHIPPED: Отгружен
         - DEFECT: Брак
         - IN_USE: Использован
      title: |-
        Справочник типов статусов ключа.
        # Тип: byte
    RecordTrailer:
      type: object
      properties:
        sector:
          type: integer
          format: int32
          title: |-
            Сектор.
            # Диапазон: 0..15
        keyA:
          type: string
          title: |-
            Ключ А.
            # Диапазон: 1..256
        keyB:
          type: string
          title: |-
            Ключ Б.
            # Диапазон: 1..256
        accessMask:
          type: string
          title: |-
            Маска доступа.
            # Диапазон: 1..512
      title: Контрольная сумма
      required:
        - sector
        - keyA
        - keyB
        - accessMask
    SavingErrorAlreadyLinked:
      type: object
      title: |-
        Причины:
        - Такой ключ уже привязан к другой записи
    SavingErrorConflict:
      type: object
      title: >-
        Причины:

        - В базе хранится более новая версия записи, значения changed_at отличаются
    SavingErrorOwnedByAnotherUser:
      type: object
      title: |-
        Причины:
        - Запись принадлежит другому пользователю
    SavingErrorStatusTypeRestricted:
      type: object
      title: >-
        Причины:

        - Недопустимый перевод статуса.

        - Не переданы обязательные поля https://openapi-key.deploy.rtkit.dev/keyapis_rfidregistry_v1/#таблица-обязательности-передачи-полей-в-request
    SavingErrorUidExist:
      type: object
      title: |-
        Причины:
        - Ключ уже существует
    protobufAny:
      type: object
      properties:
        "@type":
          type: string
      additionalProperties: {}
      title: Произвольный JSON
    rpcStatus:
      type: object
      properties:
        code:
          type: integer
          format: int32
        message:
          type: string
        details:
          type: array
          items:
            $ref: "#/components/schemas/protobufAny"
      title: Ошибка транспортного слоя
    v1DeleteRecordResponse:
      type: object
      properties:
        error:
          title: Ошибка
          allOf:
            - $ref: "#/components/schemas/v1DeleteRecordResponseError"
      title: Ответ на запрос удаления записи из реестра
    v1DeleteRecordResponseError:
      type: object
      properties:
        validation:
          title: Ошибка валидации
          allOf:
            - $ref: "#/components/schemas/v1ValidationError"
      title: Ошибка удаления записи
    v1GetRecordCountResponse:
      type: object
      properties:
        data:
          type: integer
          format: int32
          title: Всего записей
        error:
          title: Ошибка
          allOf:
            - $ref: "#/components/schemas/v1GetRecordCountResponseError"
      title: Ответ на запрос получения количества записей
    v1GetRecordCountResponseError:
      type: object
      properties:
        validation:
          title: Ошибка фильтрации записей
          allOf:
            - $ref: "#/components/schemas/v1ValidationError"
      title: Ошибка запроса получения количества записей
    v1GetRecordListResponse:
      type: object
      properties:
        data:
          title: Запись
          allOf:
            - $ref: "#/components/schemas/v1Record"
        error:
          title: Ошибка
          allOf:
            - $ref: "#/components/schemas/v1GetRecordListResponseError"
      title: Ответ на запрос получения списка записей
    v1GetRecordListResponseError:
      type: object
      properties:
        validation:
          title: Ошибка фильтрации записей
          allOf:
            - $ref: "#/components/schemas/v1ValidationError"
      title: Ошибка запроса получения списка записей
    v1GetRecordResponse:
      type: object
      properties:
        data:
          title: Запись
          allOf:
            - $ref: "#/components/schemas/v1Record"
      title: Ответ на запрос получения записи
    v1GetSystemStatusResponse:
      type: object
      title: Ответ на запрос проверки доступности сервиса
    v1PostRecordRequest:
      type: object
      properties:
        data:
          title: Запись
          allOf:
            - $ref: "#/components/schemas/v1Record"
      title: Запрос сохранения записи
      required:
        - data
    v1PostRecordResponse:
      type: object
      properties:
        data:
          title: Запись
          allOf:
            - $ref: "#/components/schemas/v1Record"
        error:
          title: Ошибка
          allOf:
            - $ref: "#/components/schemas/v1PostRecordResponseError"
      title: Ответ на запрос сохранения записи
    v1PostRecordResponseError:
      type: object
      properties:
        validation:
          title: Ошибка валидации
          allOf:
            - $ref: "#/components/schemas/v1ValidationError"
        saving:
          title: Ошибка сохранения записи
          allOf:
            - $ref: "#/components/schemas/RecordSavingError"
      title: Ошибка запроса сохранения записи
    v1Record:
      type: object
      properties:
        id:
          type: string
          title: |-
            Идентификатор.
            Если не передан создаётся сервером.
            # Тип: Guid
        rfidType:
          title: Тип ключа
          allOf:
            - $ref: "#/components/schemas/RecordRfidType"
        encryptionType:
          title: |-
            Тип шифрования ключа.
            Максимально поддерживаемый ключом тип шифрования
          allOf:
            - $ref: "#/components/schemas/RecordEncryptionType"
        uid:
          type: string
          title: |-
            Номер ключа.
            Указывается при создании.
            # Диапазон: 1..14
        statusType:
          title: Тип статуса ключа
          allOf:
            - $ref: "#/components/schemas/RecordStatusType"
        newAt:
          type: string
          format: date-time
          title: |-
            Дата перевода в статус "Новый".
            # Тип: DateTime
          readOnly: true
        shippedAt:
          type: string
          format: date-time
          title: |-
            Дата перевода в статус "Отгружен".
            # Тип: DateTime
          readOnly: true
        defectAt:
          type: string
          format: date-time
          title: |-
            Дата перевода в статус "Брак".
            # Тип: DateTime
          readOnly: true
        inUseAt:
          type: string
          format: date-time
          title: |-
            Дата перевода в статус "Использован".
            # Тип: DateTime
          readOnly: true
        inUseRfidId:
          type: string
          title: |-
            Идентификатор привязанного ключа.
            Заполняется при переводе в статус "Использован".
            # Диапазон: 0..16
        dataCells:
          type: array
          items:
            $ref: "#/components/schemas/RecordDataCell"
          title: Содержимое ячеек ключа
        resourceOwnerId:
          type: string
          title: |-
            Идентификатор владельца.
            Заполняется сервером.
            # Диапазон: 0..255
          readOnly: true
        packageInfoBox:
          type: integer
          format: int32
          title: |-
            Номер коробки.
            # Диапазон: 1..2147483647
        packageInfoPlace:
          type: integer
          format: int32
          title: |-
            Номер места в коробке.
            # Диапазон: 1..2147483647
        changedAt:
          type: string
          format: date-time
          title: |-
            Дата последнего изменения.
            Заполняется и обновляется сервером.
            Заполняется при создании и изменении.
            Является версией объекта.
            # Тип: DateTime
          readOnly: true
        aesKeyConfigurations:
          type: array
          items:
            $ref: "#/components/schemas/RecordAesKeyConfiguration"
          title: Конфигурации шифрования ключа
        trailers:
          type: array
          items:
            $ref: "#/components/schemas/RecordTrailer"
          title: |-
            Контрольные суммы.
            Нужны для ключей SL1 и SL3
        orderNumber:
          type: string
          title: |-
            Номер заказа.
            # Диапазон: 0..256
        orderAt:
          type: string
          format: date-time
          title: |-
            Дата заказа.
            # Тип: DateTime
        inUseResourceOwnerId:
          type: string
          title: >-
            Владелец привязанного ключа.

            Заполняется сервером, значение берётся из токена при использовании ключа.

            # Диапазон: 0..255
          readOnly: true
        isDeleted:
          type: boolean
          title: Признак, удалена ли запись
          readOnly: true
        deletedAt:
          type: string
          format: date-time
          title: |-
            Дата удаления.
            # Тип: DateTime
          readOnly: true
        vendorName:
          type: string
          title: |-
            Производитель.
            # Диапазон: 3..100
        identificationMethodType:
          title: Метод идентификации
          allOf:
            - $ref: "#/components/schemas/RecordIdentificationMethodType"
      title: |-
        Запись.
        # Описание модели
      required:
        - rfidType
        - encryptionType
        - uid
        - statusType
        - orderNumber
        - orderAt
    v1RecordFilter:
      type: object
      properties:
        rfidTypes:
          type: array
          items:
            $ref: "#/components/schemas/RecordRfidType"
          title: По типам ключей
        encryptionTypes:
          type: array
          items:
            $ref: "#/components/schemas/RecordEncryptionType"
          title: По типам шифрования
        uids:
          type: array
          items:
            type: string
          title: По номерам ключей
        statusTypes:
          type: array
          items:
            $ref: "#/components/schemas/RecordStatusType"
          title: По типам статуса
        inUseRfidIds:
          type: array
          items:
            type: string
          title: По номерам привязанных ключей
        resourceOwnerIds:
          type: array
          items:
            type: string
          title: По владельцам
        orderNumbers:
          type: array
          items:
            type: string
          title: По номерам заказа
        inUseResourceOwnerIds:
          type: array
          items:
            type: string
          title: По владельцам привязанных ключей
        isDeleted:
          type: boolean
          title: |-
            По удалённым записям.
            По умолчанию: false
        text:
          type: string
          title: |-
            По тексту.
            Если значение не передано то поиск по нему не производится.
            # Диапазон: 3..64.
            # Поиск производится по полям:
            # - Номер заказа;
            # - Производитель
        startShippedAt:
          type: string
          format: date-time
          title: Дата отгрузки от
        endShippedAt:
          type: string
          format: date-time
          title: Дата отгрузки до
        packageInfoBoxes:
          type: array
          items:
            type: integer
            format: int32
          title: По номеру коробки
        packageInfoPlaces:
          type: array
          items:
            type: integer
            format: int32
          title: По номеру места в коробке
        identificationMethodTypes:
          type: array
          items:
            $ref: "#/components/schemas/RecordIdentificationMethodType"
          title: По методу идентификации
      title: Фильтр записей
    v1RecordPaging:
      type: object
      properties:
        orderByType:
          title: |-
            Тип значения сортировки.
            Если значение не передано, то будет взято значение по умолчанию.
            # По умолчанию: NEW_AT
          allOf:
            - $ref: "#/components/schemas/RecordPagingOrderByType"
        directionType:
          title: |-
            Тип направления сортировки.
            # По умолчанию: DESC
          allOf:
            - $ref: "#/components/schemas/RecordPagingDirectionType"
        limit:
          type: integer
          format: int32
          title: |-
            Количество записей на страницу.
            Если значение 0 (не передано), то будет взято значение по умолчанию.
            # Диапазон: 0..100.
            # По умолчанию: 20
        offset:
          type: integer
          format: int32
          title: |-
            Сдвиг.
            # Диапазон: 0..2147483647
      title: Пагинация записей
    v1ValidationError:
      type: object
      properties:
        path:
          type: string
          title: Путь к полю в формате наименования прото
        message:
          type: string
          title: Валидационное сообщение
      title: |-
        Ошибки валидации.
        Эти проверки выполняются до обращения в базу данных
      required:
        - path
        - message
  securitySchemes:
    bearerHttp:
      type: http
      scheme: bearer
      bearerFormat: JWT
    oauth2:
      type: oauth2
      flows:
        clientCredentials:
          tokenUrl: https://oauth2-staging.k8s.key.rt.ru/oauth2/token
          scopes:
            rfidregistry:edit: Предоставляет полный доступ в сервис rfidregistry
            rfidregistry:read: Предоставляет доступ на чтение данных из сервиса rfidregistry
servers:
  - url: https://keyapis-staging.k8s.key.rt.ru
    description: staging
  - url: https://{feature}.k8s.key.rt.ru/
    description: https feature
    variables:
      feature:
        default: ""
        description: Feature name
  - url: http://{feature}.k8s.key.rt.ru/
    description: http feature
    variables:
      feature:
        default: ""
        description: Feature name
  - url: https://localhost:3001
    description: localhost
  - url: https://keyapis.key.rt.ru
    description: production
