package main import ( "fmt" "os" "strconv" "time" onlyoffice "github.com/eslider/go-onlyoffice" "github.com/spf13/cobra" ) func init() { projectsCmd.AddCommand(projectFilesCmd()) } func projectFilesCmd() *cobra.Command { cmd := &cobra.Command{ Use: "files", Short: "Project Documents folder: list, upload, download, rename, delete", } cmd.AddCommand(prjFilesListCmd()) cmd.AddCommand(prjFilesUploadCmd()) cmd.AddCommand(prjFilesDownloadCmd()) cmd.AddCommand(prjFilesRenameCmd()) cmd.AddCommand(prjFilesDeleteCmd()) // Convenience aliases into oo docs (md↔docx / OCR pipeline). cmd.AddCommand(aliasDocsAsMD()) cmd.AddCommand(aliasDocsPutMD()) return cmd } func aliasDocsAsMD() *cobra.Command { c := docsAsMDCmd() c.Use = "as-md FILE_ID" c.Short = "Alias of `oo docs as-md` — download OO file as Markdown (OCR if needed)" return c } func aliasDocsPutMD() *cobra.Command { c := docsPutMDCmd() c.Use = "put-md PROJECT_ID MARKDOWN_PATH" c.Short = "Alias of `oo docs put-md` — Markdown→DOCX upload into project" return c } func prjFilesListCmd() *cobra.Command { var showFolders bool cmd := &cobra.Command{ Use: "list PROJECT_ID", Short: "List files (and optionally folders) attached to the project", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { c, err := newOO(cmd) if err != nil { return err } pf, err := c.GetProjectFiles(cmd.Context(), args[0]) if err != nil { return err } if showFolders && len(pf.Folders) > 0 { frows := make([]map[string]any, 0, len(pf.Folders)) for _, f := range pf.Folders { if f == nil { continue } frows = append(frows, map[string]any{ "id": folderIDStr(f), "title": derefString(f.Title), "filesCount": derefInt(f.FilesCount), "foldersCount": derefInt(f.FoldersCount), }) } if outputFormat == "table" { fmt.Println("folders:") } printTable([]string{"id", "title", "filesCount", "foldersCount"}, frows) } rows := fileEntryRows(pf.Files) if outputFormat == "table" { fmt.Println("files:") } printTable([]string{"id", "title", "fileExst", "contentLength", "updated"}, rows) return nil }, } cmd.Flags().BoolVar(&showFolders, "folders", false, "also print project subfolders") return cmd } func prjFilesUploadCmd() *cobra.Command { return &cobra.Command{ Use: "upload PROJECT_ID LOCAL_PATH [LOCAL_PATH...]", Short: "Upload file(s) into the project's Documents folder", Args: cobra.MinimumNArgs(2), RunE: func(cmd *cobra.Command, args []string) error { c, err := newOO(cmd) if err != nil { return err } pid := args[0] for _, p := range args[1:] { entry, err := c.UploadProjectFile(cmd.Context(), pid, p) if err != nil { return err } printObject(fileEntryToMap(entry)) } return nil }, } } func prjFilesDownloadCmd() *cobra.Command { var to string cmd := &cobra.Command{ Use: "download FILE_ID", Short: "Download file bytes via viewUrl (default path: ./