Accept repeated status params so the gateway cannot corrupt the filter

FixDocsService
Shipped
August 7, 2026 at 2:32 AM UTC
Author
Kamo
Commit
144dcbb

Opening **************** answered "Unknown status: **************** for every member. The member grid sent the bucket as one CSV value. A comma in a query value has to travel as %2C, and APIService — the shared gateway every /api/docs/** call crosses — concatenates the already-encoded URI and query into a plain String and hands that String to RestTemplate.exchange. RestTemplate treats a String URL as a URI TEMPLATE and percent-encodes it a second time, so %2C became %252C; Tomcat here decoded once and parseStatuses split on a comma that was no longer there, failing valueOf on the whole run-together token. The gateway is NOT changed. It carries /api/docs/**, /api/security/** and every other service, and switching it to URI.create/build(true) would change encoding semantics for every caller on the platform at once — some of which survive only because of that re-encode. That is its own deliberate change with its own review. So the reserved character comes off the wire instead: status now REPEATS, **************** Status names are [A-Z_] only, so the second encode is a no-op on them. - parseStatuses gains a List<String> overload that unions the EXISTING per-element rule. The enum parsing is not duplicated; there is still exactly one place a status name becomes a constant, so repeated params, a single CSV value, and Spring's own String->List comma split all land on the same set. - A CSV keeps working, so the HR grid's status=EXECUTED and any bookmarked member URL are untouched on the wire. - Applied to the HR mappings too (listAssignments, listMemberAssignments), not only the member one, so no legal endpoint can be filtered through a comma. - An unknown token is still a 400 that names it. Silently dropping it would page a filter the UI insists is applied — the worst outcome on a compliance grid. LegalMemberStatusBindingTest pins it at the real binding boundary via MockMvc: repeated params and a CSV resolve to the identical set, the HR single value is unchanged, an unknown token 400s, and the old double-encoded shape is rejected loudly rather than silently matching nothing. 401 tests, 0 failures.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing