From c41c561ee616a47dbfce524833fb490f0bd3c7ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=97=D0=B8=D0=BC=D0=B8=D0=BD?= Date: Fri, 15 May 2026 16:02:11 +0000 Subject: [PATCH] =?UTF-8?q?fix(notifications):=20tryClaim=20drop=20@Modify?= =?UTF-8?q?ing=20=E2=80=94=20unblocks=20ALL=20dispatch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notification/NotificationLogRepository.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ordinis-domain/src/main/java/cloud/nstart/terravault/ordinis/domain/notification/NotificationLogRepository.java b/ordinis-domain/src/main/java/cloud/nstart/terravault/ordinis/domain/notification/NotificationLogRepository.java index 06e713a..834d80f 100644 --- a/ordinis-domain/src/main/java/cloud/nstart/terravault/ordinis/domain/notification/NotificationLogRepository.java +++ b/ordinis-domain/src/main/java/cloud/nstart/terravault/ordinis/domain/notification/NotificationLogRepository.java @@ -21,8 +21,17 @@ public interface NotificationLogRepository extends JpaRepositoryИспользуется в {@code IdempotencyGuard.shouldSend()}. + * + *

Без {@code @Modifying} — native INSERT с RETURNING clause работает + * как SELECT-shaped query (returns 0..1 rows). {@code @Modifying} ограничивает + * return type до {@code void/int/Integer}, что несовместимо с {@code Optional} + * → Spring Data JPA throws InvalidDataAccessApiUsageException на каждом + * dispatcher tick. Bug history: {@code @Modifying} добавили cargo-cult'ом + * (INSERT ⇒ mutating), but native + RETURNING — read-shaped в JPA model. + * Эта misconfiguration блокировала весь dispatch pipeline — пока race + * не был fix'нут в MR !214, ошибка вообще не surface'илась (events не + * doходили до tryClaim). */ - @Modifying @Query(value = """ INSERT INTO notification_log (event_id, event_type, draft_id, channel, recipient, status, sent_at) VALUES (:eventId, :eventType, :draftId, :channel, :recipient, 'PENDING', NOW())