feat(dav): oo dav upload (локальный файл) + ensure-path (mkdir -p) в Documents #80

Closed
opened 2026-09-25 15:04:06 +01:00 by eSlider · 1 comment
Owner

Проблема

oo dav умеет только copy по существующим OO file id; нельзя загрузить локальный
файл
(XLSX/PDF) в папку Documents, и нет mkdir -p по пути. Для публикации истории из
go-caixa в My Documents/Banks/Caixa/ этого не хватает.

Факты

  • Библиотека уже умеет: FileClient.Upload(parentID, title, io.Reader),
    Client.UploadToFolderReplacing(folderID, localPath) (filestore_*.go, files_stem.go).
  • CLI (cmd/oo/dav.go) команд upload / ensure-path не имеет.

Что сделать

  • oo dav ensure-path PATH [--under FOLDER_ID] — разрешить/создать вложенные папки
    (например Banks/Caixa), идемпотентно, вывести итоговый folder id.
    Корень по умолчанию — My Documents / @root.
  • oo dav upload DEST_FOLDER_ID LOCAL_FILE... [--replace] — загрузить локальные файлы
    (multipart) в папку; переиспользовать UploadToFolderReplacing/Upload;
    --replace (default) — перезапись по имени, иначе fail.
  • Никаких новых HTTP-путей — только обёртки над существующим клиентом.

Acceptance

  • oo dav ensure-path "Banks/Caixa" дважды → один и тот же id, без дублей;
  • oo dav upload <id> ./f.xlsx → файл виден в oo dav ls <id>; --replace заменяет;
  • unit-тесты CLI (fake store), go test -race ./..., go vet ./..., gofmt — чисто;
  • секреты только из env ONLYOFFICE_*; ничего не печатать.

Оценка: S

## Проблема `oo dav` умеет только `copy` по существующим OO file id; нельзя **загрузить локальный файл** (XLSX/PDF) в папку Documents, и нет `mkdir -p` по пути. Для публикации истории из go-caixa в `My Documents/Banks/Caixa/` этого не хватает. ## Факты - Библиотека уже умеет: `FileClient.Upload(parentID, title, io.Reader)`, `Client.UploadToFolderReplacing(folderID, localPath)` (`filestore_*.go`, `files_stem.go`). - CLI (`cmd/oo/dav.go`) команд `upload` / `ensure-path` не имеет. ## Что сделать - `oo dav ensure-path PATH [--under FOLDER_ID]` — разрешить/создать вложенные папки (например `Banks/Caixa`), **идемпотентно**, вывести итоговый folder id. Корень по умолчанию — My Documents / `@root`. - `oo dav upload DEST_FOLDER_ID LOCAL_FILE... [--replace]` — загрузить локальные файлы (multipart) в папку; переиспользовать `UploadToFolderReplacing`/`Upload`; `--replace` (default) — перезапись по имени, иначе fail. - Никаких новых HTTP-путей — только обёртки над существующим клиентом. ## Acceptance - [ ] `oo dav ensure-path "Banks/Caixa"` дважды → один и тот же id, без дублей; - [ ] `oo dav upload <id> ./f.xlsx` → файл виден в `oo dav ls <id>`; `--replace` заменяет; - [ ] unit-тесты CLI (fake store), `go test -race ./...`, `go vet ./...`, `gofmt` — чисто; - [ ] секреты только из env `ONLYOFFICE_*`; ничего не печатать. Оценка: S
Author
Owner

Отчёт SE

Ветка: feat/dav-upload#80 (от main, коммит 5535655)
PR: #81

Что добавлено

  • oo dav ensure-path PATH [--under FOLDER_ID] — resolve-or-create вложенных папок
    Documents (Banks/Caixa), идемпотентно: повторный вызов возвращает тот же id,
    дублей не создаёт. Печатает id, title, under.
    Корень по умолчанию — My documents: разрешается из @root по rootFolderType=5
    (fallback по заголовку); --under FOLDER_ID переопределяет.
  • oo dav upload DEST_FOLDER_ID LOCAL_FILE [LOCAL_FILE...] [--replace] — загрузка
    локальных файлов (multipart) в папку. --replace (default true) = upsert по
    stem|ext через UploadToFolderReplacing; --replace=false = fail по конфликту
    через AssertNoFileConflict (onlyoffice.ErrFileExists). Вывод — таблица
    id|title|size|replaced.

Новых HTTP-путей нет: ensure-path работает через FileStore (List/CreateFolder),
upload — через существующие UploadToFolderReplacing/UploadToFolder. Поведение
существующих dav-команд не изменено.

Использование

