module Persistence.PaymentCategory ( list , listByCategory , save ) where import qualified Data.Maybe as Maybe 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)) newtype Row = Row PaymentCategory instance FromRow Row where fromRow = Row <$> (PaymentCategory <$> SQLite.field <*> SQLite.field <*> SQLite.field <*> SQLite.field <*> SQLite.field) list :: Query [PaymentCategory] list = Query (\conn -> do map (\(Row pc) -> pc) <$> SQLite.query_ conn "SELECT * from payment_category" ) listByCategory :: CategoryId -> Query [PaymentCategory] listByCategory cat = Query (\conn -> do map (\(Row pc) -> pc) <$> SQLite.query conn "SELECT * FROM payment_category WHERE category = ?" (Only cat) ) save :: Text -> CategoryId -> Query PaymentCategory save newName categoryId = Query (\conn -> do now <- getCurrentTime paymentCategory <- fmap (\(Row pc) -> pc) . Maybe.listToMaybe <$> (SQLite.query conn "SELECT * FROM payment_category WHERE name = ?" (Only formattedNewName)) case paymentCategory of Just pc -> do SQLite.execute conn "UPDATE payment_category SET category = ?, edited_at = ? WHERE name = ?" (categoryId, now, formattedNewName) return $ PaymentCategory (_paymentCategory_id pc) formattedNewName categoryId (_paymentCategory_createdAt pc) (Just now) Nothing -> do SQLite.execute conn "INSERT INTO payment_category (name, category, created_at) VALUES (?, ?, ?)" (formattedNewName, categoryId, now) paymentCategoryId <- SQLite.lastInsertRowId conn return $ PaymentCategory paymentCategoryId formattedNewName categoryId now Nothing ) where formattedNewName = T.unaccent . T.toLower $ newName