packages feed

kiroku-store-migrations-0.2.0.0: src/Kiroku/Store/Migrations/New.hs

module Kiroku.Store.Migrations.New (
    AuthoringError,
    defaultMigrationsDir,
    newMigrationFile,
    migrationTemplate,
) where

import Data.ByteString (ByteString)
import Data.Text qualified as Text
import Data.Text.Encoding qualified as Text.Encoding
import Database.PostgreSQL.Migrate.Embed (
    AuthoringError,
    newMigration,
    newMigrationOptions,
 )
import System.FilePath ((</>))

defaultMigrationsDir :: FilePath
defaultMigrationsDir = "migrations"

newMigrationFile :: FilePath -> String -> IO (Either AuthoringError FilePath)
newMigrationFile migrationsDirectory description =
    case newMigrationOptions manifestPath Nothing (migrationTemplate description) of
        Left definitionError -> pure (Left definitionError)
        Right options -> newMigration options
  where
    manifestPath = migrationsDirectory </> "manifest"

migrationTemplate :: String -> ByteString
migrationTemplate description =
    Text.Encoding.encodeUtf8
        ( Text.unlines
            [ "-- " <> Text.pack description
            , ""
            , "-- Kiroku migrations are forward-only and applied exactly once by pg-migrate."
            , "-- Qualify every object with the kiroku schema and append corrections"
            , "-- as new manifest entries instead of editing released payloads."
            , ""
            ]
        )