{-# LANGUAGE EmptyDataDecls #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE QuasiQuotes #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE TypeFamilies #-} module Model.Database where import Control.Monad.Logger (NoLoggingT, runNoLoggingT) import Control.Monad.Trans.Resource (runResourceT, ResourceT) import Data.Text import Data.Time.Clock (UTCTime) import Data.Int (Int64) import Database.Persist.Sqlite import Database.Persist.TH import Model.Frequency import Model.JobKind share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase| User creation UTCTime email Text name Text UniqUserEmail email UniqUserName name deriving Show Payment userId UserId creation UTCTime name Text cost Int deletedAt UTCTime Maybe frequency Frequency deriving Show SignIn token Text creation UTCTime email Text UniqSignInToken token deriving Show Job kind JobKind lastExecution UTCTime Maybe lastCheck UTCTime Maybe UniqJobName kind deriving Show Income userId UserId creation UTCTime amount Int deriving Show |] type Persist a = SqlPersistT (ResourceT (NoLoggingT IO)) a runDb :: Persist a -> IO a runDb = runNoLoggingT . runResourceT . withSqliteConn "database" . runSqlConn runMigrations :: IO () runMigrations = runDb $ runMigration migrateAll textToKey :: (ToBackendKey SqlBackend a) => Text -> Key a textToKey text = toSqlKey (read (unpack text) :: Int64)