{-# OPTIONS_GHC -fno-warn-orphans #-} module Model.PaymentCategory ( list , listByCategory , save ) where import Data.Maybe (isJust, listToMaybe) import Data.Text (Text) import qualified Data.Text as T import Data.Time.Clock (getCurrentTime) import Database.SQLite.Simple (FromRow (fromRow), Only (Only)) import qualified Database.SQLite.Simple as SQLite import Common.Model (CategoryId, PaymentCategory (..)) import qualified Common.Util.Text as T import Model.Query (Query (Query)) instance FromRow PaymentCategory where fromRow = PaymentCategory <$> SQLite.field <*> SQLite.field <*> SQLite.field <*> SQLite.field <*> SQLite.field list :: Query [PaymentCategory] list = Query (\conn -> SQLite.query_ conn "SELECT * from payment_category") listByCategory :: CategoryId -> Query [PaymentCategory] listByCategory cat = Query (\conn -> SQLite.query conn "SELECT * FROM payment_category WHERE category = ?" (Only cat) ) save :: Text -> CategoryId -> Query () save newName categoryId = Query (\conn -> do now <- getCurrentTime mbPaymentCategory <- listToMaybe <$> (SQLite.query conn "SELECT * FROM payment_category WHERE name = ?" (Only (formatPaymentName newName)) :: IO [PaymentCategory]) if isJust mbPaymentCategory then SQLite.execute conn "UPDATE payment_category SET category = ?, edited_at = ? WHERE name = ?" (categoryId, now, formatPaymentName newName) else do SQLite.execute conn "INSERT INTO payment_category (name, category, created_at) VALUES (?, ?, ?)" (formatPaymentName newName, categoryId, now) ) where formatPaymentName :: Text -> Text formatPaymentName = T.unaccent . T.toLower