{"record":{"id":"a4e5e86da46948bb","repo":"Tencent/WeKnora","slug":"wiki-page-slug-is-required","errorCode":null,"errorMessage":"wiki page slug is required","messagePattern":"wiki page slug is required","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"internal/application/service/wiki_page.go","lineNumber":75,"sourceCode":"\ttaskPendingRepo interfaces.TaskPendingOpsRepository,\n\tredisClient *redis.Client,\n) interfaces.WikiPageService {\n\treturn &wikiPageService{\n\t\trepo:            repo,\n\t\tchunkRepo:       chunkRepo,\n\t\tkbService:       kbService,\n\t\ttaskPendingRepo: taskPendingRepo,\n\t\tredisClient:     redisClient,\n\t}\n}\n\n// CreatePage creates a new wiki page\nfunc (s *wikiPageService) CreatePage(ctx context.Context, page *types.WikiPage) (*types.WikiPage, error) {\n\tif page.ID == \"\" {\n\t\tpage.ID = uuid.New().String()\n\t}\n\tif page.Slug == \"\" {\n\t\treturn nil, errors.New(\"wiki page slug is required\")\n\t}\n\tif page.KnowledgeBaseID == \"\" {\n\t\treturn nil, errors.New(\"knowledge_base_id is required\")\n\t}\n\tif page.Status == \"\" {\n\t\tpage.Status = types.WikiPageStatusPublished\n\t}\n\tif page.Version == 0 {\n\t\tpage.Version = 1\n\t}\n\tpage.LastEditSource = types.WikiEditSourceFromContext(ctx)\n\tpage.LastEditorID, _ = types.UserIDFromContext(ctx)\n\tstripWikiPageInlineChunkCitations(page)\n\n\t// Parse outbound links from content\n\tpage.OutLinks = s.parseOutLinks(page.Content)\n\tif err := s.applyFolderToPage(ctx, page); err != nil {\n\t\treturn nil, err","sourceCodeStart":57,"sourceCodeEnd":93,"githubUrl":"https://github.com/Tencent/WeKnora/blob/988cbb03305e055d8ebb7d46d9ac6cc0803cd074/internal/application/service/wiki_page.go#L57-L93","documentation":"CreatePage validates that a new wiki page carries a non-empty Slug, the URL-identifying name of the page within its knowledge base. A page without a slug cannot be addressed or looked up by path, so the service refuses to persist it. Unlike ID, no default is generated for slug — callers must supply it.","triggerScenarios":"Calling CreatePage with page.Slug == \"\" — e.g. constructing a WikiPage from a request that omitted the slug field or where slug generation (from title) was skipped.","commonSituations":"Client sends a create-page payload without the slug field; backend assumes slug is auto-derived from title but that logic lives in the caller; import/bulk scripts forgetting to set slug.","solutions":["Set page.Slug before calling CreatePage — derive it from the title (slugify) if not provided.","Validate slug presence at the handler layer and return 400 with a clear message.","If slugs should be optional, add auto-generation logic in the service instead of failing."],"exampleFix":"// before\npage := &types.WikiPage{Title: req.Title, KnowledgeBaseID: kbID}\n// after\nslug, _ := slugify(req.Title)\npage := &types.WikiPage{Title: req.Title, Slug: slug, KnowledgeBaseID: kbID}","handlingStrategy":"validation","validationCode":"if strings.TrimSpace(page.Slug) == \"\" {\n    return httpError(400, \"slug is required\")\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Auto-derive slug from title in the handler when absent.","Mark slug as binding:\"required\" on create-page request structs.","Add a service-level test for pages created without a slug."],"tags":["validation","wiki","missing-field"],"backgroundTag":"missing-required-argument","analyzedSha":"988cbb03305e055d8ebb7d46d9ac6cc0803cd074","analyzedAt":"2026-09-02T14:41:08.344Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}