packages feed

keiro-migrations-0.2.0.0: src/Keiro/Migrations/LegacyCodd.hs

{-# LANGUAGE TemplateHaskell #-}

{- | Transitional Codd-only tools retained for expected-schema snapshots,
remediation drills, and historical ledger fixups.

Normal migration execution uses 'Keiro.Migrations' and does not build this
module unless the @legacy-codd-tools@ Cabal flag is enabled.
-}
module Keiro.Migrations.LegacyCodd (
    LedgerSchema (..),
    MigrationStatus (..),
    VerifyOutcome (..),
    embeddedMigrationNames,
    embeddedMigrationSources,
    kirokuEmbeddedMigrationNames,
    migrationStatus,
    missingMigrations,
    runAllKeiroMigrations,
    runAllKeiroMigrationsNoCheck,
    runKirokuMigrationsNoCheck,
    verifySchema,
) where

import Codd (ApplyResult, CoddSettings (..), VerifySchemas)
import Codd.Extras.Ledger (LedgerSchema (..), MigrationStatus (..), VerifyOutcome (..))
import Codd.Extras.MigrationSet (MigrationSet)
import Codd.Extras.MigrationSet qualified as MigrationSet
import Control.Monad (void)
import Data.ByteString (ByteString)
import Data.FileEmbed (embedDir)
import Data.Foldable (toList)
import Data.Map.Strict qualified as Map
import Data.Time (DiffTime)
import Keiro.Migrations.ExpectedSchema (expectedSchemaFiles)
import Keiro.Migrations.History.Codd (keiroLegacyMigrationNames)
import Kiroku.Store.Migrations.History.Codd qualified as Kiroku

runAllKeiroMigrations :: CoddSettings -> DiffTime -> VerifySchemas -> IO ApplyResult
runAllKeiroMigrations settings connectTimeout verifySchemas =
    MigrationSet.applyMigrationSets settings connectTimeout verifySchemas frameworkMigrationSets

runAllKeiroMigrationsNoCheck :: CoddSettings -> DiffTime -> IO ()
runAllKeiroMigrationsNoCheck settings connectTimeout =
    void $ MigrationSet.applyMigrationSetsNoCheck settings connectTimeout frameworkMigrationSets

runKirokuMigrationsNoCheck :: CoddSettings -> DiffTime -> IO ()
runKirokuMigrationsNoCheck settings connectTimeout =
    void $ MigrationSet.applyMigrationSetNoCheck settings connectTimeout kirokuMigrationSet

verifySchema :: CoddSettings -> DiffTime -> IO VerifyOutcome
verifySchema =
    MigrationSet.verifyExpectedSchema
        expectedLedgerNames
        MigrationSet.ExpectedSchema
            { MigrationSet.label = "keiro-expected-schema"
            , MigrationSet.files = expectedSchemaFiles
            }

missingMigrations :: CoddSettings -> DiffTime -> IO [FilePath]
missingMigrations settings connectTimeout =
    MigrationSet.missingMigrationsForNames expectedLedgerNames (migsConnString settings) connectTimeout

migrationStatus :: CoddSettings -> DiffTime -> IO MigrationStatus
migrationStatus settings connectTimeout =
    MigrationSet.migrationStatusForNames expectedLedgerNames (migsConnString settings) connectTimeout

frameworkMigrationSets :: [MigrationSet]
frameworkMigrationSets =
    [ kirokuMigrationSet
    , keiroMigrationSet
    ]

kirokuMigrationSet :: MigrationSet
kirokuMigrationSet =
    MigrationSet.MigrationSet
        { MigrationSet.label = "Kiroku legacy evidence"
        , MigrationSet.files = sourceFiles Kiroku.kirokuLegacyMigrationNames Kiroku.kirokuCoddSourcePayloads
        }

keiroMigrationSet :: MigrationSet
keiroMigrationSet =
    MigrationSet.MigrationSet
        { MigrationSet.label = "Keiro legacy evidence"
        , MigrationSet.files = embeddedMigrationFiles
        }

sourceFiles ::
    (Foldable collection) =>
    collection FilePath ->
    Map.Map FilePath ByteString ->
    [(FilePath, ByteString)]
sourceFiles names payloads =
    [ (name, requirePayload name)
    | name <- toList names
    ]
  where
    requirePayload name =
        case Map.lookup name payloads of
            Just payload -> payload
            Nothing -> error ("missing checked-in legacy payload for " <> name)

embeddedMigrationFiles :: [(FilePath, ByteString)]
embeddedMigrationFiles = $(embedDir "sql-migrations")

embeddedMigrationSources :: [(FilePath, ByteString)]
embeddedMigrationSources = embeddedMigrationFiles

embeddedMigrationNames :: [FilePath]
embeddedMigrationNames =
    MigrationSet.migrationNames keiroMigrationSet

kirokuEmbeddedMigrationNames :: [FilePath]
kirokuEmbeddedMigrationNames =
    MigrationSet.migrationNames kirokuMigrationSet

expectedLedgerNames :: [FilePath]
expectedLedgerNames =
    MigrationSet.migrationNamesForSets frameworkMigrationSets