{-# LANGUAGE OverloadedStrings #-} module Model.Payment ( getPayments , getMonthlyPayments , createPayment , deleteOwnPayment ) where import Data.Text (Text) import Data.Time.Clock (getCurrentTime) import Control.Monad.IO.Class (liftIO) import Database.Persist import Model.Database import Model.Frequency import qualified Model.Json.Payment as P getPayments :: Persist [P.Payment] getPayments = map getJsonPayment <$> selectList [ PaymentDeletedAt ==. Nothing ] [ Desc PaymentCreation ] getMonthlyPayments :: Persist [Entity Payment] getMonthlyPayments = selectList [ PaymentDeletedAt ==. Nothing , PaymentFrequency ==. Monthly ] [ Desc PaymentName ] getJsonPayment :: Entity Payment -> P.Payment getJsonPayment paymentEntity = let payment = entityVal paymentEntity in P.Payment { P.id = entityKey paymentEntity , P.creation = paymentCreation payment , P.name = paymentName payment , P.cost = paymentCost payment , P.userId = paymentUserId payment , P.frequency = paymentFrequency payment } createPayment :: UserId -> Text -> Int -> Frequency -> Persist PaymentId createPayment userId name cost frequency = do now <- liftIO getCurrentTime insert (Payment userId now name cost Nothing frequency) deleteOwnPayment :: Entity User -> PaymentId -> Persist Bool deleteOwnPayment user paymentId = do mbPayment <- get paymentId case mbPayment of Just payment -> if paymentUserId payment == entityKey user then do now <- liftIO getCurrentTime update paymentId [PaymentDeletedAt =. Just now] return True else return False Nothing -> return False