{"record":{"id":"ad2b57c3d36d6292","repo":"Tencent/WeKnora","slug":"create-wiki-page-issue-w","errorCode":null,"errorMessage":"create wiki page issue: %w","messagePattern":"create wiki page issue: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/application/service/wiki_page.go","lineNumber":1352,"sourceCode":"\n// removeString removes a string from a slice\nfunc removeString(slice []string, s string) types.StringArray {\n\tresult := make(types.StringArray, 0, len(slice))\n\tfor _, v := range slice {\n\t\tif v != s {\n\t\t\tresult = append(result, v)\n\t\t}\n\t}\n\treturn result\n}\n\n// CreateIssue logs a new issue for a wiki page\nfunc (s *wikiPageService) CreateIssue(ctx context.Context, issue *types.WikiPageIssue) (*types.WikiPageIssue, error) {\n\tif issue.ID == \"\" {\n\t\tissue.ID = uuid.New().String()\n\t}\n\tif err := s.repo.CreateIssue(ctx, issue); err != nil {\n\t\treturn nil, fmt.Errorf(\"create wiki page issue: %w\", err)\n\t}\n\treturn issue, nil\n}\n\n// ListIssues retrieves issues for a knowledge base\nfunc (s *wikiPageService) ListIssues(ctx context.Context, kbID string, slug string, status string) ([]*types.WikiPageIssue, error) {\n\treturn s.repo.ListIssues(ctx, kbID, slug, status)\n}\n\n// UpdateIssueStatus updates an issue's status\nfunc (s *wikiPageService) UpdateIssueStatus(ctx context.Context, issueID string, status string) error {\n\treturn s.repo.UpdateIssueStatus(ctx, issueID, status)\n}\n\n// --- Folder tree (wiki_folders) ---\n\n// wikiFolderSegments splits a materialized folder path (\"AI/RAG\") into cleaned\n// segments. Empty/blank path yields nil (the wiki root).","sourceCodeStart":1334,"sourceCodeEnd":1370,"githubUrl":"https://github.com/Tencent/WeKnora/blob/988cbb03305e055d8ebb7d46d9ac6cc0803cd074/internal/application/service/wiki_page.go#L1334-L1370","documentation":"CreateIssue persists a wiki page issue via repo.CreateIssue; any repository failure is wrapped as 'create wiki page issue: %w'. The service generates an ID if missing, so failures here come from the storage layer, not ID generation.","triggerScenarios":"Calling CreateIssue with a WikiPageIssue whose repository insert fails — DB unavailable, foreign-key violation (issue references a nonexistent page/KB), context canceled, or constraint violation.","commonSituations":"Submitting issues against pages that were deleted (FK violation); DB connectivity blips; batch automation posting issues faster than the pool allows; schema drift after migrations.","solutions":["Inspect the wrapped underlying error in logs to identify the storage failure cause.","Verify the issue's page/KB references exist to rule out foreign-key violations.","Retry on transient DB errors with backoff.","Validate issue payload (required fields, valid status) before calling."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"if issue.PageID == \"\" || issue.KnowledgeBaseID == \"\" {\n    return errors.New(\"issue requires page and knowledge base IDs\")\n}\nif _, err := pageSvc.GetPage(ctx, issue.KnowledgeBaseID, issue.Slug); err != nil {\n    return fmt.Errorf(\"target page missing: %w\", err)\n}","typeGuard":null,"tryCatchPattern":"created, err := svc.CreateIssue(ctx, issue)\nif err != nil && strings.Contains(err.Error(), \"create wiki page issue:\") {\n    if isTransient(err) {\n        created, err = svc.CreateIssue(ctx, issue) // retry after backoff\n    }\n    if err != nil { return fmt.Errorf(\"issue not saved: %w\", err) }\n}","preventionTips":["Verify the target page exists before filing issues to avoid FK violations","Populate required fields (ID is auto-generated if empty) and a valid status","Apply backoff retries for transient DB errors in automation that files issues","Keep issue-table migrations current"],"tags":["database","persistence","wrapped-error"],"backgroundTag":"database-insert-failed","analyzedSha":"988cbb03305e055d8ebb7d46d9ac6cc0803cd074","analyzedAt":"2026-09-02T14:41:08.344Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}