{-# 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 Json (jsonId) import Model.Payment (PaymentId) import qualified Model.Json.CreatePayment as Json import qualified Model.Json.EditPayment as Json import qualified Model.Json.Payment as Json import qualified Model.Payment as Payment import qualified Model.PaymentCategory as PaymentCategory import qualified Model.Query as Query import qualified Model.User as User import qualified Secure list :: ActionM () list = Secure.loggedAction (\_ -> (liftIO . Query.run $ map Json.fromPayment <$> Payment.list) >>= json ) create :: Json.CreatePayment -> ActionM () create (Json.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 :: Json.EditPayment -> ActionM () editOwn (Json.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 )