module Controller.Payment ( list , create , edit , delete ) where import Control.Monad.IO.Class (liftIO) import qualified Network.HTTP.Types.Status as Status import Web.Scotty hiding (delete) import Common.Model (CreatePayment (..), CreatedPayment (..), EditPayment (..), Payment (..), PaymentId, User (..)) import qualified Model.Query as Query import qualified Persistence.Payment as PaymentPersistence import qualified Persistence.PaymentCategory as PaymentCategoryPersistence import qualified Secure import qualified Validation.CreatePayment as CreatePaymentValidation list :: ActionM () list = Secure.loggedAction (\_ -> (liftIO . Query.run $ PaymentPersistence.listActive) >>= json ) create :: CreatePayment -> ActionM () create createPayment@(CreatePayment name cost date category frequency) = Secure.loggedAction (\user -> case CreatePaymentValidation.validate createPayment of Nothing -> (liftIO . Query.run $ do pc <- PaymentCategoryPersistence.save name category p <- PaymentPersistence.create (_user_id user) name cost date frequency return $ CreatedPayment p pc ) >>= json Just validationError -> do status Status.badRequest400 json validationError ) edit :: EditPayment -> ActionM () edit (EditPayment paymentId name cost date category frequency) = Secure.loggedAction (\user -> do updated <- liftIO . Query.run $ do edited <- PaymentPersistence.edit (_user_id user) paymentId name cost date frequency _ <- if edited then PaymentCategoryPersistence.save name category >> return () else return () return edited if updated then status Status.ok200 else status Status.badRequest400 ) delete :: PaymentId -> ActionM () delete paymentId = Secure.loggedAction (\user -> do deleted <- liftIO . Query.run $ do payment <- PaymentPersistence.find paymentId case payment of Just p | _payment_user p == _user_id user -> do PaymentPersistence.delete (_user_id user) paymentId PaymentCategoryPersistence.deleteIfUnused (_payment_name p) return True _ -> return False if deleted then status Status.ok200 else status Status.badRequest400 )