{-# LANGUAGE OverloadedStrings #-} module Controller.Payment ( list , create , editOwn , deleteOwn ) where import Control.Monad.IO.Class (liftIO) import Network.HTTP.Types.Status (ok200, badRequest400) import Web.Scotty import qualified Common.Model.CreatePayment as M import qualified Common.Model.EditPayment as M import Common.Model (PaymentId, User(..)) import Json (jsonId) import qualified Model.Payment as Payment import qualified Model.PaymentCategory as PaymentCategory import qualified Model.Query as Query import qualified Secure list :: ActionM () list = Secure.loggedAction (\_ -> (liftIO . Query.run $ Payment.list) >>= json ) create :: M.CreatePayment -> ActionM () create (M.CreatePayment name cost date category frequency) = Secure.loggedAction (\user -> (liftIO . Query.run $ do PaymentCategory.save name category Payment.create (_user_id user) name cost date frequency ) >>= jsonId ) editOwn :: M.EditPayment -> ActionM () editOwn (M.EditPayment paymentId name cost date category frequency) = Secure.loggedAction (\user -> do updated <- liftIO . Query.run $ do edited <- Payment.editOwn (_user_id 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 :: PaymentId -> ActionM () deleteOwn paymentId = Secure.loggedAction (\user -> do deleted <- liftIO . Query.run $ Payment.deleteOwn (_user_id user) paymentId if deleted then status ok200 else status badRequest400 )