{-# LANGUAGE OverloadedStrings #-} module Controller.Payment ( getPayments , createPayment , deleteOwnPayment ) where import Web.Scotty import Network.HTTP.Types.Status (ok200, badRequest400) import Database.Persist import Control.Monad.IO.Class (liftIO) import Data.Text (Text) import qualified Data.Text as T import qualified Data.Text.Lazy as TL import qualified Data.Aeson.Types as Json import qualified Secure import Json (jsonObject) import Model.Database import qualified Model.Payment as P import Model.Frequency import Model.Message.Key (Key(PaymentNotDeleted)) getPayments :: ActionM () getPayments = Secure.loggedAction (\_ -> do (liftIO $ runDb P.getPayments) >>= json ) createPayment :: Text -> Text -> Frequency -> ActionM () createPayment name cost frequency = Secure.loggedAction (\user -> do creationResult <- liftIO . runDb $ P.createPayment (entityKey user) name cost frequency case creationResult of Left errors -> do status badRequest400 jsonObject . map (\(a, b) -> (a, Json.String . T.pack . show $ b)) $ errors Right paymentId -> jsonObject [("id", Json.Number . fromIntegral . keyToInt64 $ paymentId)] ) deleteOwnPayment :: Text -> ActionM () deleteOwnPayment paymentId = Secure.loggedAction (\user -> do deleted <- liftIO . runDb $ P.deleteOwnPayment user (textToKey paymentId) if deleted then status ok200 else do status badRequest400 text . TL.pack . show $ PaymentNotDeleted )