packages feed

clickhouse-migrate-0.1.0.0: src/ClickHouseMigrate/Internal/LedgerTypes.hs

-- | Private ledger protocol. No unchecked construction is exported publicly.
module ClickHouseMigrate.Internal.LedgerTypes where

import ClickHouseMigrate.Prelude
import ClickHouseMigrate.Target (LedgerId, QueryId, TargetKey)
import Data.Word (Word64)

-- Tokens contain observations, never authority to mutate.
data AttemptId = AttemptId !Text deriving stock (Eq, Ord, Show)

data AppendReceipt = AppendReceipt !TargetKey !LedgerId !Word64 !Text !Text !QueryId deriving stock (Eq, Show)

data Reconciliation = PresentIdentical | Conflicting | NotObserved deriving stock (Eq, Show)

data LedgerPosition = LedgerPosition !LedgerId !Word64 !Text deriving stock (Eq, Ord, Show)

data ExpectedLedgerState = ExpectAbsent !TargetKey | ExpectPosition !LedgerPosition deriving stock (Eq, Show)

data AuditContext = AuditContext !Text !Text ![Text] deriving stock (Eq, Show)

data QuiescenceEvidence = QuiescenceEvidence !TargetKey !AuditContext deriving stock (Eq, Show)

data InitializationAuthorization = InitializationAuthorization !TargetKey !LedgerId !AuditContext deriving stock (Eq, Show)

data EvidenceLevel = OperatorAttestation | PredecessorChecksum deriving stock (Eq, Ord, Show)

data Evidence = Evidence !EvidenceLevel ![Text] deriving stock (Eq, Show)

data LedgerError
  = InvalidPosition
  | InvalidAudit
  | InvalidEvidence
  | InvalidEvent
  | UnsupportedLedgerVersion
  | SequenceGap
  | SequenceConflict
  | EventIdentityConflict
  | LedgerIdentityMismatch
  | MissingInitialization
  | ImpossibleTransition
  | DefinitionMismatch
  | InvalidLedgerSchema
  | UnsupportedLedgerStorage
  | LedgerAbsent
  | LedgerUninitialized
  | InitializationNotAuthorized
  | StaleLedgerState
  | UnresolvedHistory
  | OutstandingRequests
  | LedgerLimitExceeded
  deriving stock (Eq, Ord, Show)

data Definition = Definition
  { ordinal :: !Int,
    componentIndex :: !Int,
    component :: !Text,
    dependencies :: ![Text],
    migration :: !Text,
    checksum :: !Text,
    steps :: ![StepDefinition]
  }
  deriving stock (Eq, Show)

data StepDefinition = StepDefinition !Text !Text deriving stock (Eq, Show)

data FailureEvidence = FailureEvidence !Text !(Maybe Int) !(Maybe Int) deriving stock (Eq, Show)

data RecoveryAction = Resume | RetryStep !Int | AcceptStep !Int | Finalize deriving stock (Eq, Show)

data Recovery = Recovery !RecoveryAction !LedgerPosition !Text !Text !QuiescenceEvidence deriving stock (Eq, Show)

data AdoptionBatch = AdoptionBatch !Text !Text !Text !Text !Int deriving stock (Eq, Show)

data EventBody
  = Initialize !TargetKey
  | StartMigration !Definition
  | StartStep !Int !Text
  | SucceedStep !Int !Text
  | FailStep !Int !Text !FailureEvidence
  | CompleteMigration
  | AuthorizeRecovery !Recovery
  | AcceptCompletion !Int !Evidence
  | StartAdoption !AdoptionBatch
  | AdoptEntry !Definition !Evidence
  | CompleteAdoption !Text
  deriving stock (Eq, Show)

data EventContext = EventContext !Text !Text !Text !(Maybe (Text, Text)) deriving stock (Eq, Show)

data LedgerEvent = LedgerEvent
  { sequence :: !Word64,
    eventId :: !Text,
    ledgerId :: !LedgerId,
    runId :: !Text,
    attemptId :: !(Maybe Text),
    occurredAt :: !Text,
    audit :: !AuditContext,
    runnerVersion :: !Text,
    context :: !(Maybe EventContext),
    body :: !EventBody
  }
  deriving stock (Eq, Show)

data StepState = NeverStarted | Started !Text | Succeeded !Text | Failed !Text !FailureEvidence | Accepted !Evidence
  deriving stock (Eq, Show)

data MigrationState = Applied | Adopted deriving stock (Eq, Show)

data RecordedMigration = RecordedMigration !Definition !MigrationState ![StepState] deriving stock (Eq, Show)

data ActiveMigration = ActiveMigration !Definition !Text ![StepState] !(Maybe RecoveryAction) deriving stock (Eq, Show)

data ActiveAdoption = ActiveAdoption !AdoptionBatch ![RecordedMigration] deriving stock (Eq, Show)

data Projection = Projection
  { position :: !LedgerPosition,
    target :: !TargetKey,
    completed :: ![RecordedMigration],
    active :: !(Maybe ActiveMigration),
    adoption :: !(Maybe ActiveAdoption),
    events :: ![LedgerEvent]
  }
  deriving stock (Eq, Show)