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 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
Ветка: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_*`; ничего не печатается.
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.
Проблема
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).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.Acceptance
oo dav ensure-path "Banks/Caixa"дважды → один и тот же id, без дублей;oo dav upload <id> ./f.xlsx→ файл виден вoo dav ls <id>;--replaceзаменяет;go test -race ./...,go vet ./...,gofmt— чисто;ONLYOFFICE_*; ничего не печатать.Оценка: S
Отчёт 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(defaulttrue) = upsert поstem|ext через
UploadToFolderReplacing;--replace=false= fail по конфликтучерез
AssertNoFileConflict(onlyoffice.ErrFileExists). Вывод — таблицаid|title|size|replaced.Новых HTTP-путей нет:
ensure-pathработает черезFileStore(List/CreateFolder),upload— через существующиеUploadToFolderReplacing/UploadToFolder. Поведениесуществующих
dav-команд не изменено.Использование
Тесты
cmd/oo/dav_test.go— ensure-path создаётвложенные папки, идемпотентен, переиспользует существующие, отвергает пустой путь и
..; upload--replace(вызванUploadToFolderReplacing, заменённые id), no-replaceконфликт + успех без конфликта; регистрация команд и флагов (
--replacedefault true,--under).//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_*; ничего не печатается.