openapi: 3.0.1

info:
  title: YuChat Bot API
  version: 1.1.3
  description: Публичный API для работы с YuChat.
  contact:
    name: Команда YuChat
    url: https://www.yuchat.ai
    email: support@yuchat.ai

servers:
  - url: https://yuchat.ai

tags:
  - name: message
    description: Отправка/редактирование/удаление сообщений
  - name: chat
    description: Создание чатов, просмотр/приглашение участников в чат
  - name: member
    description: Просмотр участников воркспейса
  - name: updates
    description: Получение всех событий, адресованных боту
  - name: webhook
    description: Создание, просмотр, удаление вебхуков
  - name: file
    description: Получение ссылки для загрузки файлов

paths:
  /public/v1/chat.message.send:
    post:
      description: Отправка сообщения от имени бота
      tags:
        - message
      operationId: sendChatMessage
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SendChatMessagePublicV1Request'
        required: true
      responses:
        "200":
          description: Сообщение успешно отправлено, в теле ответа есть ID этого сообщения
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SendChatMessagePublicV1Response'
        "401":
          $ref: '#/components/responses/UnauthorizedError'

  /public/v1/chat.message.edit:
    post:
      description: Редактирование сообщения
      tags:
        - message
      operationId: editChatMessage
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EditChatMessagePublicV1Request'
        required: true
      responses:
        "200":
          description: Сообщение успешно отредактировано, в теле ответа находится время последнего обновления, ID сообщения остается прежним
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EditChatMessagePublicV1Response'
        "401":
          $ref: '#/components/responses/UnauthorizedError'

  /public/v1/chat.message.delete:
    post:
      description: Удаление сообщения
      tags:
        - message
      operationId: deleteChatMessage
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeleteChatMessagePublicV1Request'
        required: true
      responses:
        "200":
          description: Сообщение успешно удалено, в теле ответа находится время удаления
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeleteChatMessagePublicV1Response'
        "401":
          $ref: '#/components/responses/UnauthorizedError'

  /public/v1/chat.message.forward:
    post:
      description: Пересылка сообщения в другой чат
      tags:
        - message
      operationId: forwardChatMessage
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ForwardChatMessagePublicV1Request'
        required: true
      responses:
        "200":
          description: Сообщение успешно переслано, в теле ответа находится ID пересланного сообщения
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ForwardChatMessagePublicV1Response'
        "401":
          $ref: '#/components/responses/UnauthorizedError'

  /public/v1/chat.workspace.create:
    post:
      description: Создание публичного/приватного чата внутри воркспейса
      tags:
        - chat
      operationId: createWorkspaceChat
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateWorkspaceChatPublicV1Request'
        required: true
      responses:
        "200":
          description: Чат успешно создан, в теле ответа находится ID чата
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateWorkspaceChatPublicV1Response'
        "401":
          $ref: '#/components/responses/UnauthorizedError'

  /public/v1/chat.personal.create:
    post:
      description: Создание персонального чата (личные сообщения)
      tags:
        - chat
      operationId: createPersonalChat
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreatePersonalChatPublicV1Request'
        required: true
      responses:
        "200":
          description: Персональный чат успешно создан, в теле ответа находится ID чата
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreatePersonalChatPublicV1Response'
        "401":
          $ref: '#/components/responses/UnauthorizedError'

  /public/v1/chat.thread.create:
    post:
      description: Создание обсуждения внутри чата
      tags:
        - chat
      operationId: createThreadChat
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateThreadChatPublicV1Request'
        required: true
      responses:
        "200":
          description: Обсуждение успешно создано, в теле ответа находится ID чата
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateThreadChatPublicV1Response'
        "401":
          $ref: '#/components/responses/UnauthorizedError'

  /public/v1/chat.workspace.list:
    post:
      description: Получение списка чатов внутри воркспейса
      tags:
        - chat
      operationId: listWorkspaceChats
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ListWorkspaceChatsPublicV1Request'
        required: true
      responses:
        "200":
          description: Список чатов
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListWorkspaceChatsPublicV1Response'
        "401":
          $ref: '#/components/responses/UnauthorizedError'

  /public/v1/chat.invite:
    post:
      description: Приглашение участников в чат
      tags:
        - chat
      operationId: inviteToChat
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/InviteToChatPublicV1Request'
        required: true
      responses:
        "200":
          description: Участники успешно приглашены, в теле ответа находится информация о чате, в том числе ID участников
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InviteToChatPublicV1Response'
        "401":
          $ref: '#/components/responses/UnauthorizedError'

  /public/v1/chat.kick:
    post:
      description: Удаление участника из чата
      tags:
        - chat
      operationId: kickFromChat
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/KickFromChatPublicV1Request'
        required: true
      responses:
        "200":
          description: Участники успешно удалены, в теле ответа находится информация о чате, в том числе ID оставшихся участников
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/KickFromChatPublicV1Response'
        "401":
          $ref: '#/components/responses/UnauthorizedError'

  /public/v1/member.list:
    post:
      description: Получение списка участников воркспейса
      tags:
        - member
      operationId: listMembers
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MemberListPublicV1Request'
        required: true
      responses:
        "200":
          description: Список участников
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemberListPublicV1Response'
        "401":
          $ref: '#/components/responses/UnauthorizedError'

  /public/v1/file.getPreSignedUrl:
    post:
      description: Получение ссылки для загрузки файла на сервер
      tags:
        - file
      operationId: getPreSignedUrl
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GetFilePreSignedUrlPublicV1Request'
        required: true
      responses:
        "200":
          description: Ссылка для загрузки файла и ID файла
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetFilePreSignedUrlPublicV1Response'
        "401":
          $ref: '#/components/responses/UnauthorizedError'

  /public/v1/file.getDownloadUrl:
    post:
      description: Получение ссылки для скачивания файла
      tags:
        - file
      operationId: getDownloadUrl
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GetFileDownloadUrlPublicV1Request'
        required: true
      responses:
        "200":
          description: Ссылка для загрузки файла
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetFileDownloadUrlPublicV1Response'
        "401":
          $ref: '#/components/responses/UnauthorizedError'

  /public/v1/bot.getUpdates:
    get:
      description: Получение всех событий, адресованных боту (личные сообщения, упоминания в чатах, приглашение в чаты и т. д.)
      operationId: getUpdates
      tags:
        - updates
      parameters:
        - name: offset
          in: query
          description: ID последнего обработанного события. Если не указан, возвращаются все события.
          required: false
          schema:
            type: integer
            format: int64
        - name: limit
          in: query
          description: Максимальное количество событий, которое нужно вернуть. По умолчанию 100.
          required: false
          schema:
            type: integer
            default: 100
      responses:
        "200":
          description: Список событий, адресованных боту
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Update'
  /public/v1/bot.setWebhook:
    post:
      operationId: setWebhook
      tags:
        - webhook
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SetWebhookPublicV1Request'
      responses:
        "200":
          description: setWebhook 200 response
          content:
            application/json:
              schema:
                type: object
                nullable: true
  /public/v1/bot.deleteWebhook:
    delete:
      operationId: deleteWebhook
      tags:
        - webhook
      responses:
        "200":
          description: deleteWebhook 200 response
          content:
            application/json:
              schema:
                type: object
                nullable: true
  /public/v1/bot.getWebhookInfo:
    get:
      operationId: getWebhookInfo
      tags:
        - webhook
      responses:
        "200":
          description: getWebhookInfo 200 response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetWebhookInfoPublicV1Response'
        "404":
          description: getWebhookInfo 404 response
          content:
            application/json:
              schema:
                type: object
                nullable: true
