CollaborationWorkflowHistoryAccessPolicy.java

package org.hammer.audio.infrastructure.workflow.history;

import java.util.Objects;
import org.hammer.audio.workflow.collaboration.WorkflowSessionRegistry;
import org.hammer.audio.workflow.history.WorkflowHistoryAccessException;
import org.hammer.audio.workflow.history.WorkflowHistoryAccessPolicy;

/** Blocks branch restoration while a collaboration session actively uses the same workflow. */
public final class CollaborationWorkflowHistoryAccessPolicy implements WorkflowHistoryAccessPolicy {

  private final WorkflowSessionRegistry sessionRegistry;

  /** Creates a restore policy backed by current server-authoritative session membership. */
  public CollaborationWorkflowHistoryAccessPolicy(WorkflowSessionRegistry sessionRegistry) {
    this.sessionRegistry = Objects.requireNonNull(sessionRegistry, "sessionRegistry");
  }

  @Override
  public void assertRestoreAllowed(String branch, String workflowId) {
    boolean active =
        sessionRegistry.sessions().stream()
            .anyMatch(
                session ->
                    session.workflowId().equals(workflowId) && !session.participants().isEmpty());
    if (active) {
      throw new WorkflowHistoryAccessException(
          branch,
          workflowId,
          "Cannot restore workflow "
              + workflowId
              + " while a collaboration session still has joined participants");
    }
  }
}