module Refurb
( refurbMain
, module Refurb.MigrationUtils
, module Refurb.Types
) where
import ClassyPrelude
import Control.Monad.Logger (LogLevel(LevelDebug), filterLogger, logDebug, runStdoutLoggingT)
import qualified Database.PostgreSQL.Simple as PG
import qualified Options.Applicative as OA
import Refurb.Cli (Command(CommandMigrate, CommandShowLog, CommandShowMigration, CommandBackup), Opts(Opts, debug, command, configFile), optsParser)
import Refurb.MigrationUtils
import Refurb.Run.Backup (backup)
import Refurb.Run.Internal (Context(Context))
import Refurb.Run.Info (showMigration, showLog)
import Refurb.Run.Migrate (migrate)
import Refurb.Store (isSchemaPresent, initializeSchema)
import Refurb.Types
refurbMain :: (FilePath -> IO ConnInfo) -> [Migration] -> IO ()
refurbMain readConnInfo migrations = do
opts@(Opts {..}) <- OA.execParser optsParser
connInfo <- readConnInfo configFile
let logFilter = if debug
then \ _ _ -> True
else \ _ lvl -> lvl > LevelDebug
runStdoutLoggingT . filterLogger logFilter $ do
$logDebug $ "Connecting to " <> tshow (connInfoAsLogString connInfo)
bracket (liftBase . PG.connectPostgreSQL $ connInfoAsConnString connInfo) (liftBase . PG.close) $ \ conn -> do
let context = Context opts conn connInfo migrations
unlessM (isSchemaPresent conn) $ initializeSchema conn
void . liftIO $ PG.execute_ conn "set search_path = 'public'"
flip runReaderT context $
case command of
CommandMigrate goNoGo backupMay installSeedData ->
migrate goNoGo backupMay installSeedData
CommandShowLog ->
showLog
CommandShowMigration key ->
showMigration key
CommandBackup path ->
backup path