aboutsummaryrefslogtreecommitdiff
path: root/server/src/Controller/Payment.hs
blob: c700240659a9a5027a4f0be14d470716a3fd3c23 (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
78
79
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 (..),
                                              EditPayment (..), Payment (..),
                                              PaymentId, SavedPayment (..),
                                              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 $ SavedPayment 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
    result <- liftIO . Query.run $ do
      editedPayment <- PaymentPersistence.edit (_user_id user) paymentId name cost date frequency
      case editedPayment of
        Just p -> do
          pc <- PaymentCategoryPersistence.save name category
          PaymentCategoryPersistence.deleteIfUnused name
          return $ Just (p, pc)
        Nothing ->
          return Nothing
    case result of
      Just (p, pc) ->
        json $ SavedPayment p pc
      Nothing ->
        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
  )