{-# LANGUAGE OverloadedStrings #-} module Controller.Payment ( list , create , editOwn , deleteOwn ) where import Control.Monad.IO.Class (liftIO) import Data.Text (Text) import Database.Persist import Network.HTTP.Types.Status (ok200, badRequest400) import Web.Scotty import Json (jsonId) import Model.Database import qualified Model.Json.CreatePayment as Json import qualified Model.Json.EditPayment as Json import qualified Model.Payment as Payment import qualified Model.PaymentCategory as PaymentCategory import qualified Secure list :: ActionM () list = Secure.loggedAction (\_ -> (liftIO $ runDb Payment.list) >>= json ) create :: Json.CreatePayment -> ActionM () create (Json.CreatePayment name cost date category frequency) = Secure.loggedAction (\user -> (liftIO . runDb $ do PaymentCategory.save name category Payment.create (entityKey user) name cost date frequency ) >>= jsonId ) editOwn :: Json.EditPayment -> ActionM () editOwn (Json.EditPayment paymentId name cost date category frequency) = Secure.loggedAction (\user -> do updated <- liftIO . runDb $ do edited <- Payment.editOwn (entityKey user) paymentId name cost date frequency _ <- if edited then PaymentCategory.save name category >> return () else return () return edited if updated then status ok200 else status badRequest400 ) deleteOwn :: Text -> ActionM () deleteOwn paymentId = Secure.loggedAction (\user -> do deleted <- liftIO . runDb $ Payment.deleteOwn (entityKey user) (textToKey paymentId) if deleted then status ok200 else status badRequest400 )