From 1ff256dce05793017b15d3ea77a6c5d55828abd5 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Sun, 19 Apr 2026 18:43:36 +0200 Subject: [PATCH] feat(alerting): core repository interfaces --- .../alerting/AlertInstanceRepository.java | 22 ++++++++++++++++++ .../alerting/AlertNotificationRepository.java | 17 ++++++++++++++ .../core/alerting/AlertReadRepository.java | 9 ++++++++ .../core/alerting/AlertRuleRepository.java | 23 +++++++++++++++++++ .../core/alerting/AlertSilenceRepository.java | 14 +++++++++++ 5 files changed, 85 insertions(+) create mode 100644 cameleer-server-core/src/main/java/com/cameleer/server/core/alerting/AlertInstanceRepository.java create mode 100644 cameleer-server-core/src/main/java/com/cameleer/server/core/alerting/AlertNotificationRepository.java create mode 100644 cameleer-server-core/src/main/java/com/cameleer/server/core/alerting/AlertReadRepository.java create mode 100644 cameleer-server-core/src/main/java/com/cameleer/server/core/alerting/AlertRuleRepository.java create mode 100644 cameleer-server-core/src/main/java/com/cameleer/server/core/alerting/AlertSilenceRepository.java diff --git a/cameleer-server-core/src/main/java/com/cameleer/server/core/alerting/AlertInstanceRepository.java b/cameleer-server-core/src/main/java/com/cameleer/server/core/alerting/AlertInstanceRepository.java new file mode 100644 index 00000000..3100b945 --- /dev/null +++ b/cameleer-server-core/src/main/java/com/cameleer/server/core/alerting/AlertInstanceRepository.java @@ -0,0 +1,22 @@ +package com.cameleer.server.core.alerting; + +import java.time.Instant; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface AlertInstanceRepository { + AlertInstance save(AlertInstance instance); // upsert by id + Optional findById(UUID id); + Optional findOpenForRule(UUID ruleId); // state IN ('PENDING','FIRING','ACKNOWLEDGED') + List listForInbox(UUID environmentId, + List userGroupIdFilter, + String userId, + List userRoleNames, + int limit); + long countUnreadForUser(UUID environmentId, String userId); + void ack(UUID id, String userId, Instant when); + void resolve(UUID id, Instant when); + void markSilenced(UUID id, boolean silenced); + void deleteResolvedBefore(Instant cutoff); +} diff --git a/cameleer-server-core/src/main/java/com/cameleer/server/core/alerting/AlertNotificationRepository.java b/cameleer-server-core/src/main/java/com/cameleer/server/core/alerting/AlertNotificationRepository.java new file mode 100644 index 00000000..b49d84f9 --- /dev/null +++ b/cameleer-server-core/src/main/java/com/cameleer/server/core/alerting/AlertNotificationRepository.java @@ -0,0 +1,17 @@ +package com.cameleer.server.core.alerting; + +import java.time.Instant; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface AlertNotificationRepository { + AlertNotification save(AlertNotification n); + Optional findById(UUID id); + List listForInstance(UUID alertInstanceId); + List claimDueNotifications(String instanceId, int batchSize, int claimTtlSeconds); + void markDelivered(UUID id, int status, String snippet, Instant when); + void scheduleRetry(UUID id, Instant nextAttemptAt, int status, String snippet); + void markFailed(UUID id, int status, String snippet); + void deleteSettledBefore(Instant cutoff); +} diff --git a/cameleer-server-core/src/main/java/com/cameleer/server/core/alerting/AlertReadRepository.java b/cameleer-server-core/src/main/java/com/cameleer/server/core/alerting/AlertReadRepository.java new file mode 100644 index 00000000..a3cd08e4 --- /dev/null +++ b/cameleer-server-core/src/main/java/com/cameleer/server/core/alerting/AlertReadRepository.java @@ -0,0 +1,9 @@ +package com.cameleer.server.core.alerting; + +import java.util.List; +import java.util.UUID; + +public interface AlertReadRepository { + void markRead(String userId, UUID alertInstanceId); + void bulkMarkRead(String userId, List alertInstanceIds); +} diff --git a/cameleer-server-core/src/main/java/com/cameleer/server/core/alerting/AlertRuleRepository.java b/cameleer-server-core/src/main/java/com/cameleer/server/core/alerting/AlertRuleRepository.java new file mode 100644 index 00000000..eecd8b1f --- /dev/null +++ b/cameleer-server-core/src/main/java/com/cameleer/server/core/alerting/AlertRuleRepository.java @@ -0,0 +1,23 @@ +package com.cameleer.server.core.alerting; + +import java.time.Instant; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; + +public interface AlertRuleRepository { + AlertRule save(AlertRule rule); // upsert by id + Optional findById(UUID id); + List listByEnvironment(UUID environmentId); + List findAllByOutboundConnectionId(UUID connectionId); + List findRuleIdsByOutboundConnectionId(UUID connectionId); // used by rulesReferencing() + void delete(UUID id); + + /** Claim up to batchSize rules whose next_evaluation_at <= now AND (claimed_until IS NULL OR claimed_until < now). + * Atomically sets claimed_by + claimed_until = now + ttl. Returns claimed rules. */ + List claimDueRules(String instanceId, int batchSize, int claimTtlSeconds); + + /** Release claim + bump next_evaluation_at. */ + void releaseClaim(UUID ruleId, Instant nextEvaluationAt, Map evalState); +} diff --git a/cameleer-server-core/src/main/java/com/cameleer/server/core/alerting/AlertSilenceRepository.java b/cameleer-server-core/src/main/java/com/cameleer/server/core/alerting/AlertSilenceRepository.java new file mode 100644 index 00000000..910ae767 --- /dev/null +++ b/cameleer-server-core/src/main/java/com/cameleer/server/core/alerting/AlertSilenceRepository.java @@ -0,0 +1,14 @@ +package com.cameleer.server.core.alerting; + +import java.time.Instant; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface AlertSilenceRepository { + AlertSilence save(AlertSilence silence); + Optional findById(UUID id); + List listActive(UUID environmentId, Instant when); + List listByEnvironment(UUID environmentId); + void delete(UUID id); +}