From 4f844507a743ff221b24254dee032c0ffd0b7770 Mon Sep 17 00:00:00 2001 From: aenadgrleey Date: Fri, 27 Mar 2026 14:23:48 +0100 Subject: [PATCH 1/2] add view submit webhook to typespec --- packages/spec/openapi.yaml | 93 ++++++++++++++++++++++++++++++++++++++ packages/spec/typespec.tsp | 68 ++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+) diff --git a/packages/spec/openapi.yaml b/packages/spec/openapi.yaml index c712e76f..5ab6e6ab 100644 --- a/packages/spec/openapi.yaml +++ b/packages/spec/openapi.yaml @@ -7962,6 +7962,98 @@ components: - $ref: '#/components/schemas/ViewBlockTime' - $ref: '#/components/schemas/ViewBlockFileInput' description: Union-тип для всех возможных блоков представления + ViewSubmitWebhookFile: + type: object + required: + - name + - size + - url + properties: + name: + type: string + description: Название файла с расширением + example: request.png + size: + type: integer + format: int32 + description: Размер файла в байтах + example: 19153 + url: + type: string + description: Временная прямая ссылка на скачивание файла + example: https://files.example.com/request.png + description: Файл, загруженный пользователем в форме и переданный в исходящем вебхуке + ViewSubmitWebhookPayload: + type: object + required: + - type + - event + - user_id + - data + - webhook_timestamp + properties: + type: + type: string + enum: + - view + description: Тип объекта + example: view + x-enum-descriptions: + view: Для представлений всегда view + event: + type: string + enum: + - submit + description: Тип события + example: submit + x-enum-descriptions: + submit: Отправка формы + private_metadata: + type: string + description: Строка, заданная при открытии представления + example: '{"timeoff_id":4378}' + callback_id: + type: string + description: Идентификатор представления, заданный при открытии формы + example: timeoff_reguest_form + user_id: + type: integer + format: int32 + description: Идентификатор пользователя, который заполнил форму + example: 1235523 + data: + type: object + additionalProperties: + anyOf: + - type: string + - type: array + items: + type: string + - type: array + items: + $ref: '#/components/schemas/ViewSubmitWebhookFile' + nullable: true + description: JSON карта заполненных полей представления, где каждый ключ совпадает со значением `name` соответствующего блока. Значением может быть строка, массив строк, массив загруженных файлов или null. + example: + date_start: '2025-07-01' + date_end: '2025-07-14' + request_doc: + - name: request.png + size: 19153 + url: https://files.example.com/request.png + accessibility: phone_only + info: Поеду в сибирь на свадьбу лучшего друга + newsletters: + - new_tasks + - project_updates + team: success + time: '22:00' + webhook_timestamp: + type: integer + format: int32 + description: Дата и время отправки вебхука (UTC+0) в формате UNIX + example: 1755075544 + description: Структура исходящего вебхука о заполнении формы WebhookEvent: type: object required: @@ -8036,6 +8128,7 @@ components: - $ref: '#/components/schemas/MessageWebhookPayload' - $ref: '#/components/schemas/ReactionWebhookPayload' - $ref: '#/components/schemas/ButtonWebhookPayload' + - $ref: '#/components/schemas/ViewSubmitWebhookPayload' - $ref: '#/components/schemas/ChatMemberWebhookPayload' - $ref: '#/components/schemas/CompanyMemberWebhookPayload' - $ref: '#/components/schemas/LinkSharedWebhookPayload' diff --git a/packages/spec/typespec.tsp b/packages/spec/typespec.tsp index 839b3b62..9a4bd239 100644 --- a/packages/spec/typespec.tsp +++ b/packages/spec/typespec.tsp @@ -2796,6 +2796,73 @@ model ButtonWebhookPayload { webhook_timestamp: int32; } +@doc("Файл, загруженный пользователем в форме и переданный в исходящем вебхуке") +model ViewSubmitWebhookFile { + @doc("Название файла с расширением") + @example("request.png") + name: string; + + @doc("Размер файла в байтах") + @example(19153) + size: int32; + + @doc("Временная прямая ссылка на скачивание файла") + @example("https://files.example.com/request.png") + url: string; +} + +@doc("Структура исходящего вебхука о заполнении формы") +model ViewSubmitWebhookPayload { + @doc("Тип объекта") + @example("view") + @extension("x-enum-descriptions", #{ + view: "Для представлений всегда view" + }) + type: "view"; + + @doc("Тип события") + @example("submit") + @extension("x-enum-descriptions", #{ + submit: "Отправка формы" + }) + event: "submit"; + + @doc("Строка, заданная при открытии представления") + @example("{\"timeoff_id\":4378}") + private_metadata?: string; + + @doc("Идентификатор представления, заданный при открытии формы") + @example("timeoff_reguest_form") + callback_id?: string; + + @doc("Идентификатор пользователя, который заполнил форму") + @example(1235523) + user_id: int32; + + @doc("JSON карта заполненных полей представления, где каждый ключ совпадает со значением `name` соответствующего блока. Значением может быть строка, массив строк, массив загруженных файлов или null.") + @example(#{ + date_start: "2025-07-01", + date_end: "2025-07-14", + request_doc: #[ + #{ + name: "request.png", + size: 19153, + url: "https://files.example.com/request.png" + } + ], + accessibility: "phone_only", + info: "Поеду в сибирь на свадьбу лучшего друга", + newsletters: #["new_tasks", "project_updates"], + team: "success", + time: "22:00" + }) + data: Record; + + @doc("Дата и время отправки вебхука (UTC+0) в формате UNIX") + @example(1755075544) + webhook_timestamp: int32; +} + @doc("Структура исходящего вебхука об участниках чата") model ChatMemberWebhookPayload { @doc("Тип объекта") @@ -2912,6 +2979,7 @@ union WebhookPayloadUnion { MessageWebhookPayload, ReactionWebhookPayload, ButtonWebhookPayload, + ViewSubmitWebhookPayload, ChatMemberWebhookPayload, CompanyMemberWebhookPayload, LinkSharedWebhookPayload, From a1cd939b0401aaf33ad4302240fde8501f44ba3e Mon Sep 17 00:00:00 2001 From: aenadgrleey Date: Fri, 27 Mar 2026 16:11:30 +0100 Subject: [PATCH 2/2] keep view submit webhook out of union --- packages/spec/openapi.yaml | 1 - packages/spec/typespec.tsp | 1 - 2 files changed, 2 deletions(-) diff --git a/packages/spec/openapi.yaml b/packages/spec/openapi.yaml index 5ab6e6ab..1f892cc5 100644 --- a/packages/spec/openapi.yaml +++ b/packages/spec/openapi.yaml @@ -8128,7 +8128,6 @@ components: - $ref: '#/components/schemas/MessageWebhookPayload' - $ref: '#/components/schemas/ReactionWebhookPayload' - $ref: '#/components/schemas/ButtonWebhookPayload' - - $ref: '#/components/schemas/ViewSubmitWebhookPayload' - $ref: '#/components/schemas/ChatMemberWebhookPayload' - $ref: '#/components/schemas/CompanyMemberWebhookPayload' - $ref: '#/components/schemas/LinkSharedWebhookPayload' diff --git a/packages/spec/typespec.tsp b/packages/spec/typespec.tsp index 9a4bd239..b8479e50 100644 --- a/packages/spec/typespec.tsp +++ b/packages/spec/typespec.tsp @@ -2979,7 +2979,6 @@ union WebhookPayloadUnion { MessageWebhookPayload, ReactionWebhookPayload, ButtonWebhookPayload, - ViewSubmitWebhookPayload, ChatMemberWebhookPayload, CompanyMemberWebhookPayload, LinkSharedWebhookPayload,