components:
  schemas:
    WorkspaceId:
      description: ID воркспейса
      example: "w67Y89gu"
      type: string
      format: flake-id

    ChatId:
      description: ID чата, уникальный в рамках воркспейса
      example: "c56Y0kgi"
      type: string
      format: string-id

    ChatMessageId:
      description: ID сообщения, уникальный в рамках воркспейса и чата
      example: "m56Y0kgi"
      type: string
      format: flake-id

    AccountId:
      description: ID аккаунта пользователя
      example: "a56Y0kgi"
      type: string
      format: flake-id

    MembershipId:
      description: ID пользователя в конкретном воркспейсе
      example: "a56Y0kgi"
      type: string
      format: flake-id

    NewChatMessage:
      description: Сообщение, которое видит бот
      example:
        workspaceId: "w67Y89gu"
        chatId: "c56Y0kgi"
        messageId: "m56Y0kgi"
        author: "a56Y0kgi"
        markdown: "Напоминаю, сегодня корпоратив в 19:00 (боты тоже приглашены)"
      required:
        - workspaceId
        - chatId
        - messageId
        - markdown
        - author
        - createdAt
      type: object
      properties:
        workspaceId:
          $ref: '#/components/schemas/WorkspaceId'
        chatId:
          $ref: '#/components/schemas/ChatId'
        messageId:
          $ref: '#/components/schemas/ChatMessageId'
        author:
          $ref: '#/components/schemas/AccountId'
        parentMessageId:
          $ref: '#/components/schemas/ChatMessageId'
        parentMessageAuthor:
          $ref: '#/components/schemas/AccountId'
        markdown:
          type: string
        fileIds:
          type: array
          items:
            type: string
        createdAt:
          description: "Дата и время отправки сообщения"
          example: "2023-02-26T18:58:36.154+03:00"
          type: date-time

    InviteToChat:
      description: Приглашение бота в чат
      example:
        workspaceId: "w67Y89gu"
        chatId: "c56Y0kgi"
        inviter: "a56Y0kgi"
      required:
        - workspaceId
        - chatId
        - inviter
      type: object
      properties:
        workspaceId:
          $ref: '#/components/schemas/WorkspaceId'
        chatId:
          $ref: '#/components/schemas/ChatId'
        inviter:
          $ref: '#/components/schemas/AccountId'
    JoinedToChat:
      required:
        - workspaceId
        - chatId
        - joined
      type: object
      properties:
        workspaceId:
          $ref: '#/components/schemas/WorkspaceId'
        chatId:
          $ref: '#/components/schemas/ChatId'
        inviter:
          $ref: '#/components/schemas/MembershipId'
        joined:
          type: array
          items:
            $ref: '#/components/schemas/MembershipId'
    LeftFromChat:
      required:
        - workspaceId
        - chatId
        - left
      type: object
      properties:
        workspaceId:
          $ref: '#/components/schemas/WorkspaceId'
        chatId:
          $ref: '#/components/schemas/ChatId'
        kicker:
          $ref: '#/components/schemas/MembershipId'
        left:
          type: array
          items:
            $ref: '#/components/schemas/MembershipId'

    WorkspaceChat:
      description: Информация о чате
      example:
        chatId: "c56Y0kgi"
        membershipIds: [ "a56Y0kgi", "a56Y0kgi" ]
        workspaceId: "w67Y89gu"
        name: "Флудилка"
        type: "PUBLIC"
        announceChannel: true
        description: "Общение на любые темы, кроме работы"
      type: object
      properties:
        chatId:
          type: string
        membershipIds:
          type: array
          items:
            type: string
        workspaceId:
          type: string
        name:
          type: string
        type:
          $ref: '#/components/schemas/WorkspaceChatType'
        announceChannel:
          type: boolean
        description:
          type: string

    WorkspaceChatType:
      description: Тип чата (публичный, приватный, общий, breakout)
      example: "PUBLIC"
      type: string
      enum:
        - PRIVATE
        - PUBLIC
        - GENERAL
        - BREAKOUT

    ChatMemberRoleType:
      description: Роль участника в чате (участник, админ, владелец)
      example: "CHAT_MEMBER"
      type: string
      enum:
        - CHAT_MEMBER
        - CHAT_ADMIN
        - CHAT_OWNER

    ChatPermission:
      description: Права участника в чате
      example: "RENAME_CHAT"
      type: string
      enum:
        - CHANGE_ROLE
        - ARCHIVE_CHAT
        - RENAME_CHAT
        - UPDATE_CONFIG
        - KICK_FROM_CHAT
        - SEND_MESSAGES_TO_ANNOUNCE_CHANNEL
        - PIN_CHAT_MESSAGE
        - SCHEDULE_CONFERENCE

    Member:
      description: Информация об участнике воркспейса
      type: object
      properties:
        memberId:
          type: string
        profile:
          $ref: '#/components/schemas/Profile'
        roleType:
          $ref: '#/components/schemas/MemberRoleType'
        presence:
          type: object
          properties:
            isOnline:
              type: boolean
            isOnCall:
              type: boolean
            lastSeenAt:
              type: string
              format: date-time
        status:
          $ref: '#/components/schemas/MemberStatus'

    Profile:
      description: Информация о профиле участника
      type: object
      properties:
        profileId:
          type: string
        primaryEmail:
          type: string
        fullName:
          type: string
        type:
          $ref: '#/components/schemas/AccountType'
        details:
          $ref: '#/components/schemas/AccountDetails'

    AccountDetails:
      description: Дополнительная информация о пользователе
      type: object
      properties:
        position:
          type: string
        department:
          type: string
        phoneNumber:
          type: string
        location:
          $ref: '#/components/schemas/AccountLocation'

    AccountLocation:
      description: Статус участника
      type: string
      enum:
        - LOCATION_NOT_SET
        - OFFICE
        - HOME
        - VACATION

    MemberRoleType:
      description: Роль участника воркспейса
      type: string
      enum:
        - MEMBER
        - ADMIN
        - OWNER
        - GUEST
        - GUEST_CALLER

    MemberStatus:
      description: Статус аккаунта
      type: string
      enum:
        - PENDING
        - ACTIVE
        - SUSPENDED

    AccountType:
      description: Тип аккаунта
      example: "REGULAR"
      type: string
      enum:
        - REGULAR
        - BOT
        - VOICE_BOT
        - INTEGRATION_BOT
        - GUEST_ACCOUNT

    Update:
      description: Событие, адресованное боту
      type: object
      required:
        - updateId
      properties:
        updateId:
          type: integer
          format: int64
        newChatMessage:
          $ref: '#/components/schemas/NewChatMessage'
        inviteToChat:
          $ref: '#/components/schemas/InviteToChat'
        joinedToChat:
          $ref: '#/components/schemas/JoinedToChat'
        leftFromChat:
          $ref: '#/components/schemas/LeftFromChat'

    UpdateType:
      description: Тип обновления
      example: "MESSAGE"
      type: string
      enum:
        - MESSAGE
        - CHAT_MEMBER

    WebhookInfo:
      type: object
      required:
        - url
        - hasCustomCertificate
      properties:
        url:
          type: string
        hasCustomCertificate:
          type: boolean
        pendingUpdateCount:
          type: integer
        lastErrorDate:
          type: string
          format: date-time
        lastErrorMessage:
          type: string
        updateTypes:
          type: array
          items:
            $ref: '#/components/schemas/UpdateType'

    WorkspaceChatMembership:
      description: Информация о чате и его участниках
      type: object
      properties:
        chat:
          $ref: '#/components/schemas/WorkspaceChat'
        role:
          $ref: '#/components/schemas/ChatMemberRoleType'
        permissions:
          type: array
          items:
            $ref: '#/components/schemas/ChatPermission'

    SendChatMessagePublicV1Request:
      description: Отправка сообщения
      example:
        workspaceId: "w67Y89gu"
        chatId: "c56Y0kgi"
        markdown: "**Коллеги**, когда задача будет готова?"
      type: object
      required:
        - workspaceId
        - chatId
        - markdown
      properties:
        workspaceId:
          $ref: '#/components/schemas/WorkspaceId'
        chatId:
          $ref: '#/components/schemas/ChatId'
        markdown:
          description: текст сообщения
          type: string
        fileIds:
          description: ID файлов, прикрепленных к сообщению
          example: [ "f56Y0kgi", "f56Y0kgi" ]
          type: array
          items:
            type: string
          nullable: true
        replyTo:
          $ref: '#/components/schemas/ChatMessageId'

    SendChatMessagePublicV1Response:
      type: object
      required:
        - messageId
      properties:
        messageId:
          $ref: '#/components/schemas/ChatMessageId'

    EditChatMessagePublicV1Request:
      description: Редактирование сообщения
      example:
        workspaceId: "w67Y89gu"
        chatId: "c56Y0kgi"
        chatMessageId: "m56Y0kgi"
        newMarkdown: "Извините, я ошибся, все было не так"
      type: object
      required:
        - workspaceId
        - chatId
        - chatMessageId
        - newMarkdown
      properties:
        workspaceId:
          $ref: '#/components/schemas/WorkspaceId'
        chatMessageId:
          $ref: '#/components/schemas/ChatMessageId'
        chatId:
          $ref: '#/components/schemas/ChatId'
        newMarkdown:
          description: Новый текст сообщения
          type: string

    EditChatMessagePublicV1Response:
      type: object
      required:
        - updatedAt
      properties:
        updatedAt:
          type: string
          format: date-time

    DeleteChatMessagePublicV1Request:
      type: object
      required:
        - workspaceId
        - chatId
        - chatMessageId
      properties:
        workspaceId:
          $ref: '#/components/schemas/WorkspaceId'
        chatId:
          $ref: '#/components/schemas/ChatId'
        chatMessageId:
          $ref: '#/components/schemas/ChatMessageId'

    DeleteChatMessagePublicV1Response:
      type: object
      required:
        - updatedAt
      properties:
        updatedAt:
          type: string
          format: date-time

    ForwardChatMessagePublicV1Request:
      description: Пересылка сообщения
      example:
        workspaceId: "w67Y89gu"
        sourceChatId: "c56Y0kgi"
        sourceChatMessageId: "m56Y0kgi"
        targetChatId: "c56Y0kgi"
        markdown: "Смотри, что написали в другом чате..."
      type: object
      required:
        - workspaceId
        - sourceChatId
        - sourceChatMessageId
        - targetChatId
        - markdown
      properties:
        workspaceId:
          $ref: '#/components/schemas/WorkspaceId'
        sourceChatId:
          $ref: '#/components/schemas/ChatId'
        sourceChatMessageId:
          $ref: '#/components/schemas/ChatMessageId'
        targetChatId:
          $ref: '#/components/schemas/ChatId'
        markdown:
          description: Текст подписи к пересылаемому сообщению
          type: string

    ForwardChatMessagePublicV1Response:
      type: object
      required:
        - forwardedMessageId
      properties:
        messageId:
          $ref: '#/components/schemas/ChatMessageId'

    CreateWorkspaceChatPublicV1Request:
      description: Запрос на создание публичного/приватного чата внутри воркспейса
      example:
        workspaceId: "w67Y89gu"
        participants: [ "a56Y0kgi", "a56Y0kgi" ]
        name: "Чат B2B"
        type: "PRIVATE"
        announceChannel: false
        description: "Для обсуждения B2B заказов"
      type: object
      required:
        - workspaceId
      properties:
        workspaceId:
          description: ID воркспейса, в котором создается чат
          type: string
        participants:
          description: Список MembershipId участников чата
          type: array
          items:
            type: string
        name:
          description: Название чата
          type: string
        type:
          $ref: '#/components/schemas/WorkspaceChatType'
        announceChannel:
          description: false - могут писать все, true - только админы
          type: boolean
        description:
          type: string

    CreateWorkspaceChatPublicV1Response:
      example:
        chatId: "c56Y0kgi"
      type: object
      properties:
        chatId:
          type: string

    CreatePersonalChatPublicV1Request:
      description: Запрос на создание персонального чата
      example:
        workspaceId: "w67Y89gu"
        participant: "a56Y0kgi"
      type: object
      required:
        - workspaceId
        - participant
      properties:
        workspaceId:
          description: ID воркспейса, в котором создается чат
          type: string
        participant:
          description: MembershipId участника чата
          type: string

    CreatePersonalChatPublicV1Response:
      type: object
      properties:
        chatId:
          type: string

    CreateThreadChatPublicV1Request:
      description: Запрос на создание обсуждения внутри чата
      example:
        workspaceId: "w67Y89gu"
        chatId: "c56Y0kgi"
        parentMessageId: "m56Y0kgi"
      type: object
      required:
        - workspaceId
        - chatId
        - parentMessageId
      properties:
        workspaceId:
          description: ID воркспейса
          type: string
        chatId:
          description: ID чата
          type: string
        parentMessageId:
          description: ID сообщения, внутри которого создается обсуждение
          type: string

    CreateThreadChatPublicV1Response:
      type: object
      properties:
        chatId:
          type: string

    ListWorkspaceChatsPublicV1Request:
      description: Запрос на получение списка чатов внутри воркспейса
      example:
        maxCount: 100
        workspaceId: "w67Y89gu"
      type: object
      properties:
        chatIds:
          description: ID чатов, информацию о которых нужно получить. Если не указан, возвращаются все чаты в воркспейсе
          type: array
          items:
            type: string
        maxCount:
          description: Максимальное количество чатов, которое нужно вернуть. По умолчанию 100
          type: integer
        workspaceId:
          description: ID воркспейса
          type: string

    ListWorkspaceChatsPublicV1Response:
      type: object
      properties:
        workspaceChats:
          type: array
          items:
            $ref: '#/components/schemas/WorkspaceChatMembership'

    InviteToChatPublicV1Request:
      description: Запрос на приглашение участников в чат
      example:
        chatId: "c56Y0kgi"
        workspaceId: "w67Y89gu"
        memberId: [ "a56Y0kgi", "a77Y0kgi" ]
      type: object
      required:
        - chatId
        - workspaceId
        - memberId
      properties:
        chatId:
          description: ID чата
          type: string
        workspaceId:
          description: ID воркспейса
          type: string
        memberId:
          description: ID участников, которых нужно пригласить в чат
          type: array
          items:
            type: string

    InviteToChatPublicV1Response:
      type: object
      properties:
        chat:
          $ref: '#/components/schemas/WorkspaceChat'

    KickFromChatPublicV1Request:
      description: Запрос на удаление участников из чата
      example:
        chatId: "c56Y0kgi"
        workspaceId: "w67Y89gu"
        memberId: [ "a56Y0kgi", "a77Y0kgi" ]
      type: object
      required:
        - chatId
        - workspaceId
        - memberId
      properties:
        chatId:
          description: ID чата
          type: string
        workspaceId:
          description: ID воркспейса
          type: string
        memberId:
          description: ID участников, которых нужно удалить из чата
          type: array
          items:
            type: string

    KickFromChatPublicV1Response:
      type: object
      properties:
        chat:
          $ref: '#/components/schemas/WorkspaceChat'

    MemberListPublicV1Request:
      description: Запрос на получение списка участников воркспейса
      example:
        workspaceId: "w67Y89gu"
      type: object
      required:
        - workspaceId
      properties:
        workspaceId:
          description: ID воркспейса
          type: string

    MemberListPublicV1Response:
      description: список участников воркспейса
      type: object
      properties:
        members:
          type: array
          items:
            $ref: '#/components/schemas/Member'

    MediaType:
      description: Тип файла
      example: "IMAGE"
      type: string
      enum:
        - RAW
        - IMAGE
        - AUDIO
        - VIDEO
        - PDF
        - DOC
        - XLS
        - PPT

    GetFilePreSignedUrlPublicV1Request:
      description: Запрос на получение ссылки для загрузки файла
      example:
        fileName: "file.txt"
        mediaType: "RAW"
        workspaceId: "w67Y89gu"
        accessChatId: "c56Y0kgi"
      type: object
      required:
        - fileName
        - mediaType
        - workspaceId
      properties:
        fileName:
          type: string
          description: Имя файла
        mediaType:
          $ref: '#/components/schemas/MediaType'
        workspaceId:
          type: string
          description: ID воркспейса
        accessChatId:
          type: string
          nullable: true
          description: ID чата, в котором будет доступ к файлу

    GetFilePreSignedUrlPublicV1Response:
      description: Ссылка для загрузки файла и ID файла
      example:
        url: "https://yuchat.ai/file/upload/679878"
        fileId: "f56Y0kgi"
      type: object
      required:
        - url
        - fileId
      properties:
        url:
          type: string
          description: Ссылка для загрузки файла
        fileId:
          type: string
          description: ID файла

    GetFileDownloadUrlPublicV1Request:
      description: Запрос на получение ссылки для скачивания файла
      example:
        fileId: "c56Y0kgi"
      type: object
      required:
        - fileId
      properties:
        fileId:
          type: string
          description: ID файла

    GetFileDownloadUrlPublicV1Response:
      description: Ссылка для скачивания файла
      example:
        url: "https://yuchat.ai/file/upload/679878"
      type: object
      required:
        - url
      properties:
        url:
          type: string
          description: Ссылка для скачивания файла

    SetWebhookPublicV1Request:
      type: object
      required:
        - url
      properties:
        url:
          type: string
        certificate:
          type: string
          description: Полное содержимое .pem сертификата, закодированное в формате Base64 (вместе с BEGIN/END CERTIFICATE). Устанавливается, если для вебхука используется самоподписанный сертификат
        updateTypes:
          type: array
          items:
            $ref: '#/components/schemas/UpdateType'
        secretToken:
          description: Если установлен, будет содержаться в Header "X-YuСhat-Bot-Api-Secret-Token"
          type: string

    GetWebhookInfoPublicV1Response:
      type: object
      required:
        - webhookInfo
      properties:
        webhookInfo:
          $ref: '#/components/schemas/WebhookInfo'

  responses:
    UnauthorizedError:
      description: Ошибка авторизации, токен не передан или неверный

  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Токен, который можно получить от aibot@yuchat.ai с помощью команды /botcreate.
security:
  - bearerAuth: [ ]

