{-# 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 share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase| User creation UTCTime email Text name Text UniqEmail email UniqName 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 isUsed Bool UniqToken token 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)