diff --git a/ordinis-rest-api/src/main/java/cloud/nstart/terravault/ordinis/restapi/web/SchemaDraftController.java b/ordinis-rest-api/src/main/java/cloud/nstart/terravault/ordinis/restapi/web/SchemaDraftController.java index ea583d1..4b6793b 100644 --- a/ordinis-rest-api/src/main/java/cloud/nstart/terravault/ordinis/restapi/web/SchemaDraftController.java +++ b/ordinis-rest-api/src/main/java/cloud/nstart/terravault/ordinis/restapi/web/SchemaDraftController.java @@ -169,15 +169,24 @@ public class SchemaDraftController { /** * Convenience endpoint: фронт хочет ОДИН query'ом узнать "есть ли active * draft на этом dict'е и в каком он state'е". Returns 200 с draft body - * либо 404 если нет active. + * либо 200 с {@code null} если активного draft нет. + * + *

Why 200 + null instead of 404: "no active draft" — это normal + * state, не error condition. Раньше возвращали 404 {@code no_active_draft}, + * frontend silently mapped to null, но browser console всё равно logs 4xx + * network failures на каждый poll (refetchInterval=20s + invalidate after + * mutations). Spam'ило console. 200 + null body = clean console + same + * frontend behavior. + * + *

Frontend (queries.ts dictActiveSchemaDraftQuery) сохраняет 404→null + * fallback для backward compat и robustness — если кто-то откатит этот + * change или старый client с новым backend ещё не deployed. */ @GetMapping("/api/v1/dictionaries/{name}/drafts/active") public SchemaDraftResponse active(@PathVariable String name) { - DictionarySchemaDraft draft = draftService.findActive(name).orElseThrow(() -> - cloud.nstart.terravault.ordinis.restapi.error.OrdinisException.notFound( - "no_active_draft", - "У справочника " + name + " нет активного draft'а.")); - return SchemaDraftResponse.from(draft, name); + return draftService.findActive(name) + .map(d -> SchemaDraftResponse.from(d, name)) + .orElse(null); } /** Single draft по id (drilling в reviewer queue). */