Первый шаг к #1 («Integration layer for 2dph: canonical OnlyOffice SDK/client reuse»): высокоуровневый обход почтовой папки прямо в библиотеке — Client.FetchMailFolder — вместо того, чтобы каждый потребитель (2dph brain mail-ingest, cv-тулзы) reimplement'ил цикл list → get → download против приватных копий клиента.
API
typeMailSyncMessagestruct{IDint64FolderintSubjectstringFromstring// raw RFC 5322Datetime.TimeIsNewboolHasAttachmentsboolAttachments[]MailSyncAttachment// ID/Name/Size (+Body при FetchBodies)}msgs,err:=c.FetchMailFolder(ctx,onlyoffice.MailFolderInbox,onlyoffice.MailSyncOptions{Limit:100,FetchBodies:true})
Опции: Limit / StartIndex — окна для чекпойнт-обхода; FetchBodies — сразу скачать байты вложений через download.ashx (session-cookie путь уже покрыт cookie jar клиента).
Детали гидрации
элементы списка могут не содержать массив attachments: при hasAttachments подтягивается полный рекорд (GetMailMessage) и вложения мержатся;
id вложения принимается из вариантов id / fileId / attachmentId;
таймстампы: RFC3339 с любым числом долей секунды + форма без долей; неразбираемое → нулевое время (не ошибка).
Тесты
httptest-мок: пагинация и остановка на короткой странице, фолбэк к полному рекорду при hasAttachments без массива, скачивание тела с требованием auth-cookie, окна Limit/StartIndex, парсинг времён.
Как это связано с 2dph
Ветка feat/imap-mailsync-v1 в eSlider/2dph (PR #107) портирует IMAP-источник и фиксы write-пути brain; следующим шагом внутренний минималистичный OOClient (internal/mailsync/onlyoffice.go, raw HTTP) заменяется на этот канонический фасад. Отчёт расследования: eSlider/2dph#106.
## Что это
Первый шаг к #1 («Integration layer for 2dph: canonical OnlyOffice SDK/client reuse»): высокоуровневый обход почтовой папки прямо в библиотеке — `Client.FetchMailFolder` — вместо того, чтобы каждый потребитель (2dph brain mail-ingest, cv-тулзы) reimplement'ил цикл list → get → download против приватных копий клиента.
## API
```go
type MailSyncMessage struct {
ID int64
Folder int
Subject string
From string // raw RFC 5322
Date time.Time
IsNew bool
HasAttachments bool
Attachments []MailSyncAttachment // ID/Name/Size (+Body при FetchBodies)
}
msgs, err := c.FetchMailFolder(ctx, onlyoffice.MailFolderInbox,
onlyoffice.MailSyncOptions{Limit: 100, FetchBodies: true})
```
Опции: `Limit` / `StartIndex` — окна для чекпойнт-обхода; `FetchBodies` — сразу скачать байты вложений через download.ashx (session-cookie путь уже покрыт cookie jar клиента).
## Детали гидрации
- элементы списка могут не содержать массив attachments: при `hasAttachments` подтягивается полный рекорд (`GetMailMessage`) и вложения мержатся;
- id вложения принимается из вариантов `id` / `fileId` / `attachmentId`;
- таймстампы: RFC3339 с любым числом долей секунды + форма без долей; неразбираемое → нулевое время (не ошибка).
## Тесты
httptest-мок: пагинация и остановка на короткой странице, фолбэк к полному рекорду при hasAttachments без массива, скачивание тела с требованием auth-cookie, окна Limit/StartIndex, парсинг времён.
## Как это связано с 2dph
Ветка `feat/imap-mailsync-v1` в eSlider/2dph (PR #107) портирует IMAP-источник и фиксы write-пути brain; следующим шагом внутренний минималистичный OOClient (`internal/mailsync/onlyoffice.go`, raw HTTP) заменяется на этот канонический фасад. Отчёт расследования: eSlider/2dph#106.
Closes #1 частично (шаг 1: canonical walk в SDK).
Ревью-замечание (PO): ветка отстала от main на 49 коммитов (main ушёл вперёд после рефакторинга и фич). Пожалуйста, ребейзни ветку на актуальный main (git rebase main) и разреши конфликты, затем force-push. CI перезапустится. После этого PR готов к полному ревью и вливанию.
Контекст: feature уникальна (FetchMailFolder для 2dph ETL) и нужна, но требует чистой истории против текущего main.
Ревью-замечание (PO): ветка отстала от main на 49 коммитов (main ушёл вперёд после рефакторинга и фич). Пожалуйста, ребейзни ветку на актуальный main (git rebase main) и разреши конфликты, затем force-push. CI перезапустится. После этого PR готов к полному ревью и вливанию.
Контекст: feature уникальна (FetchMailFolder для 2dph ETL) и нужна, но требует чистой истории против текущего main.
Adds the high-level mail folder walk that sync pipelines need on top of
the raw mail API (list -> get -> download-attachment), so consumers stop
re-implementing it against private client copies.
type MailSyncMessage struct { ID, Folder, Subject, From, Date, IsNew,
HasAttachments, Attachments }
type MailSyncAttachment struct { ID, Name, Size, Body }
func (c *Client) FetchMailFolder(ctx, folderID, MailSyncOptions)
([]MailSyncMessage, error)
Options: Limit / StartIndex for checkpointed walks, FetchBodies to
eagerly download attachment bytes via download.ashx (session-cookie path).
Hydration details:
- list items may omit the attachment array; when hasAttachments is set
the full record is fetched and its attachments merged
- attachment ids accepted from id/fileId/attachmentId variants
- timestamps parsed from RFC3339 (any fractional digits) and
second-precision forms
This is the first step of the 2dph integration layer (#1): the brain's
mail-ingest pipeline can now drop its private OOClient copy and consume
this canonical walk directly.
Tests: httptest-backed coverage for pagination, hydration with
full-record fallback, body download incl. auth-cookie requirement,
Limit/StartIndex windows, timestamp parsing.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Что это
Первый шаг к #1 («Integration layer for 2dph: canonical OnlyOffice SDK/client reuse»): высокоуровневый обход почтовой папки прямо в библиотеке —
Client.FetchMailFolder— вместо того, чтобы каждый потребитель (2dph brain mail-ingest, cv-тулзы) reimplement'ил цикл list → get → download против приватных копий клиента.API
Опции:
Limit/StartIndex— окна для чекпойнт-обхода;FetchBodies— сразу скачать байты вложений через download.ashx (session-cookie путь уже покрыт cookie jar клиента).Детали гидрации
hasAttachmentsподтягивается полный рекорд (GetMailMessage) и вложения мержатся;id/fileId/attachmentId;Тесты
httptest-мок: пагинация и остановка на короткой странице, фолбэк к полному рекорду при hasAttachments без массива, скачивание тела с требованием auth-cookie, окна Limit/StartIndex, парсинг времён.
Как это связано с 2dph
Ветка
feat/imap-mailsync-v1в eSlider/2dph (PR #107) портирует IMAP-источник и фиксы write-пути brain; следующим шагом внутренний минималистичный OOClient (internal/mailsync/onlyoffice.go, raw HTTP) заменяется на этот канонический фасад. Отчёт расследования: eSlider/2dph#106.Closes #1 частично (шаг 1: canonical walk в SDK).
Ревью-замечание (PO): ветка отстала от main на 49 коммитов (main ушёл вперёд после рефакторинга и фич). Пожалуйста, ребейзни ветку на актуальный main (git rebase main) и разреши конфликты, затем force-push. CI перезапустится. После этого PR готов к полному ревью и вливанию.
Контекст: feature уникальна (FetchMailFolder для 2dph ETL) и нужна, но требует чистой истории против текущего main.
Adds the high-level mail folder walk that sync pipelines need on top of the raw mail API (list -> get -> download-attachment), so consumers stop re-implementing it against private client copies. type MailSyncMessage struct { ID, Folder, Subject, From, Date, IsNew, HasAttachments, Attachments } type MailSyncAttachment struct { ID, Name, Size, Body } func (c *Client) FetchMailFolder(ctx, folderID, MailSyncOptions) ([]MailSyncMessage, error) Options: Limit / StartIndex for checkpointed walks, FetchBodies to eagerly download attachment bytes via download.ashx (session-cookie path). Hydration details: - list items may omit the attachment array; when hasAttachments is set the full record is fetched and its attachments merged - attachment ids accepted from id/fileId/attachmentId variants - timestamps parsed from RFC3339 (any fractional digits) and second-precision forms This is the first step of the 2dph integration layer (#1): the brain's mail-ingest pipeline can now drop its private OOClient copy and consume this canonical walk directly. Tests: httptest-backed coverage for pagination, hydration with full-record fallback, body download incl. auth-cookie requirement, Limit/StartIndex windows, timestamp parsing.ae776aa396to35f0cb8d20