module Persistence.Income ( list , create , editOwn , deleteOwn ) where import Data.Maybe (listToMaybe) import Data.Time.Calendar (Day) import Data.Time.Clock (getCurrentTime) import Database.SQLite.Simple (FromRow (fromRow), Only (Only)) import qualified Database.SQLite.Simple as SQLite import Prelude hiding (id) import Common.Model (Income (..), IncomeId, User (..), UserId) import Model.Query (Query (Query)) newtype Row = Row Income instance FromRow Row where fromRow = Row <$> (Income <$> SQLite.field <*> SQLite.field <*> SQLite.field <*> SQLite.field <*> SQLite.field <*> SQLite.field <*> SQLite.field) list :: Query [Income] list = Query (\conn -> map (\(Row i) -> i) <$> SQLite.query_ conn "SELECT * FROM income WHERE deleted_at IS NULL" ) create :: UserId -> Day -> Int -> Query IncomeId create incomeUserId incomeDate incomeAmount = Query (\conn -> do now <- getCurrentTime SQLite.execute conn "INSERT INTO income (user_id, date, amount, created_at) VALUES (?, ?, ?, ?)" (incomeUserId, incomeDate, incomeAmount, now) SQLite.lastInsertRowId conn ) editOwn :: UserId -> IncomeId -> Day -> Int -> Query Bool editOwn incomeUserId incomeId incomeDate incomeAmount = Query (\conn -> do mbIncome <- fmap (\(Row i) -> i) . listToMaybe <$> SQLite.query conn "SELECT * FROM income WHERE id = ?" (Only incomeId) case mbIncome of Just income -> if _income_userId income == incomeUserId then do now <- getCurrentTime SQLite.execute conn "UPDATE income SET edited_at = ?, date = ?, amount = ? WHERE id = ?" (now, incomeDate, incomeAmount, incomeId) return True else return False Nothing -> return False ) deleteOwn :: User -> IncomeId -> Query Bool deleteOwn user incomeId = Query (\conn -> do mbIncome <- fmap (\(Row i) -> i) . listToMaybe <$> SQLite.query conn "SELECT * FROM income WHERE id = ?" (Only incomeId) case mbIncome of Just income -> if _income_userId income == _user_id user then do now <- getCurrentTime SQLite.execute conn "UPDATE income SET deleted_at = ? WHERE id = ?" (now, incomeId) return True else return False Nothing -> return False )