{-# LANGUAGE OverloadedStrings #-} module Controller.Payment ( getPayments , getMonthlyPayments , createPayment , deletePayment , getPaymentsCount ) 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.Json.Number import Model.Message.Key (Key(PaymentNotDeleted)) getPayments :: ActionM () getPayments = Secure.loggedAction (\_ -> do (liftIO $ runDb P.getPunctualPayments) >>= json ) getMonthlyPayments :: ActionM () getMonthlyPayments = Secure.loggedAction (\user -> do (liftIO $ runDb (P.getUserMonthlyPayments (entityKey user))) >>= 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)] ) deletePayment :: Text -> ActionM () deletePayment 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 ) getPaymentsCount :: ActionM () getPaymentsCount = Secure.loggedAction (\_ -> do Number <$> (liftIO . runDb $ P.getPaymentsCount) >>= json )