{"record":{"id":"ac77ecfc923b0a83","repo":"crowdsecurity/crowdsec","slug":"get-expired-decisions-with-filters-w","errorCode":null,"errorMessage":"get expired decisions with filters: %w","messagePattern":"get expired decisions with filters: %w","errorType":"exception","errorClass":"QueryFail","httpStatus":null,"severity":"error","filePath":"pkg/database/decisions.go","lineNumber":89,"sourceCode":"\n\treturn latest.ID, nil\n}\n\nfunc (c *Client) QueryExpiredDecisionsWithFilters(ctx context.Context, now time.Time, filter map[string][]string) ([]*ent.Decision, error) {\n\tquery := c.Ent.Decision.Query().\n\t\tSelect(decision.FieldID, decision.FieldUntil, decision.FieldScenario, decision.FieldScope, decision.FieldValue, decision.FieldType, decision.FieldOrigin, decision.FieldUUID).\n\t\tWhere(\n\t\t\tdecision.UntilLT(now),\n\t\t)\n\t// Allow a bouncer to ask for non-deduplicated results\n\tif v, ok := filter[\"dedup\"]; !ok || v[0] != \"false\" {\n\t\tquery = query.Where(longestDecisionForScopeTypeValue)\n\t}\n\n\tquery, err := applyDecisionFilter(query, filter)\n\tif err != nil {\n\t\tc.Log.Warningf(\"QueryExpiredDecisionsWithFilters : %s\", err)\n\t\treturn []*ent.Decision{}, fmt.Errorf(\"get expired decisions with filters: %w\", QueryFail)\n\t}\n\n\tquery = query.Order(ent.Asc(decision.FieldID))\n\n\tdata, err := query.All(ctx)\n\tif err != nil {\n\t\tc.Log.Warningf(\"QueryExpiredDecisionsWithFilters : %s\", err)\n\t\treturn []*ent.Decision{}, fmt.Errorf(\"expired decisions: %w\", QueryFail)\n\t}\n\n\treturn data, nil\n}\n\nfunc (c *Client) QueryDecisionCountByScenario(ctx context.Context) ([]*DecisionsByScenario, error) {\n\tquery := c.Ent.Decision.Query().Where(\n\t\tdecision.UntilGT(time.Now().UTC()),\n\t)\n","sourceCodeStart":71,"sourceCodeEnd":107,"githubUrl":"https://github.com/crowdsecurity/crowdsec/blob/909b5157986a2b2c2163300fdaef5ed01289f7d2/pkg/database/decisions.go#L71-L107","documentation":"Returned by QueryExpiredDecisionsWithFilters when applyDecisionFilter cannot build predicates from the filter map. Wraps QueryFail (\"unable to query\"); the actual parse error is logged as 'QueryExpiredDecisionsWithFilters : <err>'.","triggerScenarios":"Caller passes malformed filter entries (bad 'since' duration value, invalid scope/type/value combination, unparsable IP in contains-ip) while querying decisions that expired at time `now`.","commonSituations":"cscli or a bouncer passes an invalid duration like 'since=1x' or a scope value with wrong case/format; custom bouncer builds filters with keys this LAPI version doesn't recognize.","solutions":["Read the 'QueryExpiredDecisionsWithFilters :' warning in the logs for the concrete parse error","Fix the offending filter key/value (valid keys: scope, value, type, origin, scenario, ip/since, etc.)","If a bouncer produces it, check bouncer version compatibility with your CrowdSec LAPI version","Test the same filter with `cscli decisions list --origin ... --scope ...` to isolate it"],"exampleFix":"// before\ncscli bouncers list  # bouncer sends since=abc\n// after — pass a valid duration\ncscli decisions delete --expired-since 1h","handlingStrategy":"validation","validationCode":"if d, err := time.ParseDuration(sinceVal); err != nil || d <= 0 {\n    return fmt.Errorf(\"invalid 'since' filter %q\", sinceVal)\n}\nif scope == \"ip\" {\n    if net.ParseIP(value) == nil {\n        if _, _, err := net.ParseCIDR(value); err != nil {\n            return fmt.Errorf(\"invalid ip/cidr filter value %q\", value)\n        }\n    }\n}","typeGuard":null,"tryCatchPattern":"res, err := client.QueryExpiredDecisionsWithFilters(ctx, now, filter)\nif err != nil && strings.Contains(err.Error(), \"unable to query\") {\n    log.Warnf(\"filter rejected: %v — check 'QueryExpiredDecisionsWithFilters' in LAPI logs\", err)\n    return fallbackUnfiltered(ctx)\n}","preventionTips":["Validate duration and IP/CIDR inputs before issuing the query","Use cscli as a reference for accepted filter keys/values","Pin bouncer versions compatible with your LAPI"],"tags":["database","crowdsec","filter-parsing","lapi"],"backgroundTag":"database-query-failed","analyzedSha":"909b5157986a2b2c2163300fdaef5ed01289f7d2","analyzedAt":"2026-09-06T12:27:26.012Z","contentChangedAt":"2026-09-06T12:27:26.012Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}