Отдельный документ по media→Storage и remote-просмотру исходника: что готово, что требует живого Telegram, предлагаемый план. Ссылки в backlog.
5.9 KiB
5.9 KiB
Открытые вопросы: вложения источников (media → Storage) и просмотр исходника
Дата: 2026-09-11. Статус: часть требует живого внешнего контура (Telegram API) для проверки.
1. Что уже готово (не требует решений)
- Единый контракт источника несёт вложения:
SourceContent.Data: IReadOnlyList<DataRef>— ссылки на объекты Storage-сервиса (DataRef.Id/Ref/Kind/MimeType/...). - Контракт входящего потока (
src/contracts/sources.proto,PushSource) передаётDataRefProto/ContactRefProto— источник может прислать вложения сразу со ссылками. - Storage-сервис (
src/storage-service/Deal.Storage,storage.proto) умеетUpload/Download/Stat/Delete, сам определяетkind/mimeType/размеры (контент-снифинг), бэкенд — MinIO. - Ядро хранит
SourceContentкарточки (в т.ч.Data) и отдаёт его вCardDto.contentи черезGET /api/cards/{id}/source(extension-pointISourceContentProvider+SourceContentResolver). - Фронт рендерит вложения:
SourceContentView.vue(image/video/audio/document/archive поkind), ссылки и контакты — списками.
2. Проблемная часть (требует живого Telegram)
Извлечение и выгрузка медиа из Telegram не проверяемы офлайн:
- Медиа-сообщения сейчас отбрасываются.
TlMessageMapper.ToMessage(src/telegram-service/Deal.Telegram/Telegram/TlMessageMapper.cs) принимает толькоMessageс непустымmessage(текстом). Посты с одним вложением и подписью (media+caption) не попадают в поток вообще. Нужно: определятьMessage.media, читатьcaption, тип/размеры/длительность. - Скачивание и выгрузка. Требуется
client.DownloadMedia(...)(WTelegram) → поток →StorageService.Upload(meta + data)→DataRefProto. В telegram-сервисе нет gRPC-клиента Storage и соответствующей конфигурации в compose (endpoint/токен). Проверить можно только с реальным Telegram-аккаунтом и живым MinIO. - Подпись без текста. Даже если вложение извлечено, в посте может не быть текста: нужен ли такой
пост «карточкой» (сейчас
PipelineIngestServiceпропускает записи безContent.Text)? Предлагается принимать запись, если есть текст или вложения/ссылки/контакты, а классификацию медиа-онли строить по подписи (caption) и метаданным. Требуется подтверждение продуктовой логики. - Просмотр исходника из другого контура. «Открыть исходник» для remote-источников (Telegram — это
лишь один из них) требует провайдера
ISourceContentProvider, который ходит по gRPC к сервису-владельцу источника (новый RPC, напримерReadSource(dialogId, msgId)), возвращая текст/медиа. Это тоже живой Telegram.
3. Предлагаемый план (после подтверждения)
TelegramMessageрасширить модельюTelegramAttachment(caption, fileName, mimeType, size, width, height, durationSec,Task<Stream> Open(cancellationToken)), заполнять вTlMessageMapperизMessage.media/Document/Photo.- В telegram-сервисе добавить
StorageClient(gRPC,Deal.Grpc.Storage) +SourceAttachmentUploader: загрузка каждого вложения →DataRefProto. DialogProtoMapper.ToSourceRequest(message, dataRefs)— прокинутьcontent.dataиcaption.PipelineIngestService: принимать запись при непустом тексте или непустыхData/Links/Contacts(нужно продуктовое решение по п.2.3).ISourceContentProviderдляkind="telegram"— gRPC-провайдер к telegram-сервису (RPCReadSource).- Настройки: endpoint/токен Storage в
deploy/compose.dev.yml/compose.prod.ymlдля telegram-сервиса.
4. Что нужно от владельца
- А) Делать ли медиа-сообщения без текста карточками (по подписи/метаданным), или пропускать?
- Б) Для проверки вложений нужны живые Telegram api_id/api_hash и работающий MinIO — будет ли прогон на вашей стороне, или реализуем «слепо» с юнит-тестами на фейковой сессии и фейковом Storage?
- В) Нужен ли remote-просмотр исходника (
ReadSource) в этом объёме, или достаточно того, что содержимое хранится в карточке?
Пока эти пункты не закрыты, они вынесены в backlog.md (TD-STORE-ATTACH, TD-SOURCE-PROVIDER),
а generic-часть (контракт, Storage-сервис, хранение, API, рендер) реализована.