refactor(files): единый файловый фасад + миграция CLI/TUI (#38) #43

Merged
eSlider merged 1 commits from feat/file-facade#38 into main 2026-09-16 18:27:21 +01:00
Owner

F4 эпика #34. Закрывает #38.

Что

  • file_facade.go: FileClient — единая точка входа. Держит stores map[string]FileStore и searchers map[string]Searcher; Read()/Write()/Search() выбирают бэкенд (PG → fast reads, REST/DAV → запись, ES → поиск) с fallback для чтений только на transient-ошибках. Client.Files() *FileClient, *FileClient реализует FileStore — старый код продолжает компилироваться.
  • Entry дополнен Updated (нативная строка бэкенда) и FilesCount/FoldersCount, чтобы oo dav ls --output json отдавал те же значения.
  • Миграция: cmd/oo/dav.go, cmd/oo/projects_files.go (download/rename/delete) — через FileStore; oo search — через фасад; cmd/office/fetch (preview/download/delete) — через интерфейс FileStore.
  • Депрекейт-пометки на transport-методы, которые теперь абстрагирует FileStore; публичный API не удалён.

Тесты

  • Unit file_facade_test.go: TestFileClientIsFileStore, TestClientFilesPrefersRESTForReadsAndWrites, TestFileClientPostgresTakesReadPriority, TestFileClientRegisterStoreNormalizesName, TestFileClientReadFallsBackOnlyOnTransient, TestFileClientReadStopsOnPermanentError, TestFileClientWriteUsesWriteBackend, TestFileClientWriteWithoutBackend, TestFileClientSearchSelection — PASS.
  • go build ./... && go vet ./... && go test -race ./... — зелёные.
  • Integration live: TestIntegrationFileStores (REST+DAV) PASS.
  • Smoke live: oo dav ls 647 / -o json, oo projects files list 4, projects files download, dav download, oo search Rechnung (фасад→ES, без OO-кред) — ОК.
  • gitleaks — no leaks.

Известный чужой долг (не трогал): go vet -tags=integration падает на cmd/office/fetch/task_integration_test.go:60 (loader.TaskFields undefined) — есть на main.

Не мержу и не закрываю.

F4 эпика #34. Закрывает #38. ## Что - `file_facade.go`: `FileClient` — единая точка входа. Держит `stores map[string]FileStore` и `searchers map[string]Searcher`; `Read()`/`Write()`/`Search()` выбирают бэкенд (PG → fast reads, REST/DAV → запись, ES → поиск) с fallback для чтений только на transient-ошибках. `Client.Files() *FileClient`, `*FileClient` реализует `FileStore` — старый код продолжает компилироваться. - `Entry` дополнен `Updated` (нативная строка бэкенда) и `FilesCount`/`FoldersCount`, чтобы `oo dav ls --output json` отдавал те же значения. - Миграция: `cmd/oo/dav.go`, `cmd/oo/projects_files.go` (download/rename/delete) — через `FileStore`; `oo search` — через фасад; `cmd/office/fetch` (preview/download/delete) — через интерфейс `FileStore`. - Депрекейт-пометки на transport-методы, которые теперь абстрагирует `FileStore`; публичный API не удалён. ## Тесты - Unit `file_facade_test.go`: `TestFileClientIsFileStore`, `TestClientFilesPrefersRESTForReadsAndWrites`, `TestFileClientPostgresTakesReadPriority`, `TestFileClientRegisterStoreNormalizesName`, `TestFileClientReadFallsBackOnlyOnTransient`, `TestFileClientReadStopsOnPermanentError`, `TestFileClientWriteUsesWriteBackend`, `TestFileClientWriteWithoutBackend`, `TestFileClientSearchSelection` — PASS. - `go build ./... && go vet ./... && go test -race ./...` — зелёные. - Integration live: `TestIntegrationFileStores` (REST+DAV) PASS. - Smoke live: `oo dav ls 647` / `-o json`, `oo projects files list 4`, `projects files download`, `dav download`, `oo search Rechnung` (фасад→ES, без OO-кред) — ОК. - gitleaks — no leaks. Известный чужой долг (не трогал): `go vet -tags=integration` падает на `cmd/office/fetch/task_integration_test.go:60` (`loader.TaskFields undefined`) — есть на `main`. Не мержу и не закрываю.
eSlider added 1 commit 2026-09-16 18:20:51 +01:00
refactor(files): single file client facade + CLI/TUI migration (#38)
Release Please / Release Please (push) Skipped
Release / GoReleaser (push) Skipped
Tests / Secret scan (gitleaks) (push) Skipped
Tests / Test (Go 1.25) (push) Skipped
Tests / Test (Go stable) (push) Skipped
Tests / Secret scan (gitleaks) (pull_request) Successful in 4s
Tests / Test (Go stable) (pull_request) Successful in 19s
Tests / Test (Go 1.25) (pull_request) Successful in 22s
ba29738482
- FileClient composes FileStore/Searcher backends; Read()/Write()/Search()
  select REST/DAV/PG/ES with transient read fallback. Client.Files() returns
  it and *FileClient implements FileStore, so existing callers keep working.
- Entry gains backend-native Updated + folder FilesCount/FoldersCount so
  dav ls output round-trips.
- cmd/oo dav/projects files and cmd/office/fetch download/preview/delete go
  through FileStore; oo search goes through the facade.
- Mark transport methods that FileStore now abstracts as deprecated.
eSlider merged commit 95d79925ea into main 2026-09-16 18:27:21 +01:00
eSlider deleted branch feat/file-facade#38 2026-09-16 18:27:21 +01:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: eSlider/go-onlyoffice#43