{"record":{"id":"1a767a77ba32b6a0","repo":"Kareadita/Kavita","slug":"you-cannot-use-the-name-of-a-system-provided-strea","errorCode":null,"errorMessage":"You cannot use the name of a system provided stream","messagePattern":"You cannot use the name of a system provided stream","errorType":"exception","errorClass":"KavitaException","httpStatus":400,"severity":"warning","filePath":"Kavita.Server/Controllers/FilterController.cs","lineNumber":129,"sourceCode":"            var encodedString = SmartFilterHelper.Encode(dto);\n            await ValidateAndSaveFilterUpsert(dto.Name!, encodedString, dto.EntityType);\n            return Ok();\n        }\n        catch (KavitaException ex)\n        {\n            return BadRequest(ex.Message);\n        }\n    }\n\n    private async Task ValidateAndSaveFilterUpsert(string filterName, string encodedFilter,  FilterEntityType entityType)\n    {\n        var user = (await unitOfWork.UserRepository.GetUserByIdAsync(UserId, AppUserIncludes.SmartFilters))!;\n\n        if (string.IsNullOrWhiteSpace(filterName)) throw new KavitaException(\"Name must be set\");\n        if (Defaults.DefaultStreams.Any(s => s.Name.Equals(filterName, StringComparison.InvariantCultureIgnoreCase)))\n        {\n            // NOTE: This checks against localization keys (on-deck), so this case will almost never happen\n            throw new KavitaException(\"You cannot use the name of a system provided stream\");\n        }\n\n        var existingFilter = user.SmartFilters.FirstOrDefault(s => s.Name.Equals(filterName, StringComparison.InvariantCultureIgnoreCase));\n        if (existingFilter != null)\n        {\n            // Update the filter\n            existingFilter.Filter = encodedFilter;\n            unitOfWork.AppUserSmartFilterRepository.Update(existingFilter);\n        }\n        else\n        {\n            existingFilter = new AppUserSmartFilter()\n            {\n                Name = filterName,\n                Filter = encodedFilter,\n                EntityType = entityType\n            };\n            user.SmartFilters.Add(existingFilter);","sourceCodeStart":111,"sourceCodeEnd":147,"githubUrl":"https://github.com/Kareadita/Kavita/blob/9c3e5400007f8a0282f7d883f2ad5e71716e514d/Kavita.Server/Controllers/FilterController.cs#L111-L147","documentation":"Thrown by FilterController.ValidateAndSaveFilterUpsert when the requested name matches (case-insensitive) a system-provided stream name in Defaults.DefaultStreams. Caught and returned as HTTP 400 BadRequest. Note the source comment: DefaultStreams names are localization keys (e.g. 'on-deck'), so collisions are rare in practice.","triggerScenarios":"Naming a smart filter exactly the same as a built-in/default stream name like 'on-deck' (case-insensitive).","commonSituations":"User picks a name that coincides with a system stream key; localization key reuse. Almost never triggers because system stream names are localization keys rather than display names.","solutions":["Choose a filter name that does not collide with any Defaults.DefaultStreams name.","On the client, reserve/block the known system stream names in the name input.","If you added a new DefaultStream, expect its key to become a reserved filter name."],"exampleFix":"// before\nawait ValidateAndSaveFilterUpsert(\"on-deck\", encoded, entityType);\n\n// after\nawait ValidateAndSaveFilterUpsert(\"My On-Deck\", encoded, entityType);","handlingStrategy":"validation","validationCode":"var reserved = Defaults.DefaultStreams.Select(s => s.Name)\n    .ToHashSet(StringComparer.OrdinalIgnoreCase);\nif (reserved.Contains(name))\n    return BadRequest(\"Name reserved for a system stream\");","typeGuard":"static bool IsReservedStreamName(string name)\n    => Defaults.DefaultStreams.Any(s =>\n        s.Name.Equals(name, StringComparison.OrdinalIgnoreCase));","tryCatchPattern":"try { await ValidateAndSaveFilterUpsert(name, enc, type); }\ncatch (KavitaException ex) { return BadRequest(ex.Message); }","preventionTips":["Block known DefaultStreams names in the client name field.","Suffix reserved keys if a similar name is needed (e.g. 'on-deck-2').","Re-check reserved names after upgrading, as defaults can change."],"tags":["filtering","validation","input","smart-filter","naming"],"backgroundTag":null,"analyzedSha":"9c3e5400007f8a0282f7d883f2ad5e71716e514d","analyzedAt":"2026-08-13T19:06:05.897Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}