aboutsummaryrefslogtreecommitdiff
path: root/src/server/Controller/Payment.hs
blob: 85e2a87392785cd5966aa60e9f0a29d9254b0ff6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
{-# LANGUAGE OverloadedStrings #-}

module Controller.Payment
  ( getPaymentsAction
  , getMonthlyPaymentsAction
  , createPaymentAction
  , deletePaymentAction
  , getTotalPaymentsAction
  , getPaymentsCountAction
  ) 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.Aeson.Types as Json

import qualified Secure

import Model.Database
import Model.Payment
import Model.Frequency
import Model.Json.Number
import qualified Model.Json.PaymentId as JP
import Model.Message
import Model.Message.Key (Key(PaymentNotDeleted))


import Json (jsonObject)

getPaymentsAction :: Int -> Int -> ActionM ()
getPaymentsAction page perPage =
  Secure.loggedAction (\_ -> do
    (liftIO $ runDb (getPunctualPayments page perPage)) >>= json
  )

getMonthlyPaymentsAction :: ActionM ()
getMonthlyPaymentsAction =
  Secure.loggedAction (\user -> do
    (liftIO $ runDb (getUserMonthlyPayments (entityKey user))) >>= json
  )

createPaymentAction :: Text -> Int -> Frequency -> ActionM ()
createPaymentAction name cost frequency =
  Secure.loggedAction (\user -> do
    paymentId <- liftIO . runDb $ createPayment (entityKey user) name cost frequency
    json (JP.PaymentId paymentId)
  )

deletePaymentAction :: Text -> ActionM ()
deletePaymentAction paymentId =
  Secure.loggedAction (\user -> do
    deleted <- liftIO . runDb $ deleteOwnPayment user (textToKey paymentId)
    if deleted
      then
        status ok200
      else do
        status badRequest400
        jsonObject [("error", Json.String $ getMessage PaymentNotDeleted)]
  )

getTotalPaymentsAction :: ActionM ()
getTotalPaymentsAction =
  Secure.loggedAction (\_ -> do
    (liftIO . runDb $ getTotalPayments) >>= json
  )

getPaymentsCountAction :: ActionM ()
getPaymentsCountAction =
  Secure.loggedAction (\_ -> do
    Number <$> (liftIO . runDb $ getPaymentsCount) >>= json
  )