WorkflowEventOutbox.java

package org.hammer.audio.workflow.collaboration;

import java.util.List;
import java.util.Objects;

/** Transactional outbox abstraction for committed collaboration events. */
public interface WorkflowEventOutbox {

  OutboxEntry append(WorkflowCollaborationEvent event);

  List<OutboxEntry> pending();

  void markPublished(String entryId);

  /**
   * Stored outbox message.
   *
   * @param entryId unique outbox entry identifier
   * @param event committed event payload
   */
  record OutboxEntry(String entryId, WorkflowCollaborationEvent event) {
    public OutboxEntry {
      Objects.requireNonNull(entryId, "entryId");
      Objects.requireNonNull(event, "event");
      if (entryId.isBlank()) {
        throw new IllegalArgumentException("entryId must not be blank");
      }
    }
  }
}