{-# OPTIONS_GHC -fno-warn-orphans #-} module Model.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)) import Resource (Resource, resourceCreatedAt, resourceDeletedAt, resourceEditedAt) instance Resource Income where resourceCreatedAt = _income_createdAt resourceEditedAt = _income_editedAt resourceDeletedAt = _income_deletedAt instance FromRow Income where fromRow = Income <$> SQLite.field <*> SQLite.field <*> SQLite.field <*> SQLite.field <*> SQLite.field <*> SQLite.field <*> SQLite.field list :: Query [Income] list = Query (\conn -> 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 <- 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 <- 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 )