{"record":{"id":"37be229ac4ee1894","repo":"gofr-dev/gofr","slug":"endpoint-d-w-s-examples-api-resource-fo","errorCode":null,"errorMessage":"endpoint[%d]: %w: %s. Examples: /api/{resource} for single-level or /api/{path:.*} for multi-level","messagePattern":"endpoint\\[(.+?)\\]: %w: (.+?)\\. Examples: /api/(.+?) for single-level or /api/(.+?) for multi-level","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/gofr/rbac/config.go","lineNumber":232,"sourceCode":"\t// Reject regex indicators outside of variable constraints\n\tif err := c.checkRegexIndicators(path, index); err != nil {\n\t\treturn err\n\t}\n\n\t// Validate mux pattern syntax if it contains variables\n\tif isMuxPattern(path) {\n\t\tif err := validateMuxPattern(path); err != nil {\n\t\t\treturn fmt.Errorf(\"endpoint[%d]: invalid mux pattern: %w\", index, err)\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// checkWildcardPattern checks if path contains wildcard pattern.\nfunc (*Config) checkWildcardPattern(path string, index int) error {\n\tif strings.Contains(path, \"/*\") {\n\t\treturn fmt.Errorf(\"endpoint[%d]: %w: %s. Examples: /api/{resource} for single-level or /api/{path:.*} for multi-level\",\n\t\t\tindex, errWildcardPatternNotSupported, path)\n\t}\n\n\treturn nil\n}\n\n// checkRegexPattern checks if path contains old regex pattern.\nfunc (*Config) checkRegexPattern(path string, index int) error {\n\tif strings.HasPrefix(path, \"^\") || strings.HasSuffix(path, \"$\") {\n\t\treturn fmt.Errorf(\"endpoint[%d]: %w: %s. Example: /api/users/{id:[0-9]+} instead of ^/api/users/\\\\d+$\",\n\t\t\tindex, errRegexPatternNotSupported, path)\n\t}\n\n\treturn nil\n}\n\n// checkRegexIndicators checks if path contains regex indicators outside variable constraints.\nfunc (*Config) checkRegexIndicators(path string, index int) error {","sourceCodeStart":214,"sourceCodeEnd":250,"githubUrl":"https://github.com/gofr-dev/gofr/blob/187eb24962502e91f1fee856230670958b66e89c/pkg/gofr/rbac/config.go#L214-L250","documentation":"checkWildcardPattern rejected a path containing \"/*\". The RBAC config no longer supports wildcard suffixes; use mux variable patterns instead: {resource} for a single segment or {path:.*} for multiple segments.","triggerScenarios":"An endpoint path like /api/users/* or /admin/* passed to EnableRBAC/LoadPermissions via validate -> validateEndpointPath -> checkWildcardPattern.","commonSituations":"Migrating from an older router/config format that used trailing /* globs; copying wildcard routes from Express-style frameworks; broadening an existing route to cover sub-paths.","solutions":["Replace /api/* with /api/{path:.*} for multi-level matching.","Use /api/{resource} when only a single segment is needed.","Enumerate explicit paths if you prefer no variable patterns.","Search your config for \"/*\" occurrences and convert each one."],"exampleFix":"// before\npath: \"/api/users/*\"\n// after\npath: \"/api/users/{path:.*}\"","handlingStrategy":"validation","validationCode":"for i, ep := range endpoints {\n    if strings.Contains(ep.Path, \"/*\") {\n        return fmt.Errorf(\"endpoint[%d] %s: replace '/*' with mux variable {path:.*} (single level: {resource})\", i, ep.Path)\n    }\n}","typeGuard":null,"tryCatchPattern":"if err := prevalidateWildcard(endpoints); err != nil { return err }\nif _, err := rbac.LoadPermissions(path, logger, metrics, tracer); err != nil {\n    if strings.Contains(err.Error(), \"Examples: /api/{resource}\") {\n        return fmt.Errorf(\"rewrite wildcard paths: %w\", err)\n    }\n    return err\n}","preventionTips":["Search configs for \"/*\" in CI and fail the build when found.","Document the mux replacement ({path:.*}) for team migrations.","When copying routes from other frameworks, always translate wildcard globs."],"tags":["go","rbac","routing","wildcard","validation"],"backgroundTag":"invalid-route-pattern","analyzedSha":"187eb24962502e91f1fee856230670958b66e89c","analyzedAt":"2026-09-01T20:34:54.554Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}