oo dav ensure-path "Banks/Caixa"               # → id (повторно тот же)
oo dav ensure-path "Banks/Caixa" --under 659   # под явной папкой
oo dav upload 659 ./f.xlsx                     # upsert
oo dav upload 659 ./f.xlsx --replace=false     # fail при конфликте

Тесты

  • Unit (fake store / fake client seam): cmd/oo/dav_test.go — ensure-path создаёт
    вложенные папки, идемпотентен, переиспользует существующие, отвергает пустой путь и
    ..; upload --replace (вызван UploadToFolderReplacing, заменённые id), no-replace
    конфликт + успех без конфликта; регистрация команд и флагов (--replace default true,
    --under).
  • Integration (gated, //go:build integration): cmd/oo/dav_integration_test.go —
    live ensure-path дважды (один id, без дублей), upload, replace, no-replace конфликт;
    создаёт и удаляет throwaway-папку oo-it-<ts>, без creds скипается.
  • Результат: go test -race ./... — зелёно; go vet ./... — чисто.
  • gofmt -l по изменённым файлам чисто. Замечу: в репо pre-existing неотформатированные
    файлы cmd/office/{model,ui}/*.go — они уже такие на main, я их не трогал (вне scope).

Live

Gated live-тест в этой среде не выполнялся: стабильного live-пути/креды в worktree нет
(bootstrap.NewClient без ONLYOFFICE_* → тест скипается). Команда для проверки на
инстансе: go test -tags=integration ./cmd/oo -run TestIntegrationDavEnsurePathUpload.

Секреты — только из env ONLYOFFICE_*; ничего не печатается.

## Отчёт SE **Ветка:** `feat/dav-upload#80` (от `main`, коммит `5535655`) **PR:** https://git.produktor.io/eSlider/go-onlyoffice/pulls/81 ### Что добавлено - `oo dav ensure-path PATH [--under FOLDER_ID]` — resolve-or-create вложенных папок Documents (`Banks/Caixa`), **идемпотентно**: повторный вызов возвращает тот же id, дублей не создаёт. Печатает `id`, `title`, `under`. Корень по умолчанию — **My documents**: разрешается из `@root` по `rootFolderType=5` (fallback по заголовку); `--under FOLDER_ID` переопределяет. - `oo dav upload DEST_FOLDER_ID LOCAL_FILE [LOCAL_FILE...] [--replace]` — загрузка локальных файлов (multipart) в папку. `--replace` (default `true`) = upsert по stem|ext через `UploadToFolderReplacing`; `--replace=false` = fail по конфликту через `AssertNoFileConflict` (`onlyoffice.ErrFileExists`). Вывод — таблица `id|title|size|replaced`. Новых HTTP-путей нет: `ensure-path` работает через `FileStore` (`List`/`CreateFolder`), `upload` — через существующие `UploadToFolderReplacing`/`UploadToFolder`. Поведение существующих `dav`-команд не изменено. ### Использование ```bash oo dav ensure-path "Banks/Caixa" # → id (повторно тот же) oo dav ensure-path "Banks/Caixa" --under 659 # под явной папкой oo dav upload 659 ./f.xlsx # upsert oo dav upload 659 ./f.xlsx --replace=false # fail при конфликте ``` ### Тесты - **Unit (fake store / fake client seam):** `cmd/oo/dav_test.go` — ensure-path создаёт вложенные папки, идемпотентен, переиспользует существующие, отвергает пустой путь и `..`; upload `--replace` (вызван `UploadToFolderReplacing`, заменённые id), no-replace конфликт + успех без конфликта; регистрация команд и флагов (`--replace` default true, `--under`). - **Integration (gated, `//go:build integration`):** `cmd/oo/dav_integration_test.go` — live ensure-path дважды (один id, без дублей), upload, replace, no-replace конфликт; создаёт и удаляет throwaway-папку `oo-it-<ts>`, без creds скипается. - Результат: `go test -race ./...` — зелёно; `go vet ./...` — чисто. - `gofmt -l` по изменённым файлам чисто. Замечу: в репо **pre-existing** неотформатированные файлы `cmd/office/{model,ui}/*.go` — они уже такие на `main`, я их не трогал (вне scope). ### Live Gated live-тест в этой среде **не выполнялся**: стабильного live-пути/креды в worktree нет (`bootstrap.NewClient` без `ONLYOFFICE_*` → тест скипается). Команда для проверки на инстансе: `go test -tags=integration ./cmd/oo -run TestIntegrationDavEnsurePathUpload`. Секреты — только из env `ONLYOFFICE_*`; ничего не печатается.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: eSlider/go-onlyoffice#80