WorkflowSessionEntity.java

package org.hammer.audio.infrastructure.workflow.collaboration.store;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.Id;
import jakarta.persistence.Index;
import jakarta.persistence.Lob;
import jakarta.persistence.Table;
import jakarta.persistence.Version;
import java.time.Instant;
import org.hammer.audio.workflow.collaboration.CollaborationMode;
import org.hammer.audio.workflow.collaboration.OperationActor;
import org.hammer.audio.workflow.collaboration.store.StoredWorkflowSession;

/** Hibernate-owned durable collaboration-session aggregate. */
@Entity
@Table(
    name = "workflow_collaboration_session",
    indexes = {
      @Index(name = "idx_workflow_session_open", columnList = "session_closed"),
      @Index(name = "idx_workflow_session_workflow", columnList = "workflow_id")
    })
public class WorkflowSessionEntity {

  @Id
  @Column(name = "session_id", nullable = false, length = 255)
  private String storedSessionId;

  @Version
  @Column(name = "lock_version", nullable = false)
  private long lockVersion;

  @Enumerated(EnumType.STRING)
  @Column(name = "collaboration_mode", nullable = false, length = 64)
  private CollaborationMode mode;

  @Column(name = "owner_actor_id", nullable = false, length = 255)
  private String ownerActorId;

  @Column(name = "owner_user_id", nullable = false, length = 255)
  private String ownerUserId;

  @Column(name = "owner_display_name", nullable = false, length = 1024)
  private String ownerDisplayName;

  @Column(name = "created_at", nullable = false)
  private Instant createdAt;

  @Column(name = "workflow_id", nullable = false, length = 255)
  private String storedWorkflowId;

  @Lob
  @Column(name = "workflow_dsl", nullable = false)
  private String storedWorkflowDsl;

  @Column(name = "semantic_revision", nullable = false)
  private long storedSemanticRevision;

  @Column(name = "event_sequence", nullable = false)
  private long storedEventSequence;

  @Column(name = "session_closed", nullable = false)
  private boolean sessionClosed;

  protected WorkflowSessionEntity() {
    // Required by Jakarta Persistence.
  }

  static WorkflowSessionEntity from(StoredWorkflowSession stored) {
    WorkflowSessionEntity entity = new WorkflowSessionEntity();
    entity.storedSessionId = stored.sessionId();
    entity.mode = stored.mode();
    entity.ownerActorId = stored.owner().actorId();
    entity.ownerUserId = stored.owner().userId();
    entity.ownerDisplayName = stored.owner().displayName();
    entity.createdAt = stored.createdAt();
    entity.storedWorkflowId = stored.workflowId();
    entity.storedWorkflowDsl = stored.workflowDsl();
    entity.storedSemanticRevision = stored.revision();
    entity.storedEventSequence = stored.sequence();
    entity.sessionClosed = stored.closed();
    return entity;
  }

  StoredWorkflowSession toStoredSession() {
    return new StoredWorkflowSession(
        storedSessionId,
        mode,
        new OperationActor(ownerActorId, ownerUserId, ownerDisplayName),
        createdAt,
        storedWorkflowId,
        storedWorkflowDsl,
        storedSemanticRevision,
        storedEventSequence,
        sessionClosed);
  }

  void applyAcceptedOperation(
      String updatedWorkflowId,
      String updatedWorkflowDsl,
      long updatedRevision,
      long updatedSequence) {
    this.storedWorkflowId = updatedWorkflowId;
    this.storedWorkflowDsl = updatedWorkflowDsl;
    this.storedSemanticRevision = updatedRevision;
    this.storedEventSequence = updatedSequence;
  }

  void advanceEventSequence(long updatedSequence) {
    this.storedEventSequence = updatedSequence;
  }

  void markClosed(long updatedSequence) {
    this.storedEventSequence = updatedSequence;
    this.sessionClosed = true;
  }

  String sessionId() {
    return storedSessionId;
  }

  String workflowId() {
    return storedWorkflowId;
  }

  String workflowDsl() {
    return storedWorkflowDsl;
  }

  long semanticRevision() {
    return storedSemanticRevision;
  }

  long eventSequence() {
    return storedEventSequence;
  }

  boolean closed() {
    return sessionClosed;
  }
}