{"record":{"id":"4e6ffc66e1057178","repo":"Tencent/WeKnora","slug":"resolve-page-folder-w","errorCode":null,"errorMessage":"resolve page folder: %w","messagePattern":"resolve page folder: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/application/service/wiki_page.go","lineNumber":1395,"sourceCode":"\n// applyFolderToPage refreshes a page's derived category_path cache from its\n// authoritative FolderID. Root (\"\") clears the path. A folder id that does not\n// resolve is treated as a hard error so we never silently misplace a page.\nfunc (s *wikiPageService) applyFolderToPage(ctx context.Context, page *types.WikiPage) error {\n\tif page == nil {\n\t\treturn nil\n\t}\n\tif strings.TrimSpace(page.FolderID) == \"\" {\n\t\tpage.FolderID = \"\"\n\t\tpage.CategoryPath = nil\n\t\treturn nil\n\t}\n\tfolder, err := s.repo.GetFolderByID(ctx, page.KnowledgeBaseID, page.FolderID)\n\tif err != nil {\n\t\tif errors.Is(err, repository.ErrWikiFolderNotFound) {\n\t\t\treturn fmt.Errorf(\"wiki page references unknown folder %q\", page.FolderID)\n\t\t}\n\t\treturn fmt.Errorf(\"resolve page folder: %w\", err)\n\t}\n\tpage.CategoryPath = types.StringArray(wikiFolderSegments(folder.Path))\n\treturn nil\n}\n\n// GetFolder retrieves a single folder by id.\nfunc (s *wikiPageService) GetFolder(ctx context.Context, kbID string, id string) (*types.WikiFolder, error) {\n\treturn s.repo.GetFolderByID(ctx, kbID, id)\n}\n\n// ListChildFolders returns the direct children of parentID for a tree view\n// scoped to pageTypes. PageCount is recursive (the folder's whole subtree) so\n// a parent reflects everything filed beneath it. A folder is shown when its\n// subtree holds a page matching pageTypes. Wholly-empty folders (no pages of\n// any type underneath) are only listed when multiple types are requested —\n// the merged knowledge view — so single-type tabs like summary do not surface\n// empty containers.\nfunc (s *wikiPageService) ListChildFolders(","sourceCodeStart":1377,"sourceCodeEnd":1413,"githubUrl":"https://github.com/Tencent/WeKnora/blob/988cbb03305e055d8ebb7d46d9ac6cc0803cd074/internal/application/service/wiki_page.go#L1377-L1413","documentation":"applyFolderToPage wraps any GetFolderByID error that is NOT ErrWikiFolderNotFound as 'resolve page folder: %w'. Unlike error 646 (a known-missing folder), this signals an unexpected failure while resolving the folder: DB outage, query error, or canceled context.","triggerScenarios":"CreatePage/UpdatePage/MovePage with a FolderID set while the repository lookup fails unexpectedly — connection loss, SQL error, context deadline exceeded during the folder fetch.","commonSituations":"Database connectivity loss during page saves; migration/schema issues breaking the folder query; request timeouts canceling the context mid-lookup; permission failures at the storage layer.","solutions":["Read the wrapped cause (%w) in logs to distinguish connectivity, schema, and timeout failures.","Retry the operation after transient DB/network failures.","Verify folder table schema and migrations are current.","Increase context timeout if large/loaded DBs slow the folder lookup."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"_, err := svc.UpdatePage(ctx, page)\nif err != nil && strings.Contains(err.Error(), \"resolve page folder:\") && !errors.Is(err, repository.ErrWikiFolderNotFound) {\n    if isTransient(err) || errors.Is(err, context.DeadlineExceeded) {\n        time.Sleep(backoff)\n        _, err = svc.UpdatePage(ctx, page)\n    }\n}","preventionTips":["Monitor DB connectivity; alert on repeated wrapped storage errors","Keep folder-table schema and migrations current","Set adequate context timeouts for save operations that resolve folders","Distinguish this from the unknown-folder case via errors.Is before choosing a recovery path"],"tags":["database","wrapped-error","folder"],"backgroundTag":"database-query-failed","analyzedSha":"988cbb03305e055d8ebb7d46d9ac6cc0803cd074","analyzedAt":"2026-09-02T14:41:08.344Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}